
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
分布式编程开发技术随着互联网的不断发展而被越来越多的程序员掌握,今天我们就通过案例分析来简单了解一下,分布式系统应用部署基础知识分享。
1.什么是分布式系统?
简单的来说,一个分布式系统是一组计算机系统一起工作,在终端用户看来,就像一台计算机在工作一样。
这组一起工作的计算机,拥有共享的状态,他们同时运行,独立机器的故障不会影响整个系统的正常运行。
我们现在举个例子,传统的数据库是存储在一台机器的文件系统上的。每当我们取出或者插入信息的时候,我们直接和那台机器进行交互。
那么现在我们把这个传统的数据库设计成分布式数据库。假设我们使用了三台机器来构建这台分布式数据库,我们追求的结果是,在机器1上插入一条记录,需要在机器3上可以返回那条记录,当然了,机器1和2也要能够返回这条记录。
2.为什么要用分布式系统?
管理分布式系统是一个非常复杂的话题,里面充满了陷阱和地雷。部署维护和调试分布式系统也是非常头疼的一件事情,那为什么还要去做呢?
分布式系统大的好处就是能够让你横向的扩展系统。
以前面提到的单一数据库为例,能够处理更多流量的方式就是升级数据库运行的硬件,这就是纵向扩展。
而纵向扩展的是有局限性的。当到了一定程度以后,我们会发现即使好的硬件,也不能够满足当前流量的需求。
横向扩展是指通过增加更多的机器来提升整个系统的性能,而不是靠升级单台计算机的硬件。
从价格上来说,横向扩展相比纵向扩展更容易控制。
根本的问题是纵向扩展有很强的局限性,达到新硬件的能力以后,还是无法满足中等或者大型工作负载的技术要求。
横向扩展则没有这个限制,它没有上限,每当性能下降的时候,你就需要增加一台机器,这样理论上讲可以达到无限大的工作负载支持。
除此之外,在容错和低延迟上也有很多优势。容错性是指你的分布式系统的某个节点出现错误以后,并不会导致整个系统的瘫痪。而单机系统出错以后,可能会导致整个系统的崩溃。
低延迟是通过在不同的物理位置部署不同的机器,通过就近获取的原则降低访问的延迟时间。
上面讨论了分布式系统的种种好处,但是我们必须要清楚设计和运行分布式系统并非易事。
3.分布式系统设计推演
我们先讲一个场景,我们现有的网络应用变得越来越流行,服务的人数也越来越多,导致我们的应用程序每秒收到的请求,远远超过能够正常处理的数量。这会导致应用程序性能下降明显,用户也会注意到这一点。
那我们下面就来扩展一下我们的应用程序来满足更高的要求。一般来说我们读取信息的频率要远远超过插入或者修改的频率。
下面我们使用主从复制策略来实现扩展系统。我们可以创建两个新的数据库服务器,他们与主服务器同步。用户业务对这两个新的数据库只能读取。每次当向主数据库插入和修改信息时,都会异步的通知副本数据库进行更新变化。
在这一步上我们已经有了三倍于原来系统读取数据的性能支持。但是这里有一个问题,在数据库事务的设计当中,我们遵循ACID原则。但是在我们同时对其他两个数据库进行数据更新的时候,我们有一个时间窗口失去了一致性原则。如果在这个时间窗口内对两个新的数据库进行查询,可能查不到数据。这个时候如果同步这三个数据库的数据,就会影响写操作的性能。
这是我们在设计分布式系统的时候,不得不承受的一些代价。
上面的主从复制策略解决了用户读取性能方面的需求,但是当数据量达到一定程度,一台机子上无法存放的时候,我们需要扩展写操作性能。要解决这样的问题,我们可以使用分区技术。分区技术是指根据特定的算法,比如用户名a到z作为不同的分区,分别指向不同的数据库写入,每个写入数据库会有若干读取的从数据库进行同步提升读取性能。
当然,这样使得整套系统变得更加复杂。重要的难点是分区算法。你们试想一下,如果c开头的用户名比其他开头的用户名要多很多,这会导致c区的数据量非常庞大,相应地,对于c区的请求也会远远大于其他区。此时c区成为热点。要避免热点,需要对c区进行拆分。此时要进行共享数据就会变得非常昂贵,甚至可能导致停机。
如果一切都很理想,那我们就拥有了n倍的写入流量,n是分区的数目。
当然这里也存在一个陷阱,我们进行数据分区以后,导致除了分区键以外的查询都变得非常低效,尤其是对于sql语句如join查询就变得非常之糟糕,导致一些复杂的查询根本无法使用。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。