pacemaker高可组件安装与部署

[hoc]

安装

安装

在全部控制节点安装相关服务

yum install pacemaker corosync pcs fence-agents resource-agents -y

各包作用:

# pacemaker:资源管理器(CRM),负责启动与停止服务,位于 HA 集群架构中资源管理、资源代理层 # corosync:消息层组件(Messaging Layer),管理成员关系、消息与仲裁,为高可用环境中提供通讯服务,位于高可用集群架构的底层,为各节点(node)之间提供心跳信息; # resource-agents:资源代理,在节点上接收CRM的调度,对某一资源进行管理的工具,管理工具通常为脚本; # pcs:命令行工具集; # fence-agents:fencing 在一个节点不稳定或无答复时将其关闭,使其不会损坏集群的其它资源,其主要作用是消除脑裂

构建集群

启动pcs服务

systemctl enable pcsd --now或者systemctl enable pcsd && systemctl start pcsd

配置密码

在所有节点配置hacluster用户密码

passwd hacluster# 密码自定,此外以Hapassw0rd为例。

设置密码的另一种方法:echo Hapassw0rd | passwd --stdin hacluster

corosync配置文件准备

cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf

节点配置

vim /etc/corosync/corosync.conf

节点认证

认证配置在任意节点操作,以控制节点1为例

# 集群节点添加 pcs host auth <hostname> addr=n.n.n.n -u hacluster -p password # 节点认证,组建集群,需要用上一步设置的password [root@controller01 ~]# pcs cluster auth node1 node2 node3 -u hacluster -p Hapassw0rd --force

集群设置和同步corosync

# pcs cluster setup MyCluster server1 server2 # pcs start --all #开启集群 # corosync-cfgtool -s #检查集群通信是否顺畅,当前节点的初始化信息 # #修改配置文件后,还需要执行如下几条命令,让配置同步其他节点、和立即生效 pcs cluster sync # pcs cluster reload corosync # 重载配置 corosync-cmapctl # 查询当前内存中corosync的配置

集群恢复重配置

pcs cluster destroy --force pcs cluster setup <cluster-name> <node1> addr=n.n.n.n <node2> addr=n.n.n.n ... <nodeN> addr=n.n.n.n pcs cluster enable --all

启动

# 启动集群,以controller01节点为例 [root@controller01 ~]# pcs cluster start --all
# 设置集群开机启动 [root@controller01 ~]# pcs cluster enable --all

查看集群状态

# 查看集群状态,也可使用” crm_mon -1”命令; # “DC”:Designated Controller; # 通过”cibadmin --query --scope nodes”可查看节点配置 [root@controller01 ~]# pcs status cluster

查看corosync状态;

# “corosync”表示一种底层状态等信息的同步方式 [root@controller01 ~]# pcs status corosync

查看节点;

# 或:corosync-cmapctl runtime.totem.pg.mrp.srp.members [root@controller01 ~]# corosync-cmapctl | grep members

查看集群资源

[root@controller01 ~]# pcs resource

或通过web访问任意控制节点:https://172.16.20.3:2224,

账号/密码(即构建集群时生成的密码):hacluster/hapsssw0rd

配置

设置属性

# 在任意控制节点设置属性即可,以controller01节点为例; # 设置合适的输入处理历史记录及策略引擎生成的错误与警告,在troulbshoot时有用 [root@controller01 ~]# pcs property set pe-warn-series-max=100 \ pe-input-series-max=100 \ pe-error-series-max=100 # pacemaker基于时间驱动的方式进行状态处理,” cluster-recheck-interval”默认定义某些pacemaker操作发生的事件间隔为15min,建议设置为5min或3min [root@controller01 ~]# pcs property set cluster-recheck-interval=5 # corosync默认启用stonith,但stonith机制(通过ipmi或ssh关闭节点)并没有配置相应的stonith设备(通过“crm_verify -L -V”验证配置是否正确,没有输出即正确),此时pacemaker将拒绝启动任何资源; # 在生产环境可根据情况灵活调整,验证环境下可关闭 [root@controller01 ~]# pcs property set stonith-enabled=false # 默认当有半数以上节点在线时,集群认为自己拥有法定人数,是“合法”的,满足公式:total_nodes < 2 * active_nodes; # 以3个节点的集群计算,当故障2个节点时,集群状态不满足上述公式,此时集群即非法;当集群只有2个节点时,故障1个节点集群即非法,所谓的”双节点集群”就没有意义; # 在实际生产环境中,做2节点集群,无法仲裁时,可选择忽略;做3节点集群,可根据对集群节点的高可用阀值灵活设置 [root@controller01 ~]# pcs property set no-quorum-policy=ignore # v2的heartbeat为了支持多节点集群,提供了一种积分策略来控制各个资源在集群中各节点之间的切换策略;通过计算出各节点的的总分数,得分最高者将成为active状态来管理某个(或某组)资源; # 默认每一个资源的初始分数(取全局参数default-resource-stickiness,通过"pcs property config --all"查看)是0,同时每一个资源在每次失败之后减掉的分数(取全局参数default-resource-failure-stickiness)也是0,此时一个资源不论失败多少次,heartbeat都只是执行restart操作,不会进行节点切换; # 如果针对某一个资源设置初始分数”resource-stickiness“或"resource-failure-stickiness",则取单独设置的资源分数; # 一般来说,resource-stickiness的值都是正数,resource-failure-stickiness的值都是负数;有一个特殊值是正无穷大(INFINITY)和负无穷大(-INFINITY),即"永远不切换"与"只要失败必须切换",是用来满足极端规则的简单配置项; # 如果节点的分数为负,该节点在任何情况下都不会接管资源(冷备节点);如果某节点的分数大于当前运行该资源的节点的分数,heartbeat会做出切换动作,现在运行该资源的节点将释 放资源,分数高出的节点将接管该资源 # pcs property config 只可查看修改后的属性值,参数”--all”可查看含默认值的全部属性值; # 也可查看/var/lib/pacemaker/cib/cib.xml文件,或”pcs cluster cib”,或“cibadmin --query --scope crm_config”查看属性设置,” cibadmin --query --scope resources”查看资源配置 [root@controller01 ~]# pcs property config

又节点必须配置:

pcs property set stonith-enabled=false # 禁用 STONITH(测试环境) pcs property set no-quorum-policy=ignore # 忽略仲裁丢失 crm_verify -L # 验证资源配置,没报错就行

配置vip

# 在任意控制节点设置vip(resource_id属性),命名即为“vip”; # ocf(standard属性):资源代理(resource agent)的一种,另有systemd,lsb,service等; # heartbeat:资源脚本的提供者(provider属性),ocf规范允许多个供应商提供同一资源代理,大多数ocf规范提供的资源代理都使用heartbeat作为provider; # IPaddr2:资源代理的名称(type属性),IPaddr2便是资源的type; # 通过定义资源属性(standard:provider:type),定位”vip”资源对应的ra脚本位置; # centos系统中,符合ocf规范的ra脚本位于/usr/lib/ocf/resource.d/目录,目录下存放了全部的provider,每个provider目录下有多个type; # op:表示Operations [root@controller01 ~]# pcs resource create vip ocf:heartbeat:IPaddr2 ip=172.30.200.30 cidr_netmask=24 op monitor interval=30s # 查看集群资源 [root@controller01 ~]# pcs resource # 通过”pcs resouce”查询,vip资源在controller01节点; # 通过”ip a show”可查看vip [root@controller01 ~]# ip a show ens33

其他服务资源

pcs resource create nginx-server systemd:nginx op monitor timeout=5s

设置资源组

# 创建资源组 pcs resource group add mysql-cluster db-store mariadb-server db-vip # 检查资源组 pcs resource group list

查看支持的资源组

[root@Gpower1 ~]# pcs resource standardslsb ocfservicesystemd[root@Gpower1 ~]# pcs resource providersheartbeat linbit openstack pacemaker

查看指定的资源组代理

# pcs resource list systemd# pcs resource list ocf<:heartbeat<:pgsql>>

查看指定资源代理的帮助

pcs resource describe ocf:heartbeat:IPaddr

检查各资源对各节点倾向性分数

crm_simulate-sL# 这个命令可以打印出当前集群各资源对各节点的倾向性的分数

手动迁移资源到其他节点

# pcs resource move resource nodename,如 pcs resource move web work02

HA管理

通过web访问任意控制节点:https://172.30.200.31:2224

账号/密码(即构建集群时生成的密码):hacluster/hapsssw0rd

虽然以cli的方式设置了集群,但web界面默认并不显示,手动添加集群;实际操作只需要添加已组建集群的任意节点即。


# 如果api区分admin/internal/public接口,对客户端只开放public接口,通常设置两个vip,如命名为:vip_management与vip_public; # 建议是将vip_management与vip_public约束在1个节点 [root@controller01 ~]# pcs constraint colocation add vip_management with vip_public # 约束关系检查 [root@controller01 ~]# pcs constraint config

配置内核参数

# 全部控制节点修改内核参数,以controller01节点为例; # net.ipv4.ip_nonlocal_bind:是否允许no-local ip绑定,关系到haproxy实例与vip能否绑定并切换; # net.ipv4.ip_forward:是否允许转发 [root@controller01 ~]# echo "net.ipv4.ip_nonlocal_bind = 1" >>/etc/sysctl.conf [root@controller01 ~]# echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf [root@controller01 ~]# sysctl -p

设置pcs资源

# 任意控制节点操作即可,以controller01节点为例; # 添加资源lb-haproxy-clone [root@controller01 ~]# pcs resource create lb-haproxy systemd:haproxy --clone [root@controller01 ~]# pcs resource

设置资源启动顺序

# 设置资源启动顺序,先vip再lb-haproxy-clone; # 通过“cibadmin --query --scope constraints”可查看资源约束配置 [root@controller01 ~]# pcs constraint order start vip then lb-haproxy-clone kind=Optional

多服务绑定约束

# 官方建议设置vip运行在haproxy active的节点,通过绑定lb-haproxy-clone与vip服务,将两种资源约束在1个节点; # 约束后,从资源角度看,其余暂时没有获得vip的节点的haproxy会被pcs关闭 [root@controller01 ~]# pcs constraint colocation add lb-haproxy-clone with vip [root@controller01 ~]# pcs resource

配置 Pacemaker 资源

定义资源代理

安装 PostgreSQL 资源代理

yum install -y resource-agents

创建集群资源

# 添加虚拟 IP 资源 pcs resource create pg_vip ocf:heartbeat:IPaddr2 ip=192.168.1.100 cidr_netmask=24 op monitor interval=30s # 添加 PostgreSQL 资源 pcs resource create pgsql ocf:heartbeat:pgsql \ pgctl="/usr/bin/pg_ctl" \ psql="/usr/bin/psql" \ pgdata="/var/lib/pgsql/data" \ rep_mode="sync" \ node_list="node1 node2" \ primary_conninfo_opt="password=rep_password" \ op start timeout=60s \ op stop timeout=60s \ op promote timeout=30s \ op demote timeout=120s \ op monitor interval=15s timeout=10s role=Master \ op monitor interval=16s timeout=10s role=Slave # 设置资源组(确保 VIP 和 PostgreSQL 在同一节点) pcs constraint colocation add pg_vip with pgsql INFINITY pcs constraint order pgsql then pg_vip

验证资源配置

pcs resource # 显示资源详情 pcs status # 查看集群状态

pcs节点操作

认证新节点

pcs cluster auth node3-uhacluster# 系统会提示输入 hacluster 用户的密码

节点添加

# 配置同步到新节点并加入集群pcs clusternodeaddnode3# 进阶选项:新节点加入后立即启动集群服务并设置开机自启,加上 --start 和 --enablepcs clusternodeaddnode3--start--enable

验证状态

# 检查节点是否成功加入pcs status nodes

pcs status nodes

为节点添加属性

pcs node attribute {NodeName} propertyName=propertyValue

节点删除

# 节点是在线且健康的pcs clusternoderemove node2
# 节点故障时pcs clusternoderemove node2 --skip-offline--force
  • --skip-offline:允许在节点离线时执行命令
  • --force:强制移除配置

故障转移测试

模拟主节点故障

# 在 node1 上停止 PostgreSQL systemctl stop postgresql # 观察 Pacemaker 自动切换至 node2 pcs status | grep "Current DC"

手动切换主备

pcs resource clear pgsql # 清理操作状态 pcs resource move pgsql node2 # 将主库切换至 node2

日常管理命令

# 查看集群状态 pcs cluster status # 临时禁用资源 pcs resource disable pgsql # 将节点设为备用 pcs node standby node1 # 停止整个集群 pcs cluster stop --all # 查看集群状态且启动刷新 crm_mon -Afr # 查看集群状态 crm_mon -Afr -1 # 查看已配置的资源 # pcs resource # 查看可用资源 # pcs resource list # 查看某个具体资源 # pcs resource describe ocf:heartbeat:IPaddr2 # 查看集群配置 # pcs config # 将节点设置为standby状态 # pcs node standby Pacemaker-Mysql-02 # 手动迁移资源至其他节点 提示:前边crmsh里执行手动迁移资源,它默认会在配置界面给我们添加一条位置约束,pcs也是一样的套路,它也会给配置界面添加一条位置约束,可以使用pcs config或者pcs constraint查看到相关约束信息 # pcs resource move mysql-cluster Pacemaker-Mysql-01 # 创建位置约束 # pcs constraint location add cli-prefer-mysql-cluster mysql-cluster Pacemaker-Mysql-01 100 # pcs constraint location add mysql-cluster_with_Pacemaker-Mysql-03 mysql-cluster Pacemaker-Mysql-03 INFINITY # 清除约束 # pcs constraint location remove mysql-cluster_with_Pacemaker-Mysql-03 # 清理告警 pcs resource cleanup resourceName # 清理指定资源的告警历史,包括所有相关的,可以指定--strict只清除指定的资源 pcs resource cleanup node=nodename # 清理节点上所有资源的告警历史 pcs resource resourceID cleanup node=nodename # 清理指定节点上指定资源的告警历史 # 显示资源对集群各节点的倾向性分数 # crm_simulate -sL

常见问题解决

脑裂(Split-Brain)

• 现象:节点间通信中断,各自认为自己是主节点。
• 解决:

pcs cluster stop --all # 停止所有节点 pcs cluster start --all # 重新启动

资源无法启动

• 现象:pcs status 显示资源 FAILED。
• 解决:

pcs resource cleanup pgsql # 清理资源状态 journalctl -xe # 查看详细日志

VIP 无法切换

• 现象:虚拟 IP 未迁移到新主节点。
• 解决:

arping -c 3 -U -I eth0 192.168.1.100 # 强制刷新 ARP pcs resource restart pg_vip # 重启 VIP 资源

性能优化建议

调整复制模式:
pcs resource update pgsql rep_mode=async # 异步复制(更高性能)

监控同步延迟:
SELECT pg_current_wal_lsn(), replay_lsn FROM pg_stat_replication;

启用 WAL 压缩:
在 postgresql.conf 中设置 wal_compression = on

关于corosync的日志说明及配置

其默认配置文件位于 /etc/corosync/corosync.conf

这里我们可以看到,默认情况下,其日志相关的配置段如下:

logging { to_logfile: yes logfile: /var/log/cluster/corosync.log to_syslog: yes timestamp: on }

因此可以看到日志会存储到2个地方,除了定义的logfile之外,也会写入到syslog,也即 /var/log/messages

如果不想corosync的日志写入到 /var/log/messages ,将其to_syslog 修改成no

参考:

官文:https://clusterlabs.org/projects/pacemaker/doc/2.1/Pacemaker_Administration/html/pcs-crmsh.html?highlight=drbd

https://www.php.cn/faq/1959417.html

https://blog.csdn.net/mengshicheng1992/article/details/123612431

https://yueludanfeng.blog.csdn.net/article/details/125136649

https://huaweicloud.csdn.net/6549fb06525bff6100e998b2.html#devmenu9

https://www.cnblogs.com/drgcaosheng/p/14760989.html