- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PostgreSQL高可用性与负载均衡原理及实例
多个数据库服务器可以协同工作,比如在主服务器失效的时候备份服务器立即取代它的位置(高可用性),或者几台机器同时服务于同一个数据库(负载均衡)。理 想状态多台服务器之间可以无缝协作。为静态页面提供服务的 Web 服务器可以轻松的通过将 web 请求分摊到多台机器从而实现负载均衡。事实上,只读数据库也能轻松的以相同的方法实现负载均衡。不幸的是,大多数数据库服务器都需要同时处理混合的读/写 请求,将这些数据库联合起来工作是件很麻烦的事。虽然只读数据只需要在每台服务器上复制一份即可,但是在任何一台服务器上的写动作都必须传播到其它所有服 务器上,这样才能保证将来对这些已修改数据的读取返回一致的结果。
这个写同步问题就是导致多台服务器协同工作麻烦重重的最基本原因。有多种解决此问题的方法,其思路也各不相同,但都不是既简单又高效的方案。
有一种解决方案是仅允许单独的一台主服务器修改数据,其它从服务器只能读取数据,还可能存在平时不允许访问、仅在失效切换后代替主服务器的备用服务器。
一些失效切换和负载均衡方案是同步的,意思是直到所有服务器都完成了某个修改数据的事务之后,该事务才被认为是已经完成的。这将确保失效切换不会丢失 任何数据并且所有服务器都将返回一致的结果。另一些方案是异步的,这种方案允许在事务提交之后与传播到所有其它服务器之间有一小段延时,但是在切换到 备份服务器的时候某些事务可能会丢失,并且不同的服务器可能返回不一致的结果。当同步可能会很慢的时候可以使用异步通信。
还可以按照粒度对解决方案进行分类。某些方案只能将整个数据库集群作为一个整体,而某些方案可以针对每个数据库或每张表分别做不同的处理。
在选择任何失效切换或负载均衡方案的时候都必须考虑性能因素。功能和性能不可兼得,比如,一个完全同步的解决方案在慢速网络上可能削减性能一半以上,而完全异步的方案可能仅对性能有极其微小的影响。
下面的部分大致描述了各种常见的失效切换、复制、负载均衡方案。
共享磁盘失效切换
共享磁盘失效切换通过仅保存一份数据库副本来避免花在同步上的开销。这个方案让多台服务器共享使用一个单独的磁盘阵列。如果主服务器失效,备份服务器将立即挂载该数据库,就像是从一次崩溃中恢复一样。这个方案允许快速的失效切换并且不会丢失数据。
共享硬件的功能通常由网络存储设备提供,也可以使用完全符合 POSIX 行为的网络文件系统(NFS)。这种方案的局限性在于如果共享的磁盘阵列损坏了,那么整个系统将会瘫痪。另一个局限是备份服务器在主服务器正常运行的时候不能访问共享的存储器。
一种改进的方案是文件系统复制:对文件系统的任何更改都将镜像到备份服务器上。这个方案的唯一局限是必须确保备份服务器的镜像与主服务器完全一致,特别是写入顺序必须完全相同。DRBD 是 Linux 上的一种流行的文件系统复制方案。
使用即时恢复(PITR)的热备份
热备份服务器(参见节23.4)可以通过读取 WAL 记录流来保持数据库的当前状态。如果主服务器失效,那么热备份服务器将包含几乎所有主服务器的数据,并可以迅速的将自己切换为主服务器。这是一个异步方案,并且只能在整个数据库服务器上实施。
主-从(Master-Slave)服务器复制
这个方案将所有修改数据的请求发送到主服务器。主服务器异步向从服务器发送数据的更改信息。从服务器在主服务器运行的情况下只应答读请求。对于数据仓库的请求来说,从服务器非常理想的。
Slony-I 是这个方案的一个例子,它支持针对每个表的粒度并支持多个从服务器。因为它异步、批量的更新从服务器,在失效切换的时候可能会有数据丢失。
基于语句的复制中间件
可以使用一个基于语句的复制中间件程序截取每一个 SQL 查询,并将其发送到某一个或者全部服务器。每一个服务器都独立运行。写请求发送给所有服务器,读请求则仅发送给某一个服务器,从而实现读取的负载均衡。
如果只是简单的广播修改数据的 SQL 语句,那么类似 random(), CURRENT_TIMESTAMP 以及序列函数在不同的服务器上将生成不同的结果。这是因为每个服务器都独立运行并且广播的是 SQL 语句而不是如何对行进行修改。如果这种结果是不可接受的,那么中间件或者应用程序必须保证始终从同一个服务器读取这些值并将其应用到写入请求中。另外还必须保证每一个事务必须在所有服务器上全部提交成功或者全部回滚,或者使用两阶段提交(PREPARE TRANSACTION 和 COMMIT PREPARED)。Pgpool 和 Sequoia 是这种方案的实例。
同步多主服务器复制
在这种方案中,每个服务器都可以接受写入请求,修改的数据将在事务被提交之前必须从原始服务器广播到所有其它服务器。过多的写入动作将导致过多
文档评论(0)