Linux入门攻坚——49、高可用HA之corosync/pacemaker(2)
搭建HA集群
使用corosync+pacemaker搭建HA集群,有两种安装方式,一种是手动单独安装corosync和pacemaker,一种是借助外在的工具,这个工具可以完成HA的全生命周期管理,即从安装到配置到管理。
在CentOS7上,使用corosync v2 + pacemaker组合搭建高可用集群,corosync v2版本已经带有vote system(投票系统),pacemaker作为独立服务运行。
集群的全生命周期管理工具:
pcs:红帽出品的工具
crmsh:suse作品
配置集群的前提:
1)时间同步;
2)基于当前正在使用的主机名可以互相访问;
3)是否会用到仲裁设备;
基本环境:node1:192.168.61.129,node2:192.168.61.130,CentOS7.9
pcs工具及集群配置管理
1、安装pcs:
yum install pcs
从依赖关系看,安装pcs,会同时安装其依赖的包,corosync和pacemaker都会安装
2、两个节点安装完pcs后,要确保时间同步
3、查看节点的主机名:uname -n
建议使用短名称格式
4、确保节点之间通信正常:
ping node1
ping node2
5、启动pcsd服务
systemctl start pcsd.service
systemctl enable pcsd.service
通过rpm -ql pcs,可以看到服务脚本为:/usr/lib/systemd/system/pcsd.service
其程序:/usr/sbin/pcs
要确保在每一个节点上都启动pcsd服务。要对每一节点操作,可以使用前面学过的ansible
编辑/etc/ansible/hosts,增加一个组:
[ha]
192.168.61.129
192.168.61.130
运行:ansible ha -m service -a 'name=pcsd state=started enabled=yes'
校验一下,是否运行正常:
pcsd已经运行,然后看一下其监听的端口:
在tcp的2224端口。
6、给特定用户hacluster设置密码
echo 'password' | passwd --stdin hacluster
ansible ha -m shell -a 'echo "12345678" | passwd --stdin hacluster'
7、pcs集群节点密码认证。
pcsd是每个节点都运行的守护进程,pcs是一个客户端,通过pcs连接pcsd进而来管理各个节点的集群。pcsd不是说随意一个pcs连接都接受,pcs需要对各个集群节点进行认证。
pcs cluster auth node1 node2
想通过哪台节点管理,就需要在那一台上运行一下认证。
8、配置集群,将node1,node2配置成集群,集群名为mycluster
pcs cluster setup --name mycluster node1 node2
命令会先销毁两个节点上的集群,即停止pacemaker,然后发送了pacemaker_remote authkey,即pacemaker的远程秘钥,然后发送集群配置文件,然后同步各节点的证书,重启各节点pcsd进程,重新加载证书。命令执行完毕,会在各节点生成配置文件,如下:/etc/corosync/corosync.conf
配置文件中配置了totem,即集群的特征标志,如集群名等,在心跳信息中会携带,节点列表,即集群中包含的各节点信息,quorum,法定票数,即仲裁,这里的仲裁者是corosync_votequorum,即corosync自己的仲裁程序。logging,配置日志信息,日志信息可以同时保存到系统日志,即to_syslog,也可同时保存到指定文件。
9、启动集群
pcs cluster start --all
查看是否启动成功:ps aux
10、检查集群启动状态
检查节点通信状态(显示为no faults即为OK):corosync-cfgtool -s
检查集群成员关系及Quorum API:corosync-cmapctl | grep members
查看集群的状态:pcs status
这里看到一条WARNINGS,警告,配置中启用了stonith但是没有stonith设备,这个可以通过命令关闭stonith功能。pcs property set stonith-enabled=false
实际就是集群全局属性的配置,可使用pcs property list --all查看全部可配置属性
这里的DC很重要,DC——Dedicated Coordinating node,协调节点,负责维护主配置信息的核心节点,完成主配置维护、同步与协调、高可用性保障。
crm_verify -L -V,查看集群配置是否有问题:
pcs具有很多子命令,可以查看帮助:
对子命令也可以继续查看帮助,如:
pcs cluster -h, pcs property -h等
对于集群的管理接口,除了pcs,还有一个crmsh比较好用,但是需要单独下载安装。
crmsh的安装:
下载,需要下载:
crmsh-3.0.0-6.2.noarch.rpm
crmsh-scripts-3.0.0-6.2.noarch.rpm
pssh-2.3.1-7.3.noarch.rpm
python-parallax-1.0.1-29.1.noarch.rpm
python-pssh-2.3.1-7.3.noarch.rpm
安装:yum install *.rpm
很是尴尬的一件事是,这些个较老版本的软件在网上很难下载到。
crmsh3离线安装包-for CentOS7
crmsh的使用:
crmsh类似于ansible,是借助于ssh来完成命令的执行,而pcs是需要代理的,即需要每个节点运行pcsd。
1、crm help,查看crm的帮助,crm有众多的子命令,子命令下还有子命令。
2、crm status,查看集群状态:
crm有交互状态,运行crm,进入交互界面,在交互界面输入子命令等,类似shell
配置一个高可用web服务集群:
web service:
vip:192.168.61.100
httpd
这里需要两个资源,一个是vip,即对外表现的ip,访问的入口,一个是httpd服务进程,提供web服务。
1、在node1和node2上安装并配置完成httpd服务,确保运行正常:
node1:192.168.61.129,node2:192.168.61.130
服务正常后,需要停止服务,集群自己确定启动哪个节点的服务。
在CentOS6上,必须确保服务不能开机自启动,即chkconfig httpd off
而在CentOS7上,必须保证设置了开机自启动,即systemctl enable httpd.service(CentOS7使用了systemd,即使配置了开机自启动,也不代表开机后服务一定启动,首次访问运行)
2、配置集群服务资源
任何一个资源要配置到集群服务上使用,只能通过资源代理来实现。
查看当前可用的资源代理,可以使用crm ra classes
也可以进入交互模式查看:
代理的类别有lsb、ocf、service和systemd,ocf又按照提供者,即provider分为heartbeat、pacemaker等子类别。
使用list <classes> [<provider>]查看具体类别的资源:
对于lsb,对应的是/etc/rc.d/init.d/目录下的脚本文件
ocf下的子类,对应的是/usr/lib/ocf/resource.d/目录下的子目录,而对应的子类资源,则是对应子目录下的脚本,如下
systemd类别的资源对应/usr/lib/systemd/system/下的unit(或是/etc/systemd/system/下的unit),service感觉与systemd一样,通用服务类型。
llist service和list systemd显示的资源中都有httpd。
查看具体资源的详细信息,使用info子命令:
info [<class>:[<provider>:]]<type>
如:info ocf:heartbeat:IPaddr
配置资源,需要在configure界面完成:
IP地址是主资源(也叫原始资源),需要使用primitive进行配置,用法:
配置web服务的虚拟IP地址:
使用status,可以查看集群的状态:
可以看到,webvip资源运行在node1上,可以使用ip addr show查看:
ifconfig命令看不到。
可以手工进行资源切换,进入node命令,执行standby,将节点转为备用:
将node1重新上线,上面standby叫做旁路状态或软下线状态更合适,node1重新上线,使用online命令:
配置第二个主资源:httpd
可以看到集群有两个资源了,但是这两个资源分别处于不同的节点上,这不是期望的,期望的是这个资源总是在一个节点上。要使它们总在一起,可以定义成组资源:
因为此时组资源是在node2上,这时访问web服务:即vip:192.168.61.100
将node2进行standby操作:
可以看到,资源切换到node1上了,访问192.168.61.100:
配置资源的粘性,即对节点的倾向性,使用configure下的property的default-resource-stickiness属性,设置资源的默认粘性:
如果直接关闭node1电源,查看状态:
对于两节点系统,因为在全局设置中,即/etc/corosync/corosync.conf中,quorum中two_node: 1,即设置为双节点系统,所以即使一个节点掉电,只剩一个节点,其依然是with quorum。将two_node设为0,再次停止node1节点:
集群服务停了,虽然还有一个节点正常。
这种情况还是可以通过configure的property的no-quorum-policy=来设置,
没有配置时,即默认是stop,所以上面测试,只剩下一个节点,处于WITOUT Quorum时,服务是stoped。