高可用(HA)集群之pacemaker+corosync方案
近期公司领导要求寻找一个MySQL数据库故障自动转移的高可用方案,用户替换目前生产环境的主从架构,通过查阅互联网资料,找到了很多高可用部署方案,其中对pacemaker+corosync的高可用架构方案印象深刻,以下形成具体的操作文档用以记录技术探索道路上的点点滴滴。
一、概念
在传统Linux集群种类中,主要分了三类:
一类是LB(负载均衡)集群,这类集群的作用是对用户流量做负载均衡,让其后端每个real-server都能均衡的处理一部分请求;
其次就是HA(高可用)集群,所谓ha集群就是高可用集群,这类集群的作用是对集群中的单点做高可用,就是在发生故障时,能够及时的将故障转移,从而使故障修复时间最小;HA集群的特点是在众多台节点上,各个空闲节点会一直盯着工作节点,工作节点也会基于多播或广播的方式把自己的心跳信息发送给其他空闲节点,一旦工作节点的心跳信息在一定时间内空闲节点没有收到,那么此时就会触发资源抢占,先抢到资源的成为新的工作节点,而其他节点又会一直盯着新的工作节点,直到它挂掉,然后再次触发资源抢占;这类集群的特点就是一个节点工作,其他节点看着它工作,一旦工作节点挂了,立刻会有其他节点上来顶替它的工作;
最后就是HP集群,HP集群主要用于在复杂计算中场景中,把多台server的算力综合一起,对复杂计算要求比较高的环境中使用;在生产环境中常见的LB和HA集群较多
高可用架构由两个核心部分组成,一个是心跳检测,判断服务器是否正常运行;一个是资源转移,用来将公共资源在正常服务器和故障服务器之间搬动。两个结合起来使用,可以实现对高可用架构的自动管理。
CoroSync是运行于心跳层的开源软件; PaceMaker是运行于资源转移层的开源软件。 使用corosync监控心跳及投票,pacemaker实现资源转移,crmsh实现集群资源配置;同时使用fence检查节点健康状况,实行跳电保护,防止脑裂发生。
二、集群规划
VIP:192.168.91.230
主机名 安装软件 ip地址 Pacemaker-Mysql-01 pacemaker、corosync、mariadb-server、crmsh 192.168.91.168 Pacemaker-Mysql-02 pacemaker、corosync、mariadb-server 192.168.91.169 Pacemaker-Mysql-03 pacemaker、corosync、mariadb-server 192.168.91.167 nfs-datashare-server nfs、nfs-utils 192.168.91.170mariadb与nfs-server安装忽略
三、corosync+pacemaker的安装配置
安装配置前操作(所有节点)
以其中一节点操作为例
1、时间同步
2、关闭selinux和系统防火墙
3、主机名解析
安装配置
# 安装 # 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 pacemakerpacemaker默认不需要怎么配置就可以启动,启动以后,我们可以通过管理接口来配置。
# crm_mon至此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=12、安装crmsh配置工具
# yum install crmsh -y3、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 # 配置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# show2、定义托管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# show3、定义托管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# show4、定义组,把多个资源归并到一组
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可以看到db-store mysql-server db-vip三个资源全部迁移在了 Pacemaker-Mysql-01 节点上。查看在Pacemaker-Mysql-01节点是否绑定了VIP、mariadb运行状态及共享盘挂载。
六、故障测试
1、关闭节点Pacemaker-Mysql-01
关闭Pacemaker-Mysql-01节点或者设置为standby后,使用crm_mon命令实时监控资源迁移过程。
结论:被托管的资源会自动被迁移至其他任意一个节点(由corosync服务进行投票选举)
2、手动关闭mysql服务
手动关闭mariadb服务后,集群在设置的时间内检测到mariadb服务异常后,会自动尝试拉起mariadb服务。
以上通过pacemaker+corosync实现了mysql服务故障自动转移。