PostgreSQL高可用性、负载均衡、复制与集群方案介绍
目录[-]
9.3官方文档(中文):http://58.58.27.50:8079/doc/html/9.3.1_zh/high-availability.html
复制、集群和连接池: https://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling
集群方案功能列表: http://blog.osdba.net/46.html
一、高可用性、负载均衡、复制的几个方案比较:
共享磁盘失效切换
共享磁盘失效切换通过仅保存一份数据库副本来避免花在同步上的开销。 这个方案让多台服务器共享使用一个单独的磁盘阵列。 如果主服务器失效,备份服务器将立即挂载该数据库, 就像是从一次崩溃中恢复一样。这个方案允许快速的失效切换并且不会丢失数据。
共享硬件的功能通常由网络存储设备提供, 也可以使用完全符合POSIX行为的网络文件系统(参阅Section 17.2.1)。 这种方案的局限性在于如果共享的磁盘阵列损坏了, 那么整个系统将会瘫痪。 另一个局限是备份服务器在主服务器正常运行的时候不能访问共享的存储器。
文件系统复制(块设备)
一种改进的方案是文件系统复制:对文件系统的任何更改都将镜像到备份服务器上。 这个方案的唯一局限是必须确保备份服务器的镜像与主服务器完全一致— 特别是写入顺序必须完全相同。DRBD是Linux上的一种流行的文件系统复制方案。
事务日志传送
热备份服务器可以通过读取WAL记录流来保持数据库的当前状态。 如果主服务器失效,那么热备份服务器将包含几乎所有主服务器的数据, 并可以迅速的将自己切换为主服务器。这是一个异步方案, 并且只能在整个数据库服务器上实施。
使用基于文件的日志传送或流复制,或两者相结合。 前者参阅Section 25.2, 后者参阅Section 25.2.5。 请参阅Section 25.5获取关于热备的信息。
基于触发器的主备复制
这个方案将所有修改数据的请求发送到主服务器。 主服务器异步向从服务器发送数据的更改信息。 从服务器在主服务器运行的情况下只应答读请求。对于数据仓库的请求来说, 从服务器非常理想的。
Slony-I是这个方案的一个例子,它支持针对每个表的粒度并支持多个从服务器。 因为它异步、批量的更新从服务器, 在失效切换的时候可能会有数据丢失。
基于语句的复制中间件
可以使用一个基于语句的复制中间件程序截取每一个SQL查询, 并将其发送到某一个或者全部服务器。每一个服务器都独立运行。 读-写请求发送给所有服务器,所以每个服务器接收到任何变化。但是只 读请求则仅发送给某一个服务器,从而实现读取的负载均衡。
如果只是简单的广播修改数据的SQL语句, 那么类似random()
, CURRENT_TIMESTAMP
以及序列函数在不同的服务器上将生成不同的结果。 这是因为每个服务器都独立运行并且广播的是SQL语句而不是如何对行进行修改。 如果这种结果是不可接受的,那么中间件或者应用程序必须保证始终从同 一个服务器读取这些值并将其应用到写入请求中。 另外还必须保证每一个事务必须在所有服务器上全部提交成功或者全部回滚, 或者使用两阶段提交(PREPARE TRANSACTION 和COMMIT PREPARED)。 Pgpool-II和Continuent Tungsten是这种方案的实例。
异步多主服务器复制
对于那些不规则连接的服务器(比如笔记本电脑或远程服务器), 要在它们之间保持数据一致是很麻烦的。 在这个方案中,每台服务器都独立工作并周期性的与其他服务器通信以识别相互冲突的事务。 可以通过用户或者冲突判决规则处理出现的冲突。
同步多主服务器复制
在这种方案中,每个服务器都可以接受写入请求, 修改的数据将在事务被提交之前必须从原始服务器广播到所有其它服务器。 过多的写入动作将导致过多的锁定,从而导致性能低下。 事实上,在多台服务器上同时写的性能总是比在单独一台服务器上写的性能低。 读请求将被均衡的分散到每台单独的服务器。 某些实现使用共享磁盘来减少通信开销。 同步多主服务器复制方案最适合于读取远多于写入的场合。 它的优势是每台服务器都能接受写请求—因此不需要在主从服务器之间划分工作负荷。 因为在服务器之间发送的是数据的变化, 所以不会对非确定性函数(比如random()
)造成不良影响。
PostgreSQL不提供这种类型的复制。 但是PostgreSQL的两阶段提交(PREPARE TRANSACTION和 COMMIT PREPARED) 可以用于在应用层或中间件代码中实现这个功能。
商业解决方案
因为PostgreSQL是开放源代码并且很容易被扩展, 许多公司在PostgreSQL的基础上创建了商业的闭源解决方案, 提供独特的失效切换、复制、负载均衡功能。
Feature | Shared Disk Failover | File System Replication | Transaction Log Shipping | Trigger-Based Master-Standby Replication | Statement-Based Replication Middleware | Asynchronous Multimaster Replication | Synchronous Multimaster Replication |
---|---|---|---|---|---|---|---|
Most Common Implementation | NAS | DRBD | Streaming Repl. | Slony | pgpool-II | Bucardo | |
Communication Method | shared disk | disk blocks | WAL | table rows | SQL | table rows | table rows and row locks |
No special hardware required | • | • | • | • | • | • | |
Allows multiple master servers | • | • | • | ||||
No master server overhead | • | • | • | ||||
No waiting for multiple servers | • | with sync off | • | • | |||
Master failure will never lose data | • | • | with sync on | • | • | ||
Standby accept read-only queries | with hot | • | • | • | • | ||
Per-table granularity | • | • | • | ||||
No conflict resolution necessary | • | • | • | • | • |
有几个解决方案不适合上边这些分类:
数据分区
数据分区将表拆分为数据集。每个数据集只有一台服务器可以修改。 例如,数据可以按办事处进行分区,例如, 伦敦和巴黎,每个办公室用一个服务器。 如果查询需要伦敦和巴黎相结合的数据,应用程序可以查询两台服务器, 或主/备用复制可以用来保持每个服务器上有其他办公室的只读数据副本。
多服务器并行查询执行
许多上述解决方案允许多个服务器来处理多个查询, 但不是允许单个查询使用多个服务器来更快完成。 此解决方案允许多个服务器上单个查询同时运行。 它通常被通过服务器之间的数据分开而执行其查询的一部分, 并将结果返回到中央服务器,由它来联合结果并返回给用户。 Pgpool-II有这种能力。 也可以使用PL/Proxy工具集实现。
二、多节点集群方案比较
可以基于Replication Stream(流复制)。
Program | License | Maturity | Replication Method | Sync | Connection Pooling | Load Balancing | Query Partitioning |
---|---|---|---|---|---|---|---|
PgCluster | BSD | Stalled暂停 | Master-Master | Synchronous | No | Yes | No |
pgpool-I | BSD | Stable | Statement-Based Middleware | Synchronous | Yes | Yes | No |
Pgpool-II | BSD | Recent release | Statement-Based Middleware | Synchronous | Yes | Yes | Yes |
slony | BSD | Stable | Master-Slave | Asynchronous | No | No | No |
Bucardo | BSD | Stable | Master-Master, Master-Slave | Asynchronous | No | No | No |
Londiste | BSD | Stable | Master-Slave | Asynchronous | No | No | No |
Mammoth | BSD | Stalled | Master-Slave | Asynchronous | No | No | No |
rubyrep | MIT | Stalled | Master-Master, Master-Slave | Asynchronous | No | No | No |
BDR (Bi-Directional Replication) | PostgreSQL (BSD) | Beta | Master-Master (no triggers needed) |
Asynchronous | No | No | No |
pg_shard | LGPL | Recent release | Statement-based Middleware (as an extension) | Synchronous | No | Yes | Yes |
PostgreSQL高可用性、负载均衡、复制与集群方案介绍的更多相关文章
- 161028、Nginx负载均衡实现tomcat集群方案简要小结
重点两部分:一.负载均衡二.tomcat集群 所谓tomcat集群,就是可以向外提供并行服务的多台机器,任何一台服务器宕机,其它服务器可以替代它向外提供服务,而不影响用户访问. Nginx是一个常用的 ...
- Linux下"负载均衡+高可用"集群的考虑点 以及 高可用方案说明(Keepalive/Heartbeat)
当下Linux运维技术越来越受到企业的关注和追捧, 在某些企业, 尤其是牵涉到电子商务和电子广告类的网站,通常会要求作负载均衡和高可用的Linux集群方案.那么如何实施Llinux集群架构,才能既有效 ...
- linux系统下对网站实施负载均衡+高可用集群需要考虑的几点
随着linux系统的成熟和广泛普及,linux运维技术越来越受到企业的关注和追捧.在一些中小企业,尤其是牵涉到电子商务和电子广告类的网站,通常会要求作负载均衡和高可用的Linux集群方案. 那么如何实 ...
- 「mysql优化专题」高可用性、负载均衡的mysql集群解决方案(12)
一.为什么需要mysql集群? 一个庞大的分布式系统的性能瓶颈中,最脆弱的就是连接.连接有两个,一个是客户端与后端的连接,另一个是后端与数据库的连接.简单如图下两个蓝色框框(其实,这张图是我在悟空问答 ...
- 高可用性、负载均衡的mysql集群解决方案
高可用性.负载均衡的mysql集群解决方案 一.mysql的市场占有率 二.mysql为什么受到如此的欢迎 三.mysql数据库系统的优缺点 四.网络服务器的需求 五.什么是mysql的集群 六.什么 ...
- apache、mod_jk负载均衡与tomcat集群
最近需要搭建apache和tomcat的集群,实现静态网站直接通过apache访问,动态网站转交给tomcat处理,实现负载均衡和tomcat集群配置. apache安装 wget http://ap ...
- Apache+Tomcat部署负载均衡(或集群)
本来只打算写Tomcat集群部署,简化Apache和Tomcat整合过程的.后来想了想,这样不便于没有用过Apache的朋友来学习本文内容.于是干脆加大篇幅,让对Apache不了解的朋友能对Apach ...
- LVS+Keepalived-DR模式负载均衡高可用集群
LVS+Keepalived DR模式负载均衡+高可用集群架构图 工作原理: Keepalived采用VRRP热备份协议实现Linux服务器的多机热备功能. VRRP,虚拟路由冗余协议,是针对路由器的 ...
- 3.dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢?
作者:中华石杉 面试题 dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢? 面试官心理分析 继续深问吧,这些都是用 dubbo 必须知道的一些东西,你得知道基本原理,知道序列化是什么协议 ...
随机推荐
- myeclipse 6.5配置tomcat7.X
软件安装:myeclipse 6.5 Apache Tomcat/7.0.47 安装完成后开始配置 1. 随便展开一个tomcat配置选项,这里配置到tomcat6.x,如下图:
- 用C#用C#实现窗体在规定时间弹出,例如:10:00.弹出后关闭。并在5分钟后再次弹出。5次后停止。最好有具体代码实现窗体在规定时间弹出,例如:10:00.弹出后关闭。并在5分钟后再次弹出。5次后停止。最好有具体代码
run(){ while(true) { show(); if(条件) { ...
- bzoj 1951: [Sdoi2010]古代猪文
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #defin ...
- Oracle连接出现TNS:no listener或者ORA-12514: TNS:listener does not currently know
1.Message 850 not found; No message file for product=network, facility=NL 提示框:TNS:no listener 解决办法: ...
- 三元运算+lambda表达式
#三元运算,三目运算,if else简写 if 1 == 1: name = "liangml" else: name = "NB" #如果 1==1 成立,n ...
- EntLib Unity父类的依赖注入问题
Unity的注入有3种方式:构造函数.[Dependency]属性.[InjectionMethod]方法.这3种方式涉及到的interface或class都会去Registrations里找,找不到 ...
- C++-多重继承的注意点
1, 钻石型多重继承如果不想要底部的类有重复的变量,则需要声明为virtual继承 class File{...}; class InputFile: virtual public File{..}; ...
- IE7的overflow失效的解决方法
IE7的position:relative bug今天遇到了一个相对定位(position:relaitve)引起的IE7中overflow:hidden失效的bug,特此记录!解决方法很简单,给父层 ...
- BYOA,也许是IT大叔眼中的新生代萝莉
BYOx已经成为一种潮流,仿佛美瞳.紧身legging和大红唇在某个阶段也是姑娘们的标配,这个小小的x可以替换成任何东西,带着你的“玫瑰”.带着你的“嫁妆”.带着你的“炸鸡和啤酒”……很抱歉,今天的故 ...
- Linear Predictors
In this chapter we will study the family of linear predictors, one of the most useful families of hy ...