高可用(HA)集群之pacemaker+corosync方案

​ 近期公司领导要求寻找一个MySQL数据库故障自动转移的高可用方案,用户替换目前生产环境的主从架构,通过查阅互联网资料,找到了很多高可用部署方案,其中对pacemaker+corosync的高可用架构方案印象深刻,以下形成具体的操作文档用以记录技术探索道路上的点点滴滴。

一、概念

​ 在传统Linux集群种类中,主要分了三类:

​ 一类是LB(负载均衡)集群,这类集群的作用是对用户流量做负载均衡,让其后端每个real-server都能均衡的处理一部分请求;

​ 其次就是HA(高可用)集群,所谓ha集群就是高可用集群,这类集群的作用是对集群中的单点做高可用,就是在发生故障时,能够及时的将故障转移,从而使故障修复时间最小;HA集群的特点是在众多台节点上,各个空闲节点会一直盯着工作节点,工作节点也会基于多播或广播的方式把自己的心跳信息发送给其他空闲节点,一旦工作节点的心跳信息在一定时间内空闲节点没有收到,那么此时就会触发资源抢占,先抢到资源的成为新的工作节点,而其他节点又会一直盯着新的工作节点,直到它挂掉,然后再次触发资源抢占;这类集群的特点就是一个节点工作,其他节点看着它工作,一旦工作节点挂了,立刻会有其他节点上来顶替它的工作;

​ 最后就是HP集群,HP集群主要用于在复杂计算中场景中,把多台server的算力综合一起,对复杂计算要求比较高的环境中使用;在生产环境中常见的LB和HA集群较多

​ 高可用架构由两个核心部分组成,一个是心跳检测,判断服务器是否正常运行;一个是资源转移,用来将公共资源在正常服务器和故障服务器之间搬动。两个结合起来使用,可以实现对高可用架构的自动管理。

CoroSync是运行于心跳层的开源软件; PaceMaker是运行于资源转移层的开源软件。 使用corosync监控心跳及投票,pacemaker实现资源转移,crmsh实现集群资源配置;同时使用fence检查节点健康状况,实行跳电保护,防止脑裂发生。 image20220812152358151.png

二、集群规划

VIP:192.168.91.230

主机名安装软件ip地址
Pacemaker-Mysql-01pacemaker、corosync、mariadb-server、crmsh192.168.91.168
Pacemaker-Mysql-02pacemaker、corosync、mariadb-server192.168.91.169
Pacemaker-Mysql-03pacemaker、corosync、mariadb-server192.168.91.167
nfs-datashare-servernfs、nfs-utils192.168.91.170

mariadb与nfs-server安装忽略

三、corosync+pacemaker的安装配置

安装配置前操作(所有节点)

以其中一节点操作为例

1、时间同步

image20220812153827744.png

2、关闭selinux和系统防火墙

image20220812153859682.png

3、主机名解析

image20220812154037196.png

安装配置
# 安装
# yum install pacemaker -y
# 安装pacemaker时会依赖corosync
# 配置
# cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
# cat /etc/corosync/corosync.conf | grep -Ev "#"
totem {
	version: 2

	crypto_cipher: aes256
	crypto_hash: sha1

	interface {
		ringnumber: 0
		bindnetaddr: 192.168.91.0
		mcastaddr: 239.255.1.1
		mcastport: 5405
		ttl: 1
	}
}

logging {
	fileline: off
	to_stderr: no
	to_logfile: yes
	logfile: /var/log/cluster/corosync.log
	to_syslog: yes
	debug: off
	timestamp: on
	logger_subsys {
		subsys: QUORUM
		debug: off
	}
}

quorum {
	provider: corosync_votequorum
}

nodelist {
        node {
                ring0_addr: Pacemaker-Mysql-01
                nodeid: 1
        }
        node {
                ring0_addr: Pacemaker-Mysql-02
                nodeid: 2
        }
        node {
                ring0_addr: Pacemaker-Mysql-03
                nodeid: 3
        }
}

​ 对于totem这个配置段主要用于配置totem协议的相关属性,其中version表示使用的版本,默认是2这个不用更改,保持默认就好;下面的crypto_cipher和crypto_hash这两项用于配置是否启用加密,这里默认是none,这意味这只要是在相同多播域内,它都会识别成集群成员;所以为了安全建议启用集群事务消息通信加密;默认情况crypto_cipher支持aes256, aes192, aes128 and 3des这些加密算法,随便配置一个加密算法即可;crypto_hash支持md5, sha1, sha256, sha384,sha512这些加密算法,随便选一个即可;如果启用以上两项加密,我们需要在/etc/corosync/目录下创建一个密钥文件,且权限是600或着400的权限;并且集群各节点的密钥文件必须相同。

创建密钥文件
# corosync-keygen
同步配置及认证文件
# 复制/etc/corosync/corosync.conf 和authkey文件到其他节点
启动corosync和pacemaker
# systemctl start corosync && systemctl enable corosync && systemctl status corosync
# 使用corosync-cfgtool命令来查看当前节点的初始化信息
# systemctl start pacemaker && systemctl enable pacemaker && systemctl status pacemaker

image20220812155820650.png image20220812155856777.png image20220812155918150.png pacemaker默认不需要怎么配置就可以启动,启动以后,我们可以通过管理接口来配置。

# crm_mon

image20220812160936674.png 至此corosync+pacemaker高可用集群就搭建好了,接下来我们在其上托管mysql数据库实现高可用。

四、corosync+pacemaker高可用集群的配置工具crmsh安装和使用

1、配置yum源
[root@Pacemaker-Mysql-01 ~]# cat /etc/yum.repos.d/crmsh.repo 
[network_ha-clustering_Stable]
name=Stable High Availability/Clustering packages (CentOS_CentOS-7)
type=rpm-md
baseurl=http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/
gpgcheck=1
gpgkey=http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/repodata/repomd.xml.key
enabled=1
2、安装crmsh配置工具
# yum install crmsh -y
3、crmsh命令使用

​ crm有两种使用方式,一种是交互式,直接在命令行敲crm命令就可以进入交互式shell;另外一种是非交互式,在crm 命令后面直接加要执行的命令;

# 将db-vip资源从Pacemaker-Mysql-02节点迁出
# resource ban db-vip Pacemaker-Mysql-02

# crm(live)# configure show type:location
location cli-prefer-mysql-cluster mysql-cluster role=Started -inf: Pacemaker-Mysql-02
# 可以看到我们把db-vip从Pacemaker-Mysql-02迁出以后,它会在配置文件中创建一条资源对节点倾向性的规则,并且指明db-vip对我们ban指定的节点的倾向性为负无穷,这意味着只要有其他节点可以运行,对应资源绝不运行在Pacemaker-Mysql-02上;由于db-vip同mariadb-server、db-store都同属mysql-cluster这个组,所以对应组内的资源也会跟着db-vip的迁移而迁移;

# 清除资源迁移过程中出现的错误信息
crm(live)# resource cleanup db-vip
# 默认情况我们指定资源没有在组内,它默认只会清除我们指定资源相关的状态信息,从上面截图可以看到,我们指定资源在组内,所以它将组内所有资源的状态信息一并清除了;

# 清除指定资源的约束关系
crm(live)# configure show type:location
location cli-ban-mariadb-server-on-Pacemaker-Mysql-01 mariadb-server role=Started -inf: Pacemaker-Mysql-01
crm(live)# resource clear mariadb-server
INFO: Removed migration constraints for mariadb-server
crm(live)# configure show type:location
crm(live)# 
# 可以看到我们指定资源的位置约束关系被清除掉了;其实我们在执行手动迁移资源时,它默认会在配置信息中给我们创建位置约束配置,clear相当于对迁移产生的约束配置做清除

# 显示资源运行的位置
crm(live)# resource locate  mariadb-server

# migrate/move:将指定资源手动迁移至指定节点
crm(live)# resource  migrate mariadb-server Pacemaker-Mysql-03
INFO: Move constraint created for mariadb-server to Pacemaker-Mysql-03
crm(live)# status
Stack: corosync
Current DC: Pacemaker-Mysql-01 (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum
Last updated: Mon Aug 15 16:07:41 2022
Last change: Mon Aug 15 16:07:34 2022 by root via crm_resource on Pacemaker-Mysql-01

3 nodes configured
3 resource instances configured

Online: [ Pacemaker-Mysql-01 Pacemaker-Mysql-02 Pacemaker-Mysql-03 ]

Full list of resources:

 Resource Group: mysql-cluster
     db-store	(ocf::heartbeat:Filesystem):	Started Pacemaker-Mysql-03
     mariadb-server	(systemd:mariadb):	Started Pacemaker-Mysql-03
     db-vip	(ocf::heartbeat:IPaddr2):	Started Pacemaker-Mysql-03
crm(live)# configure show type:location
location cli-prefer-mariadb-server mariadb-server role=Started inf: Pacemaker-Mysql-03
# 执行migrate/move操作它都会在配置文件中生成一条位置约束的配置;并且会配置对迁往的节点的倾向性为正无穷

# 资源启停及状态
# resource stop/start/restart/status db-vip

# 删除资源
crm(live)# status
Stack: corosync
Current DC: Pacemaker-Mysql-01 (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum
Last updated: Mon Aug 15 16:16:18 2022
Last change: Mon Aug 15 16:15:49 2022 by root via crm_resource on Pacemaker-Mysql-01

3 nodes configured
3 resource instances configured

Online: [ Pacemaker-Mysql-01 Pacemaker-Mysql-02 Pacemaker-Mysql-03 ]

Full list of resources:

 Resource Group: mysql-cluster
     db-store	(ocf::heartbeat:Filesystem):	Started Pacemaker-Mysql-03
     mariadb-server	(systemd:mariadb):	Started Pacemaker-Mysql-03
     db-vip	(ocf::heartbeat:IPaddr2):	Started Pacemaker-Mysql-03

crm(live)# configure delete 
1                       3                       db-store                mariadb-server          
2                       cib-bootstrap-options   db-vip                  mysql-cluster           
crm(live)# configure delete mysql-cluster
crm(live)# status
Stack: corosync
Current DC: Pacemaker-Mysql-01 (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum
Last updated: Mon Aug 15 16:16:36 2022
Last change: Mon Aug 15 16:16:33 2022 by root via cibadmin on Pacemaker-Mysql-01

3 nodes configured
3 resource instances configured

Online: [ Pacemaker-Mysql-01 Pacemaker-Mysql-02 Pacemaker-Mysql-03 ]

Full list of resources:

 db-store	(ocf::heartbeat:Filesystem):	Started Pacemaker-Mysql-03
 mariadb-server	(systemd:mariadb):	Starting Pacemaker-Mysql-01
 db-vip	(ocf::heartbeat:IPaddr2):	Started Pacemaker-Mysql-02
 
 # 删除了组资源以后,对应资源会重新分散的运行到各个节点,如果有位置约束的,会根据位置约束去运行,没有位置约束会负载均衡的方式分散在集群各节点
 
 # 设置指定资源对节点的倾向性
 设置db-store对Pacemaker-Mysql-01的倾向性为100分
 configure location db-store_01 db-store 100: Pacemaker-Mysql-01
 设置db-store对Pacemaker-Mysql-01的倾向性为正无穷
 configure location db-store_01 db-store inf: Pacemaker-Mysql-01

五、配置托管mysql服务

1、定义托管VIP
# 关闭STONITH选项
#  crm --> configure --> property stonith-enabled=false
# 如果只有两节点,需要关闭仲裁机制
#  crm --> configure --> property set no-quorum-policy=ignore

image20220812162908010.png

# 配置vip
crm(live)configure# primitive db-vip ocf:heartbeat:IPaddr params ip="192.168.91.230" cidr_netmask="24" broadcast="192.168.91.255" nic="ens32" iflabel="ens32:1"
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# show
2、定义托管mariadb
crm(live)configure# primitive mysql-server systemd:mariadb op monitor interval=30s timeout=100s
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# show
3、定义托管nfs共享盘
crm(live)configure# primitive db-store ocf:heartbeat:Filesystem params device="nfs-datashare-server:/data" directory="/opt" fstype="nfs" op monitor timeout=40s interval=10s
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# show
4、定义组,把多个资源归并到一组
crm(live)configure# group mysql-cluster db-store mysql-server db-vip
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# show
node 1: Pacemaker-Mysql-01 \
	attributes standby=off
node 2: Pacemaker-Mysql-02 \
	attributes standby=off
node 3: Pacemaker-Mysql-03 \
	attributes standby=off
primitive db-store Filesystem \
	params device="nfs-datashare-server:/data" directory="/opt" fstype=nfs \
	op monitor timeout=40s interval=10s
primitive db-vip IPaddr \
	params ip=192.168.91.230 cidr_netmask=24 broadcast=192.168.91.255 nic=ens32 iflabel="ens32:1" \
	op monitor interval=10s timeout=20s
primitive mysql-server systemd:mariadb \
	op monitor interval=30s timeout=100s
group mysql-cluster db-store mysql-server db-vip
property cib-bootstrap-options: \
	have-watchdog=false \
	dc-version=1.1.23-1.el7_9.1-9acf116022 \
	cluster-infrastructure=corosync \
	stonith-enabled=false \
	last-lrm-refresh=1660276927

image20220812164454322.png image20220812164616742.png 可以看到db-store mysql-server db-vip三个资源全部迁移在了 Pacemaker-Mysql-01 节点上。查看在Pacemaker-Mysql-01节点是否绑定了VIP、mariadb运行状态及共享盘挂载。 image20220812165347013.png

六、故障测试

1、关闭节点Pacemaker-Mysql-01

关闭Pacemaker-Mysql-01节点或者设置为standby后,使用crm_mon命令实时监控资源迁移过程。

结论:被托管的资源会自动被迁移至其他任意一个节点(由corosync服务进行投票选举)

2、手动关闭mysql服务

手动关闭mariadb服务后,集群在设置的时间内检测到mariadb服务异常后,会自动尝试拉起mariadb服务。

以上通过pacemaker+corosync实现了mysql服务故障自动转移。

pacemaker+corosync之pcs安装使用

1、各集群节点安装程序包
# yum install pacemaker pcs psmisc policycoreutils-python -y
2、启动各节点pcsd并设置开启自启动
# systemctl enable pcsd --now
3、集群各节点设置hacluster用户密码
# echo "111111" | passwd --stdin hacluster
4、用户及密码认证
# pcs cluster auth Pacemaker-Mysql-01 Pacemaker-Mysql-02 Pacemaker-Mysql-03
5、创建集群
# pcs cluster setup --name my_cluster Pacemaker-Mysql-01 Pacemaker-Mysql-02 Pacemaker-Mysql-03
6、启动集群并设置开机自启动
# pcs cluster start --all
# pcs cluster enable --all
# pcs cluster status --all
7、查看集群状态
# pcs cluster status
8、关闭stonith
# pcs property set stonith-enabled=false

# 集群如果为两台,需要再关闭仲裁机制
# pcs property set no-quorum-policy=ignore
# 验证集群配置信息,没有提示表示正常
# crm_verify -LV
9、配置vip资源
# pcs resource create db-vip ocf:heartbeat:IPaddr2 ip="192.168.91.230" nic="ens32" cidr_netmask="24" op monitor timeout=10s
10、设置共享文件存储资源
# pcs resource create db-store  ocf:heartbeat:Filesystem device="nfs-datashare-server:/data" directory="/opt" fstype="nfs" op monitor timeout=40s
11、设置mariadb资源
# pcs resource create mariadb-server systemd:mariadb op monitor timeout=5s
12、设置资源组
# pcs  resource group add mysql-cluster db-store mariadb-server db-vip
13、常用命令
# 查看已配置的资源
# 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
# 显示资源对集群各节点的倾向性分数
# crm_simulate -sL

如果文章对您有帮助,还想了解更过关于k8s相关的实战经验,请微信扫描下方二维码关注“IT运维图谱”公众号或着通过微信搜一搜关注公众号。 扫码_搜索联合传播样式-白色版.png