1、设计目标
架构企业级数据库时,应从三个方面考虑,高可用性、可缩放性和性能。
高可用性(HighAvailability,缩写为HA)指系统发生故障时能在短时间内恢复运行,并且数据不会丢失。为了实现高可用性,系统需要由两台以上的计算机和硬盘构成,称作硬件冗余。在设计时,要防止单点故障(SinglePointOf Failure),即只因某一处发生故障,而使整个系统瘫痪。
可缩放性(Scalability)指系统可以扩充以适应负荷的增加。可缩放性又分为单机硬件配置的提高(Scaleup)和计算机台数的增加(Scaleout)。但硬件升级毕竟有极限,而且随着配置的提高成本也大幅度增加。对多机系统而言,每台机器的配置不需要很高,可使用闲置的或廉价的计算机,但随着计算机台数的增加,管理成本也不可忽视。
性能(Performance)包括响应时间、处理量和同时服务请求数的上限。响应时间指从客户端发出请求开始到处理结果返回之间的时间间隔。处理量指单位时间内服务器处理的请求数。性能与用户对系统处理速度的满意度相关。达不到用户所需要的处理速度,就意味着系统缺乏实用性。
为实现上述目标,需要几台服务器联合工作,我们把这样的系统称作数据库群集(Cluster)。简单地说,群集就是多台独立的服务器作为一个系统运作。
2、典型架构方法
企业级数据库的架构方法因业务要求有所变化,本文只对基本形式做一简单介绍。
2.1共享磁盘故障转移(SharedDiskFailover)
这是目前最常使用的一种方式。系统由一个共享磁盘和两个服务器组成。数据库被放到共享磁盘上。一个服务器作为活动(Active)服务器,接受应用程序的数据库操作请求,另一个服务器作为预备(Standby)服务器,不接受应用程序的数据库操作请求。当活动(Active)服务器因故障停止时,进行服务器切换,预备服务器成为活动(Active)服务器,维持系统运行。
这种方式的缺点,是一旦共享磁盘发生故障,整个系统瘫痪。为防止磁盘故障,常采用廉价磁盘冗余阵列(RAID)。另外,一旦活动服务器发生故障,在服务器切换完成之前,系统不能响应应用程序的请求,而且当前正在执行的事务(Transaction)会丢失。从整体性能来看,这种方式只有一台服务器做事务处理,其余服务器处于等待状态,资源没有全部利用。
SQLServer提供故障转移功能。PostgreSQL不提供这种功能,但有很多工具(Tool)可提供这一功能。
2.2共享磁盘同时运行(SharedDisk Active-Active)
系统由一个共享磁盘和若干个服务器组成。数据库被放到共享磁盘上。服务器同时运行,任意一个服务器都接受应用程序的数据库操作请求,并执行SQL操作。即使某个服务器停止,其他服务器不受影响继续运行,当前正在执行的事务(Transaction)会被其他服务器继续执行。由于这种方式充分利用了服务器资源,可以分散负载,性能要好于共享磁盘故障转移。
OracleRealApplication Clusters(OracleRAC)属于这种类型的代表。
2.3主从复制(Master-SlaveReplication)
系统由若干个服务器组成,不需要共享磁盘,每个服务器拥有自己的数据库,这些数据库是完全相同的,或者说是同一数据库的拷贝。运行时,其中一个服务器作为主(Master),其余都作为从(Slave)。数据库更新操作要在主(Master)服务器中执行,然后通过数据库的复制功能(Replication)把数据库的变更信息传送到从(Slave)服务器。使从(Slave)服务器的数据库内容和主(Master)服务器保持一致。数据库查询操作可在从(Slave)服务器上进行。当主(Master)服务器发生故障时,从(Slave)服务器可以代替主(Master)服务器提供服务。
主从复制方式,又可分为同步型和异步型。同步型指数据库变更信息被送到从(Slave)服务器之后,主(Master)服务器才进行实质性的变更(事务提交)。异步型指主(Master)服务器进行变更操作之后,再传送变更信息。
当主(Master)服务器瘫痪时,同步型能确保主从服务器的数据一致性,而异步型可能会有一部分数据丢失。但不管是同步型还是异步型,当前正在执行的事务(Transaction)会丢失。
从整体性能来看,查询操作可在主从服务器上进行,有利于负载平衡,但更新操作只能在主服务器上进行。所以这种方式,适用于查询操作多而更新操作少的系统。
2.4复数主复制(Multi-MasterReplication)
系统构成与主从复制方式相同,由若干个服务器组成,不需要共享磁盘,每个服务器拥有自己的数据库,这些数据库是完全相同的,或者说是同一数据库的拷贝。与主从复制方式不同的是,运行时每台服务器都可以进行数据库更新操作,变更信息通过数据库的复制功能(Replication)相互传送。
这种方式查询操作和更新操作可在每台服务器上进行,查询操作和更新都可进行负载平衡,但是,在各个服务器之间保持数据一致性的机制比较复杂,性能不如主从复制方式。
2.5多个服务器并行查询执行(Multi-ServerParallel QueryExecution)
前面几种方式主要侧重于高可用性,即使系统中的某台服务器发生故障,系统能维持数据库服务,并尽可能不丢失数据。而多个服务器并行查询执行方式主要为了提高性能而设计。
对于大规模数据库(VLDB)而言,有时靠单台服务器提供服务时,处理时间长,在性能上很难满足用户需求。为解决这一问题,可把数据库的数据进行分割,把分割后的数据放到几台服务器上。当SQL语句执行时,把SQL语句分解成若干条SQL语句,分解后的SQL语句分别在不同的服务器上并行执行,然后把处理结果合并,再返回给应用程序。即,用多台服务器并行完成一个数据库操作。这种方式常称作数据库碎片化(Sharding)。
这种方式的解决方案有微软的SQLAzure,基于postgreSQL的pgpool-II。
3、结束语
以上介绍了几种典型的数据库架构方法,没有哪种方法最好,应根据用户需求和成本综合做出判断。