基于Pacemaker+Corosync的PostgreSQL HA故障两例
基于Pacemaker+Corosync的PostgreSQL HA故障两例
前几天Pacemaker+Corosync的PostgreSQL HA集群发生了两次故障,再次提醒了HA的部署要谨慎,维护要细致。
故障1:高负载下自动切换
系统是基于Pacemaker+Corosync的PostgreSQL 1主2从 HA集群。在数据库上执行一个delete.从500w的表里删除13w条记录,发现Master挂了。 然后自动起来,再执行这个SQL,再次挂。究竟怎么回事呢?
后来查了Pacemaker的日志,发现是expgsql RA的monitor发生超时,导致expgsql RA重启PostgreSQL。(迁移阈值是3,可以重启3次,超过3次就会发生主从切换。)
/var/log/messages
Nov 18 13:22:05 node1 expgsql(pgsql)[7774]: INFO: Stopping PostgreSQL on demote. Nov 18 13:22:05 node1 expgsql(pgsql)[7774]: INFO: server shutting down Nov 18 13:22:11 node1 expgsql(pgsql)[7774]: INFO: PostgreSQL is down Nov 18 13:22:11 node1 expgsql(pgsql)[7774]: INFO: Changing pgsql-status on node1 : PRI->STOP. Nov 18 13:22:11 node1 expgsql(pgsql)[8609]: INFO: PostgreSQL is already stopped. Nov 18 13:22:12 node1 expgsql(pgsql)[8714]: INFO: Set all nodes into async mode. Nov 18 13:22:12 node1 expgsql(pgsql)[8714]: INFO: server starting Nov 18 13:22:12 node1 expgsql(pgsql)[8714]: INFO: PostgreSQL start command sent. Nov 18 13:22:12 node1 expgsql(pgsql)[8714]: INFO: PostgreSQL is down Nov 18 13:22:13 node1 expgsql(pgsql)[8714]: INFO: PostgreSQL is started.
corosync.log中发现在发生超时前,系统负载很高。
/var/log/cluster/corosync.log
Nov 18 13:20:55 [2353] node1 crmd: info: throttle_handle_load: Moderate CPU load detected: 12.060000 Nov 18 13:20:55 [2353] node1 crmd: info: throttle_send_command: New throttle mode: 0010 (was 0001) Nov 18 13:21:25 [2353] node1 crmd: notice: throttle_handle_load: High CPU load detected: 16.379999 Nov 18 13:21:25 [2353] node1 crmd: info: throttle_send_command: New throttle mode: 0100 (was 0010) Nov 18 13:21:44 [2350] node1 lrmd: warning: child_timeout_callback: pgsql_monitor_3000 process (PID 4822) timed out Nov 18 13:21:44 [2350] node1 lrmd: warning: operation_finished: pgsql_monitor_3000:4822 - timed out after 60000ms Nov 18 13:21:44 [2353] node1 crmd: error: process_lrm_event: Operation pgsql_monitor_3000: Timed Out (node=node1, call=837, timeout=60000ms) Nov 18 13:21:44 [2348] node1 cib: info: cib_process_request: Forwarding cib_modify operation for section status to master (origin=local/crmd/462)
系统是4核机,上面的输出表明系统已经超载,进入限流模式。后面甚至有负载达到49的记录。
Nov 18 13:24:55 [2353] node1 crmd: notice: throttle_handle_load: High CPU load detected: 48.320000 Nov 18 13:25:25 [2353] node1 crmd: notice: throttle_handle_load: High CPU load detected: 49.750000 Nov 18 13:25:39 [2350] node1 lrmd: warning: child_timeout_callback: pgsql_demote_0 process (PID 16604) timed out Nov 18 13:25:55 [2353] node1 crmd: notice: throttle_handle_load: High CPU load detected: 48.860001 Nov 18 13:26:03 [2350] node1 lrmd: warning: operation_finished: pgsql_demote_0:16604 - timed out after 60000ms
throttle mode是什么鬼?
限流模式是Pacemaker的一种保护措施,进入限流模式后Pacemaker会减少自身可以并发执行的job数。 在High CPU load下,限流模式会限制同时只能有1个job在跑。正常情况下,允许同时运行的最大job数是CPU核数的2倍。
https://github.com/ClusterLabs/pacemaker/blob/master/crmd/throttle.c
int throttle_get_job_limit(const char *node) { ...switch(r->mode) {case throttle_extreme:case throttle_high:jobs = 1; /* At least one job must always be allowed */break;case throttle_med:jobs = QB_MAX(1, r->max / 4);break;case throttle_low:jobs = QB_MAX(1, r->max / 2);break;case throttle_none:jobs = QB_MAX(1, r->max);break;default:crm_err("Unknown throttle mode %.4x on %s", r->mode, node);break;} ... }
如何获取CPU LOAD和负载阈值
获取CPU LOAD的方式为取/proc/loadavg中第一行的1分钟负载。
至于负载阈值,有3个负载级别,不同阈值有不同的因子(throttle_load_target)
#define THROTTLE_FACTOR_LOW 1.2 #define THROTTLE_FACTOR_MEDIUM 1.6 #define THROTTLE_FACTOR_HIGH 2.0
对应的阈值分别为 load-threshold * throttle_load_target
load-threshold为集群参数,默认值为80%
判断是否超过阈值的方法是用调整后的CPU负载(上面的CPU LOAD除以核心数)和阈值比较
IO负载
除了CUP负载,Pacemaker还有IO负载的比较,但是相关函数存在多处错误,实际上无效。 无效也好,如果下面这个问题解决了后面会有相反的bug导致会误判高IO负载。
static bool throttle_io_load(float *load, unsigned int *blocked) { if(fgets(buffer, sizeof(buffer), stream)) {...long long divo2 = 0;...long long diow =0;...long long Div = 0;*load = (diow + divo2) / Div; //结果始终为0...return TRUE; //只读了第一行就返回导致不会给blocked赋值 } }
限流和本次故障有什么关系
不能肯定限流和这次故障是否有必然的联系。但是在限流下,Pacemaker执行job的能力弱了,系统负载又高,会增大monitor相关job得不到及时的CPU调度进而发生超时的概率。实际的罪魁祸首还应该是高负载及超时判断方法。
类似问题
搜索后发现有人遇到过类似问题,处理办法就是增大monitor的超时时间。
- https://bugs.launchpad.net/fuel/+bug/1464131
- https://review.openstack.org/#/c/191715/1/deployment/puppet/pacemaker_wrappers/manifests/rabbitmq.pp
解决办法
一方面修改增大monitor的超时时间。在线修改的方法如下:
pcs resource update pgsql op monitor interval=4s timeout=300s on-fail=restart pcs resource update pgsql op monitor role=Master timeout=300s on-fail=restart interval=3s
另一方面,发现系统负载过重,经常跑到100%的CPU,即使没有HA这档子事也是个不稳定因素。 通过修改应用,迁移大部分的读负载到SLave上,有效减轻了Master的压力。
其它案例
GitHub遇到过类似的故障,由于迁移到Master负载过高,进而Percona Replication Manager的健康检查失败进行了切换,切换后新主的缓存是冷的,负载同样过高,又切回去。 (幸运的是我们的方案有3次迁移阈值的保护,不会立刻切。)GitHub权衡后的对策居然是放弃自动切换,只能由人工发起。
参考: GitHub 的两次故障分析
另,Pacemkaer的论坛有几件高负载导致corosync token超时的问题,同样由于相关job不能及时得到OS调度所致,该问题虚机上容易发生,特别是有超分的情况下,解决办法是加大token超时时间。
故障2:同步复制变成了异步复制
系统配置的同步复制,正常情况下2个Slave应该一个是sync,另一个是async。 但是,某个时间发现2个Slave都是async,这对应用系统暂无影响,但是万一这时Master挂了会影响HA切换。 查看Master上的rep_mode.conf配置文件,发现synchronous_standby_names是空。
vi /var/lib/pgsql/tmp/rep_mode.conf
synchronous_standby_names = ''
于是,手工修改为node2,再reload一下就OK了。
vi /var/lib/pgsql/tmp/rep_mode.conf
synchronous_standby_names = 'node2'
至于什么原因导致的,又仔细查看了一下RA脚本,未发现疑点,而现场已经不在,无从查起,只能等下次遇到再说。
基于Pacemaker+Corosync的PostgreSQL HA故障两例相关推荐
- 【PostgreSQL基于Pacemaker+Corosync+pcs的高可用】
地址信息 172.20.10.6 pg01 172.20.10.7 pg02 172.20.10.8 pg03 172.20.10.9 vip-master 172.20.10.10 vip-slav ...
- 利用pcs+pacemaker+corosync实现(HA)高可用集群
实验环境搭建 创建一台操作系统是rhel7.6的虚拟机node,配置好网络仓库,解析,网卡设置,关闭火墙和selinux后封装 克隆node虚拟机,虚拟机域名为node1,node2,node3,主机 ...
- 惠普打印机共享故障两例
例一:客户机打印缓慢 故障现象为:1.预览特别慢:2.打印机属性对话框打开特别慢:3.打印速度缓慢. 解决方法: 1.客户机删除共享的打印机,重新启动计算机. 2.添加同型号本地打印机,添加时选&qu ...
- Pacemaker+Corosync PostgreSQL流复制HA的部署(pha4pgsql)
简介 在众多的PostgreSQL HA方案中,流复制HA方案是性能,可靠性,部署成本等方面都比较好的,也是目前被普遍采用的方案.而用于管理流复制集群的工具中,Pacemaker+Corosync又是 ...
- NFS HA架构部署(NFS + Pacemaker + Corosync + DRBD)
NFS HA架构部署(NFS + Pacemaker + Corosync + DRBD) 环境:kvm虚拟机2台 OS:CentOS7.6 Kernel: Linux 3.10.0-957.21.3 ...
- corosync+pacemaker实现高可用(HA)集群(二)
部署方案二(推荐):corosync+pacemaker 利用ansible自动安装corosync和pacemaker 注:关于ansible的具体使用可参见"ansible实现自动化自动 ...
- pacemaker+corosync 搭建一主两从PG集群
一.OS配置 1.1环境规划 环境:centos 7 数据库:pg11.5 ip地址: node1 10.122.166.120 node2 10.122.166.127 node3 10. ...
- postgresql 高可用 pacemaker + corosync 之二 setup vip-mas ,vip-sla 均绑定在 master
os: ubuntu 16.04 db: postgresql 9.6.8 pacemaker: Pacemaker 1.1.14 Written by Andrew Beekhof corosync ...
- Pacemaker+corosync实现高可用集群
一:Pacemaker和corosync概述: Pacemaker(心脏起搏器),是一个集群管理资源器.但是其不提供心跳信息.pacemaker是一个延续的CRM.Pacemaker到了V3的版本以后 ...
- pacemaker+corosync
Pacemaker Server1 172.25.23.1节点1 Server2 172.25.23.2节点2 Server3 172.25.23.3做存储分离的 VIP 172.25.23.100 ...
最新文章
- pandas使用read_csv函数读取文件并解析日期数据列(parse dates)、pandas使用read_csv函数读取文件并将缺失值转化为空字符串
- Asp.net Mvc Post ID Bug
- Cs Tip08: 文件存储
- tableView 使用 reloadSections:withRowAnimation: 时,会跳动的问题
- NPM:nodejs官方包管理工具的简介、安装、使用方法之详细攻略
- [ios][swift]UIButton
- 女人赢了 未来500万年男性将灭绝
- Linux下内存泄露工具
- React应用里Invalid hook call错误消息的处理
- 一步一步写STL:空间配置器(1)
- Centos6版本ssh连接CentOS7.6及以上版本提示RSA和ecdsa问题
- Linux应用的c编程main函数参数argc,argv说明
- Python之类的构造(面向对象)
- 经纬度5位数和6位数差多少_经度和纬度的最大长度是多少?
- Linkerd、Consul、Istio、Kuma、Traefik、AWS App服务网格全方位对比
- unbuntu 安装虚拟环境 virtualenv和virtualenvwrapper
- 旧瓶装新酒——memcache作为DRDOS反射放大器
- python设置散点图点的大小_matplotlib - pyplot散点图标记大小
- 快收藏ReactOS 新手指南
- 信息系统分析与设计 第九章 系统设计概述
热门文章
- mocha——单元测试
- 高等数学(第七版)同济大学 总习题四(后半部分) 个人解答
- Java爬虫系列之二网页解析【爬取知乎首页信息】
- 【Python量化】使用机器学习预测股票交易信号
- Python——实现防止微信撤回消息
- java中sql去除游标_SQL游标 - java.beggar - BlogJava
- 达索系统3DEXPERIENCE 平台应用程序组件
- java.lang.IllegalArgumentException: Scrapped or attached views may not be recycled.
- python 聚类 客户细分_【火炉炼AI】机器学习027-项目案例:用聚类算法建立客户细分模型...
- 关键词提取:TF-IDF和n-gram