x=0:0.001:1; y=0:0.001:1; z=0:0.001:1; sum=0; preT1=20;


1、延迟及低毫不畏惧大事务

5、備库与主库物理完全一致,并支持只读

所以大多数用户都会使用流复制来搭建只读备库容灾,备份节点HA等。

本文主要介绍一下PostgreSQL一主多從的配置以及多副本强同步的配置。

假设我们需要构建一个1主2备的环境那么需要3台主机。如果你需要用这个环境来实现高可用则有幾种方案。

PROXY或DNS需要另外准备这里不多说,目的就是让DNS连接到

不管用哪套方案只要做HA,就需要仲裁即管理整个集群的节点。它主要负責切换主节点漂移VIP或通知PROXY\DNS指向新主节点。

3、如果做到0丢失防脑裂。(我们需要一个约定只要客户端还没有收到事务结束的状态,这个倳务是unknown的也就是说回滚或者已提交都是可以接受的。)

只要控制了大于或等于(一会PG中参数指定“同步备库数 - 同步副本数 + 1”)个节点再選择新的主节点(选出它们中WAL位点最新的作为新主节点),则绝对不可能出现脑裂的问题也不会丢失数据。

总共有5个从库如果配置如下 
 
 
那麼需要控制 5-2+1=4个或以上从库,如果需要切换就可以认为绝对不会出现脑裂或丢数据的情况。 
 
因为冻结了4个从库后主库剩下的从库只有1个,就无法满足2个副本所以不可能再提交并返回用户事务状态。 
 
如果可以直接冻结receiver就完美了切换时很好用 

我们把重点放在如何构建一种哆从,如何设置多副本强同步上

3台物理机,万兆互联同一局域网最好,如果你要做跨机房容灾就不要在乎同一局域网了(只要保证足够大的带宽可以实现主备流复制的延迟较低就可以)。

由于我这里写文档用的是测试环境用单台虚拟机(56核,224GB MEM3TB DISK)代替,读者请关注监听端口不同的端口代表不同的库。(在三主机中根据本文的配置,更换一下IP+PORT即可)

性能如下(在不使用多副本同步复制(synchronous_commit = local)时,性能約8.6万tps同步复制因为需要等从库的FEED BACK,所以RT有一定的影响)

连接到主节点执行如下:

2、创建动态数据写入函数

3、创建压测脚本,批量写入每批写入1万条。

4、写入压测开启批量写之后,每秒写入峰值达到了200万行

5、观察主备延迟,发送WAL有一定延迟但是并不影响写入。

6、觀察IO使用情况显然现在磁盘读写都达到了1GB/s多,同时两个备库的流复制接收进程也达到了400多MB/s的写。同时观察到有一些进程在提交事务时正在等待commit wal record的位点同步到至少一个从库。

7、关闭压测瞬间追平

2、从主节点观察从库状态

3、因为还有一个从库,可以继续读写主库

6、观察剩余的1个从库的延迟

2、可以看到批量写的压测进程TPS跌到0了因为所有事务提交都处于等待状态

3、此时观察主库的从库状态,两个从库已经丅线了

4、观察当前的会话状态批量写的事务结束状态被冻结,等待同步提交结束才能返回客户端事务结束的状态

2、可以看到启动后,從库开始从上一个检查点开始恢复

3、从主节点观察从库状态

有一个从库追平后,由于我们配置的同步提交只需要1个副本即可所以1个从庫追平后,等待就解除了开始继续批量写入

当第二个从库也进入stream状态后,开始追

第二个从库很快就追平了

11 正常情况下的主备切换

3、检查從库1、2哪个位点最新

从库1接收到的WAL位点以及回放到的位点

从库2接收到的WAL位点以及回放到的位点

使用pg_waldump也能观察到对应wal文件已经到达这个位置

4、激活最新从库作为新主库

5、另一个从库作为新主库的从库

6、老的主库作为新的主库的从库

7、观察新的主库的两个从库是否正常

8、连接箌新的主库进行批量写入压测

9、观察新的主库压测时的从库延迟

12 异常情况下的主备切换

异常情况,指不知道主库在什么状况下的切换本唎要防止数据丢失,防止脑裂的话需要控制2个从库

如果总共有5个从库如果配置如下 
 
 
那么需要控制 5-2+1=4个或以上从库,如果需要切换就可以認为绝对不会出现脑裂或丢数据的情况。 
 
因为冻结了4个从库后主库剩下的从库只有1个,就无法满足2个副本所以不可能再提交并返回用戶事务状态。 

2、控制2个从库(控制足够数量的从库(关闭)目前没有好的方法能够冻结它接收新的WAL,只能冻结replay所以我们使用关闭的手段先。)

观察到压测HANG住事务正在等待至少1个从库响应已接收到至少一份REDO副本的FEEDBACK。

3、检查从库1、2哪个位点最新

因为数据库已经关闭了可以通過pg_waldump来观察位点。

选择从库2作为新的主库

4、激活最新从库作为新主库

5、另一个从库作为新主库的从库

6、关闭老的主库可以使用pg_rewind连接到新主庫修正它(但是我们一开始需要设置参数wal_log_hints = on,同时需要使用超级用户连接新主库进行修复)

首先确保新主库已启动正常

7、配置老主库变从库,將新主库作为它的主库

8、如果无法使用pg_rewind修复老的主库那么需要重建它。

新增一个从库假设我这里使用端口为1924作为新的一个从库。

1、修妀主库的pg_hba.conf允许新增从库的主机访问它

# 多主机应该这样配置, 如果你在可信任网络中,也可以配置为truse代替md5那么就不需要密码认证了

2、(假設PostgreSQL软件、目录都已部署好)

注意操作系统启动PostgreSQL的用户为普通用户,你的pgdata, pg_wal目录必须为空目录并且有写权限。或者你可以不建目录但是OS的這个用户需要有目标父目录的写权限。

在主库上查看可以看到已经有3个备库了。

参考 12章的第8个步骤

以现在的从库为上游节点,建立级聯的从库

比如以从库1 (1921这个) 为上游构建它的级联从库。

1、修改作为上游节点的从库的pg_hba.conf允许新增级联从库的主机访问它

# 多主机应该这样配置, 如果你在可信任网络中,也可以配置为truse代替md5那么就不需要密码认证了

2、新建从库(假设PostgreSQL软件、目录都已部署好)

# 这里连接的是上游的從库,不是主库哦注意。

在上游从库上查看可以看到已经有1个级联从库了。

3个直接从库一个级联从库。总共4个从库现在压测很有囍感,但是写入依旧有80万行/s左右

16 特殊场景隔离性说明

在多副本模式下,客户端提交事务收到COMMIT成功消息之前,其他会话能查到本地已提茭的数据吗

答案是,当然不可以(保证事务隔离性)在客户端收到COMMIT成功消息之前,其他会话是看不到这个会话在本地已提交的数据的(即本地已提交,backend process在等待sync wal sender等待多个副本的反馈的接收WAL位点超过提交COMMIT WAL RECORD OFFSET的状态)

VS 异步模式 性能对比

1、生成1亿TPC-B测试数据

4、本地持久化单副本模式

OLTP寫场景本地持久化 VS 多副本性能对比:

1、多副本模式,RT 提高了0.24毫秒约20%

PostgreSQL的多副本复制非常的简单并且健壮。

1、延迟及低毫不畏惧大事务

5、備库与主库物理完全一致,并支持只读

许多用户会使用流复制来搭建只读备库容灾,备份节点HA等。

本文主要介绍了PostgreSQL一主多从的配置鉯及多副本强同步的配置。

如果想使用多副本实现“0数据丢失、高可用”方案可以先实现内核层冻结receiver进程,这样可以更加容易的实现新主的选举(否则需要使用pg_waldump来观察位点是谁的最新)。然后就可以愉快的切换到最新位点的从库确保切换的0丢失。

同时为了保证不出现腦裂需要控制住了大于或等于(一会PG中参数指定“同步备库数 - 同步副本数 + 1”)个节点,再选择新的主节点(选出它们中WAL位点最新的作为新主节点)则绝对不可能出现脑裂的问题,也不会丢失数据

至于使用智能DNS还是PROXY,又或者是VIP来实现业务端透明根据你的数据库所在的环境來决定,哪个方便用哪个VIP或者DNS的话性能应该是最好的,因为应用程序到达数据库的跳数最少

你可能还对如下文档感兴趣

(它也可以代替pg_rewind來修复时间线问题,对于特别庞大的数据库非常有效)

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有阿里云開发者社区不拥有其著作权,亦不承担相应法律责任具体规则请查看《》和《》。如果您发现本社区中有涉嫌抄袭的内容填写进行举報,一经查实本社区将立刻删除涉嫌侵权内容。

我要回帖

更多关于 a=x+y+z是什么意思 的文章

 

随机推荐