一主多从、读写分离、负载均衡、分布式

这几个概念一般是指提高数据库系统性能和稳定性的手段,当然也不一定非要套用在数据库系统上,对于任何基于网络的应用系统,比如Web服务之类的,都可以采用这些手段来优化。

我们假设以数据库服务为例,最简单的数据库服务架构就是由一台数据库服务器提供所有的增删查改服务,这是最方便、最稳定,同时也是最容易实现的架构。但随着业务的发展,单一的服务器通常会遇到性能瓶颈,往往不能满足系统的需求。这时候提升服务器的硬件配置,比如扩展内存,更换最新型号的CPU等等,的确是一个解决问题的方案,但不是长久之计,因为业务需求和数据量通常总是持续增长的,而单一服务器的硬件装备能力却是有上限的。

另外,单一服务器的架构也会存在安全性问题,如果这台服务器因为故障损坏,或者被非法侵入,病毒感染等等,那么就有可能给整个业务系统带来毁灭性的灾难。为了解决这些问题,就需要更多的技术手段来实现:

一主多从

一主多从从字面上理解,就是指在配备一台主服务器的同时,再增加若干台从服务器,主服务器与从服务器的内容完全相同。当发生增删改等操作时,需要对这主服务器与从服务器之间的数据进行同步。

这种架构的好处是,主服务器相当于多了几台备份,特别是有的服务器部署在异地时,等于是做了异地备份,对数据安全性的保障有了显著的提高。当主服务器发生故障时,任意一台从服务器都能立即接替主服务器的工作,保证业务系统的正常运行。

一主多从设计的难点在数据同步方面,一般有两种同步方式,即实时同步和非实时同步。实时同步要求在每一次数据变化时,都能立即同步所有服务器上的数据,而非实时同步则是在一个固定的时间,比如凌晨业务量较小的时候同步数据。两种方式各有优缺点,前者能保证数据的实时性,但对系统性能要求更高,各种异常情况下如何保证数据同步的正确完成的实现难度也更大。而后者实现相对容易,对系统造成的负担也比较小,但实时性差的缺点也很明显。

两种同步方式其实也无所谓好坏,要根据具体的应用场合来决定。比如对实时性要求比较高的场合,像论坛,在线游戏等应用,就应该保证实时性。而像新闻发布类的偏静态应用,则可以采用非实时同步的方式,以节省硬件资源。

另外,也可以采用两种方式相结合的工作模式,比如近期数据,或者需要实时反馈的数据就要保证能够实时同步,而历史数据或者统计结算数据则可以用非实时同步的方式。

读写分离

读写分离也很好理解,一般的应用系统,特别是像新闻类的网站,对数据读取的需求远大于数据修改的需求。那么,可以部署两台服务器,一台提供所有的数据增删查改服务,另一台则只提供数据读取的服务,并且当数据发生变化时,自动同步两台服务器的数据。

这么做的好处就是将读操作和写操作分开了,一是相当于实现了双机热备份,提高了系统稳定性,读服务器崩溃时,写服务器能够接替它的工作。而当写服务器崩溃时,读服务器至少还能保证系统的访问。

由于多数系统的主要压力都在读取操作上,这种设计就会把大量的负担放在了读服务器上,对读服务器的性能要求就会比较高。为了解决这个问题,可以部署多个读服务器,来分担这种压力。另外,读服务器的设计,不一定非要采用数据库架构,比如有些数据会被反复频繁读取,这时候可以把这部分数据缓存到内存中,所有的数据访问请求都在内存中完成,可以大大提高系统性能。

负载均衡

负载均衡就是把系统的压力均匀分布到不同的运算单元上,实际应用中常用的方法就是对于同一种应用,部署到多台相同功能的服务器上,当需求响应业务请求时,自动分配到某一台服务器来完成操作,再把结果发送给用户。

这种系统架构的好处是充分分担了系统压力,同时大大提高了系统的容灾性。负载均衡最简单的调度算法就是平均分配或者随机分配,例如把请求平均分成若干份,可以按顺序,也可以随机分配任务到具体的某一台服务器。

这是按照任务来分配资源的方式,还有一种是按数据来分配资源,将数据存储在不同的服务器上,分配的方式可以是随机的,也可以是按某个算法,比如按数据的Hash值来分配。还有一种是按业务模块来分配,比如一个企业的管理系统,可以将财务模块、生产模块、人事管理模块等分配到不同的服务器上来实现负载均衡。对于超大型的系统来说,还可以在业务模块的基础上再次细分,比如人事系统可以按出勤、加班、工资等不同的子业务来细分。

负载均衡真正的难点在于复杂应用的调度算法,比如一个视频网站,如果将海量视频平均分布在不同的服务器上,其实并不能真正意义上的实现均衡负载。因为按照长尾理论,热门的视频只是少数,但却有极高的播放量,而多数视频播放量很小,却占用大多数的存储空间。这时候难点就体现在怎么样均匀的分布热门和冷门的视频存储,要知道这两者的关系并不是固定的,热门的视频在关注期过去后,很可能成为冷门视频。而冷门视频也可能因为一个偶然的原因变得迅速热门起来。

负载均衡实现的复杂性和业务系统的复杂性成正比,对于大型的网站和应用来说,还要结合其他多种手段来提高系统的稳定性的运行效率,比如各种数据缓存技术等等。

分布式

前文所述的这些概念,本质上都是分布式系统的实际应用模式。分布式系统是通过将硬件资源在物理层面进行分散化,然后通过计算机网络来实现信息交换。对于业务系统的用户来说,系统是统一完整的,一般不会感受到数据或者逻辑资源是分散的。

打个比方,就好比要写一本书,但是任务时间太紧,一个人无法在规定的时间内完成。这时候可以找一些拥有相同技能,但居住在不同地区的人,每个人写一章,最后通过网络将写好的文章汇总在一起,装订成册,就变成了一本完整的书。这样的分布式任务模式,大大提高了效率和安全保障,试想如果其中某一个人临时退出,也不会对整个任务的完成造成太大的影响。

除了业务逻辑的分布,数据也可以分布存储,这些在前文负载均衡中已经提到过。就好比一套异常珍贵的旷世巨作,因为种种原因只剩下了最后3套, 这时候把这3套书放在一个保险柜中并严密看护,远不如把3套书分别存放在不同的地方来得安全。

分布式系统相比过去传统的集中式系统拥有更高的性价比,以计算机硬件为例,一颗最强性能的CPU的价格,远高于大量廉价的低性能CPU。但如果将这些廉价的CPU组成一个分布式系统,则性能未必就比最强配置的CPU差。

就好像要求一下子搬走1000块砖头,可能需要一个大力士才行,全世界也找不出几个这样的人,就算有,代价也是巨大的。但如果找1000个小朋友,每人只拿一块砖,就可以轻松完成任务,所需要付出的代价可能只是一些棒棒糖。当然实际应用要复杂的多,不能这样简单的类比,比如调度好1000个小朋友,让他们井然有序,不出意外,远比指挥一个大力士要困难。