暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

PostgreSQL高可用测试系列之Patroni + etcd + HAProxy + Keepalived 离线部署(六)

原创 张玉龙 2021-11-02
4279
说明:本系列文章仅用于共享我的学习成果,未经过生产系统考验,对于知识点和一些组件的使用会不定时更新,仅供参考,如有错误的地方,欢迎留言共同学习。 ----------------------------- #### 本高可用系列测试不说理论知识,如有需要自行百度,因生产环境大多数是内网环境,无法连接互联网,为模拟生产环境安装,PostgreSQL高可用测试均采用离线部署。 #### 所需软件包均以打包上传百度网盘,如有需要自行下载:[https://pan.baidu.com/s/1Tb7GPMvj4kfKEIh8iyvdbA](https://pan.baidu.com/s/1Tb7GPMvj4kfKEIh8iyvdbA) 提取码:n9w2 文件名:PostgreSQL_HA.tar.gz 第一章: 介绍测试环境 第二章: PostgreSQL + replication 部署 第三章: Etcd 部署和管理 第四章: Patroni 部署和管理 第五章: HAProxy + Keepalived 部署和管理 第六章: 高可用模拟故障测试用例 第七章: Prometheus + Grafana 监控部署 第八章: 高可用管理 ![架构图.jpg](https://oss-emcsprod-public.modb.pro/image/editor/20211030-aa2cf451-fe7e-4a8c-82c2-c2d8b7114909.jpg) # 第六章: 高可用模拟故障测试用例 借用Patroni官方文档的一句话:   Testing an HA solution is a time consuming process, with many variables. This is particularly true considering a cross-platform application. You need a trained system administrator or a consultant to do this work. It is not something we can cover in depth in the documentation.   测试 HA 高可用是一个耗时的过程,有很多变数,不能面面测试到,以下只列出部分测试类型,如果有其他测试场景,欢迎留言评论,本文也会不定期更新其他测试场景,测试代码较多,这里不写了。 ## 1. 高可用测试 Keepalived |测试类型|测试方式|测试命令|测试结果| |-|-|-|-| |进程故障|1. 主端killall进程|killall keepalived|VIP从主端自动转移到备端,5000端口和5001端口连接正常| |-|-|systemctl start keepalived|VIP从备端自动转移到主端,5000端口和5001端口连接正常| |-|2. 备端killall进程|systemctl stop keepalived|VIP在主端正常运行,5000端口和5001端口连接正常| |-|-|systemctl start keepalived|VIP在主端正常运行,5000端口和5001端口连接正常| |-|3. 主端同时kill所有进程|-|主端VIP未卸掉,备端也启动VIP,此时主备端均存在VIP(异常现象),5000端口和5001端口连接正常| |-|-|systemctl start keepalived|VIP转移到主端正常运行,备端无VIP,5000端口和5001端口连接正常| |-|4. 主端只kill主进程|kill -9|VIP从主端自动转移到备端,VIP只在备端启动,5000端口和5001端口连接正常| |-|-|systemctl start keepalived|VIP转移到主端正常运行,备端无VIP,5000端口和5001端口连接正常| |-|5. 主端只kill子进程|-|VIP从主端自动转移到备端,等待主进程自动生成子进程后,VIP从备端自动转移到主端,5000端口和5001端口连接正常| |-|6. 备端kill 进程|-|IP在主端正常运行,5000端口和5001端口连接正常| |网卡故障|1. 主端down网卡|ifdown ens33|VIP从主端自动转移到备端,PostgreSQL发生故障转移到其中一个备库,5000端口和5001端口连接正常,patroni和etcd均不显示故障节点| |-|2. 主端up网卡|ifup ens33|VIP从备端自动转移到主端,故障节点以备库角色添加到集群,patroni和etcd节点状态显示正常,5000端口和5001端口连接正常| |-|3. 备端down网卡|ifdown ens32|VIP在主端正常运行,5000端口和5001端口连接正常,patroni和etcd均不显示故障节点,故障节点上的各个进程还在运行| |-|4. 备端up网卡|ifup ens32|patroni和etcd节点状态显示正常| ## 2. 高可用测试 HAProxy |测试类型|测试方式|测试命令|测试结果| |-|-|-|-| |进程故障|1. 主端killall进程|killall haproxy|keepalived 未检测 haproxy 进程,自动将VIP从主端转移到备端,5000端口和5001端口连接正常| |-|-|systemctl start haproxy|keepalived 检测到 haproxy 进程,自动将VIP从备端转移到主端,5000端口和5001端口连接正常| |-|2. 备端killall进程|killall haproxy|VIP在主端正常运行,5000端口和5001端口连接正常| |-|-|systemctl start haproxy|VIP在主端正常运行,5000端口和5001端口连接正常| |-|3. 主端同时kill所有进程|-|keepalived 未检测 haproxy 进程,自动将VIP从主端转移到备端,5000端口和5001端口连接正常| |-|-|systemctl start haproxy|keepalived 检测到 haproxy 进程,自动将VIP从备端转移到主端,5000端口和5001端口连接正常| |-|4. 主端只kill主进程|-|keepalived 未检测 haproxy 进程,自动将VIP从主端转移到备端,5000端口和5001端口连接正常| |-|-|systemctl start haproxy|keepalived 检测到 haproxy 进程,自动将VIP从备端转移到主端,5000端口和5001端口连接正常| |-|5. 主端只kill子进程|-|haproxy 的所有进程都死了,keepalived 未检测 haproxy 进程,自动将VIP从主端转移到备端,5000端口和5001端口连接正常| |-|-|systemctl start haproxy|keepalived 检测到 haproxy 进程,自动将VIP从备端转移到主端,5000端口和5001端口连接正常| ## 3. 高可用测试 Patroni 以下是在Patroni开启了auto failover的情况下进行测试 ```glsl [root@pgtest3 ~]# patronictl resume ``` |测试类型|测试方式|测试命令|测试结果| |-|-|-|-| |进程故障|1. 主端killall进程|killall patroni|1. 触发故障切换到备库其中一个节点,备库另一个节点同步新主库,切换时间在30秒内 2. 原主库(pgtest1)的 PostgreSQL 被关闭 3. etcd haproxy keepalived 在原主库正常运行,VIP 运行在原主库 4. VIP + 5000端口连接切换后的新主库,VIP + 5001端口连接另一个备库| |-|-|systemctl start patroni|原主库(pgtest1)变成新主库(pgtest2)的备库| |-|2. 主库kill patroni 进程|kill -9|1. 触发故障切换到备库其中一个节点,备库另一个节点同步新主库,切换时间在30秒内 2. 原主库(pgtest1)的 PostgreSQL 还在运行,并且是读写模式 3. etcd haproxy keepalived 在原主库正常运行,VIP 运行在原主库 4. VIP + 5000端口连接切换后的新主库,VIP + 5001端口连接另一个备库| |-|-|systemctl start patroni|原主库(pgtest1)被 pg_rewind 成新主库(pgtest2)的备库| |-|3. 一个备库kill patroni 进程|-|1. 使用killall,将会同时关闭备库,使用kill,此备库的 PostgreSQL 还在以只读模式运行,且与主库正常同步数据 2. VIP + 5000端口正常连接主库,VIP+5001端口不能连接此备库,可以连接另一个备库 3. 主库与另一个备库不受影响 4. 此备库上的 etcd haproxy keepalived 正常运行| |-|-|systemctl start patroni|自动恢复正常状态,与主库保持同步| |-|4. 两个备库kill patroni 进程|-|1. 使用killall,将会同时关闭备库,使用kill,两个备库的 PostgreSQL 还在以只读模式运行,且与主库正常同步数据 2. VIP + 5000端口只连接主库,VIP + 5001端口连接失败 3. 主库不受影响 4. 备库上的 etcd haproxy keepalived 正常运行| |-|-|systemctl start patroni|自动恢复正常状态,与主库保持同步| ## 4. 高可用测试 etcd |测试类型|测试方式|测试命令|测试结果| |-|-|-|-| |进程故障|1. 主库kill etcd 进程|-|不影响主库和备库, patroni 会连接其它节点上的etcd,VIP+5000/5001端口连接正常| |-|2. 一个备库停止 etcd 进程|-|不影响主库和备库, patroni 会连接其它节点上的etcd,VIP+5000/5001端口连接正常| |-|3. 两个备库停止 etcd 进程|-|此时超过了etcd的最大允许故障节点数,主备库3个节点均以只读模式运行,VIP + 5000端口连接失败,VIP + 5001端口轮询连接主备库3个节点| |-|-|先启动第一个备库的 etcd 进程|主库从只读模式切换成读写模式,主从数据同步恢复正常,VIP + 5000/5001端口连接正常| |-|-|再启动第二个备库的 etcd 进程|自动恢复正常状态,与主库保持同步| ## 5. 高可用测试 PostgreSQL |测试类型|测试方式|测试命令|测试结果| |-|-|-|-| |-|停主库PostgreSQL实例|-|主库被Patroni自动拉起,VIP + 5000/5001端口连接正常| |-|停备库PostgreSQL实例|-|备库被Patroni自动拉起,VIP + 5000/5001端口连接正常| ## 6. 高可用测试 操作系统 |测试类型|测试方式|测试命令|测试结果| |-|-|-|-| |-|停PostgreSQL主库主机(同时是haproxy + keepalived 的主机)|reboot|1. 触发故障切换到备库其中一个节点,备库另一个节点同步新主库,切换时间在30秒内 2. VIP漂移到备库 3. VIP + 5000端口连接切换后的新主库,VIP + 5001端口连接另一个备库| |-|-|启动|原主库(pgtest1)变成新主库(pgtest2)的备库,VIP从keepalived的备端自动转移到主端,5000端口和5001端口连接正常| |-|停备库的主机就不测试了|-|-|
最后修改时间:2021-11-04 09:04:11
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论