CentOS 7上具有Pacemaker,Corosync和DRBD的主动/被动群集
将介绍Pacemaker,Corosync,Apache,DRBD和VMware STONITH代理的安装和配置。
这里的目的是使用Apache和DRBD构建一个主动/被动Pacemaker集群。
开始之前
Pacemaker是用于Linux平台的复杂,功能丰富且部署广泛的群集资源管理器。
Pacemaker的核心是一个分布式有限状态机,它能够协调一组机器之间相互关联的服务的启动和恢复。
通过使用首选群集基础结构(OpenAIS或者Heartbeat)提供的消息传递和成员资格功能,Pacemaker通过检测节点和资源级故障并从节点和资源级故障中恢复来实现群集服务(即资源)的最大可用性。
Pacemaker是CRM(又称v2资源管理器)的延续,该CRM最初是为Heartbeat开发的,但此后已成为自己的项目。
我们将构建一个故障转移群集,这意味着服务可以分布在所有群集节点上。
起搏器堆栈
Pacemaker堆栈基于五个核心组件构建:
- <strong> libQB </strong> –核心服务(日志记录,IPC等),
- <strong> Corosync </strong> –成员资格,消息和法定人数,
- <strong>资源代理</strong> –与脚本管理的基础服务交互的脚本集合,
- <strong>防护代理</strong> –与网络电源交换机和SAN设备进行交互以隔离集群成员的脚本的集合,
- <strong>起搏器</strong>本身。
从RHEL 6.5开始,完全支持个人计算机和起搏器,请参见此处以了解更多信息:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/High_Availability_Add-On_Reference/s1-pacemaker65-70- HAAR.html。
pcs软件包提供了一个命令行工具,用于配置和管理corosync和心脏起搏器实用程序。
RHEL 7用Pacemaker代替了RGManager,用于管理群集资源并从节点故障中恢复。
Pacemaker配置工具
- <strong> crmsh </strong> – Pacemaker的原始配置shell,
- <strong> pcs </strong> – Pacemaker/Corosync配置系统,它是完整集群生命周期配置shell和基于Web的GUI的替代方案。
请注意,原始群集shell程序(crmsh)在RHEL上不再可用。
pcs命令行界面提供了控制和配置corosync和起搏器的功能。
Linux-HA最佳实践
为了具有弹性,每个群集至少应具有两个Corosync(读取:心跳)环和两个防护设备,以消除单点故障。
说明
该系列中遵循的约定是[ALL]#表示需要在所有群集计算机上运行的命令。
软件
该系列中使用的软件:
- CentOS Linux版本7.2.1511(核心)
- 起搏器-1.1.13
- corosync-2.3.4
- 个-0.9.143
- 资源代理-3.9.5
- fence-agents-vmware-soap-4.0.11
- drbd-8.4
网络,防火墙和SELinux配置
我们将使用Pacemaker和Corosync构建两个节点的主动/被动群集。
我们在VMware上有两个CentOS 7虚拟机,分别名为vm-pcmk01和vm-pcmk02。
联网
将使用以下网络:
- 10.247.50.0/24 –可以访问互联网的局域网,
- 172.16.21.0/24 –用于Corosync的不可路由的群集心跳线VLAN,
- 172.16.22.0/24 – DRBD的不可路由群集心跳线VLAN。
我们分配的主机名和IP:
Hostname | LAN IP |
pcmk01, vm-pcmk01 | 10.247.50.211 |
pcmk02, vm-pcmk02 | 10.247.50.212 |
pcmk-vip (floating cluster resource) | 10.247.50.213 |
Hostname | Corosync IP |
pcmk01-cr | 172.16.21.11 |
pcmk02-cr | 172.16.21.12 |
Hostname | DRBD IP |
pcmk01-drbd | 172.16.22.11 |
pcmk02-drbd | 172.16.22.12 |
"/etc/hosts"文件条目如下所示:
[ALL]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.247.50.211 pcmk01 vm-pcmk01 10.247.50.212 pcmk02 vm-pcmk02 10.247.50.213 pcmk-vip 172.16.21.11 pcmk01-cr 172.16.21.12 pcmk02-cr 172.16.22.11 pcmk01-drbd 172.16.22.12 pcmk02-drbd
可以在下面看到第一个节点的网络配置,除了上面指定的IP外,第二个节点的网络配置相同。
[pcmk01]# cat /etc/sysconfig/network-scripts/ifcfg-ens192 #LAN NAME="ens192" DEVICE="ens192" TYPE="Ethernet" BOOTPROTO="none" DEFROUTE="yes" PEERDNS="yes" IPV4_FAILURE_FATAL="yes" IPV6INIT="no" ONBOOT="yes" IPADDR="10.247.50.211" PREFIX="24" GATEWAY="10.247.50.1" DNS1="8.8.8.8" DNS2="8.8.4.4"
[pcmk01]# cat /etc/sysconfig/network-scripts/ifcfg-ens224 #Corosync ring0 NAME="ens224" DEVICE="ens224" TYPE="Ethernet" BOOTPROTO="none" DEFROUTE="no" PEERDNS="no" IPV4_FAILURE_FATAL="yes" IPV6INIT="no" ONBOOT="yes" IPADDR="172.16.21.11" PREFIX="24"
[pcmk01]# cat /etc/sysconfig/network-scripts/ifcfg-ens256 #DRBD NAME="ens256" DEVICE="ens256" TYPE="Ethernet" BOOTPROTO="none" DEFROUTE="no" PEERDNS="no" IPV4_FAILURE_FATAL="yes" IPV6INIT="no" ONBOOT="yes" IPADDR="172.16.22.11" PREFIX="24"
iptables
本文使用Iptables防火墙。
请注意,CentOS 7使用FirewallD作为默认的防火墙管理工具。
花了很多时间学习Iptables(请参阅:IP伪装NAT后路由WTH?),我们可以肯定地说,我们知道所有尸体都埋其中……不过,我们热衷于一天学习防火墙D。
选择显然是您的选择,但是,以下是用Iptables替换FirewallD服务的方法:
[ALL]# systemctl stop firewalld.service [ALL]# systemctl mask firewalld.service [ALL]# systemctl daemon-reload [ALL]# yum install -y iptables-services [ALL]# systemctl enable iptables.service [ALL]# service iptables save
这些是我们正在使用的iptables规则:
[ALL]# iptables -S -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -s 10.0.0.0/8 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT -A INPUT -s 10.0.0.0/8 -p tcp -m multiport --dports 80,443 -j ACCEPT -A INPUT -s 172.16.21.0/24 -d 172.16.21.0/24 -p udp -m multiport --dports 5405 -j ACCEPT -A INPUT -s 172.16.21.0/24 -d 172.16.21.0/24 -p tcp -m multiport --dports 2224 -j ACCEPT -A INPUT -s 10.0.0.0/8 -p tcp -m multiport --dports 2224 -j ACCEPT -A INPUT -s 10.0.0.0/8 -p tcp -m multiport --dports 3121 -j ACCEPT -A INPUT -s 10.0.0.0/8 -p tcp -m multiport --dports 21064 -j ACCEPT -A INPUT -s 172.16.22.0/24 -d 172.16.22.0/24 -p tcp -m multiport --dports 7788,7789 -j ACCEPT -A INPUT -p udp -m multiport --dports 137,138,139,445 -j DROP -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -j LOG --log-prefix "iptables_input " -A INPUT -j DROP
SELinux
SELinux设置为强制模式。
安装Pacemaker和Corosync
[ALL]# yum install -y pcs
这些个人电脑将安装起搏器,corosync和资源代理作为依赖项。
对于SELinux管理:
[ALL]# yum install -y policycoreutils-python
设置hacluster用户的密码:
[ALL]# echo "passwd" | passwd hacluster --stdin
启动并启用服务:
[ALL]# systemctl start pcsd.service [ALL]# systemctl enable pcsd.service
配置Corosync
验证为hacluster用户。
请注意,我们为此使用了专用的Corosync接口。
[pcmk01]# pcs cluster auth pcmk01-cr pcmk02-cr -u hacluster -p passwd pcmk01-cr: Authorized pcmk02-cr: Authorized
授权令牌存储在文件/var/lib/pcsd/tokens
中。
生成并同步Corosync配置
[pcmk01]# pcs cluster setup --name test_webcluster pcmk01-cr pcmk02-cr
在所有节点上启动集群:
[pcmk01]# pcs cluster start --all
(可选)根据要求,我们可以使群集服务在启动时启动:
[ALL]# pcs cluster enable --all
验证Corosync安装:
[pcmk01]# corosync-cfgtool -s Printing ring status. Local node ID 1 RING ID 0 id = 172.16.21.11 status = ring 0 active with no faults
[pcmk01]# pcs status corosync Membership information --------------------- Nodeid Votes Name 1 1 pcmk01-cr (local) 2 1 pcmk02-cr
Corosync配置以供将来参考:
[pcmk01]# cat /etc/corosync/corosync.conf totem { version: 2 secauth: off cluster_name: test_webcluster transport: udpu } nodelist { node { ring0_addr: pcmk01-cr nodeid: 1 } node { ring0_addr: pcmk02-cr nodeid: 2 } } quorum { provider: corosync_votequorum two_node: 1 } logging { to_syslog: yes }
现在让我们检查集群状态:
[pcmk01]# pcs status Cluster name: test_webcluster WARNING: no stonith devices and stonith-enabled is not false Last updated: Sat Dec 12 15:24:14 2014 Last change: Sat Dec 12 15:24:08 2014 by hacluster via crmd on pcmk02-cr Stack: corosync Current DC: pcmk02-cr (version 1.1.13-a14efad) - partition with quorum 2 nodes and 0 resources configured Online: [ pcmk01-cr pcmk02-cr ] Full list of resources: PCSD Status: pcmk01-cr: Online pcmk02-cr: Online Daemon Status: corosync: active/enabled pacemaker: active/enabled pcsd: active/enabled
我们还可以使用以下命令查看原始(XML)集群的配置和状态:
[pcmk01]# pcs cluster cib [pcmk01]# cibadmin -Q
如果检查原始输出,则可以看到Pacemaker配置XML文件包含以下部分:
- <配置>
- <节点>
- <资源>
- <约束>
- <状态>
禁用STONITH
检查可用的STONITH代理的列表,该列表应该为空:
[pcmk01]# pcs stonith list
由于我们未安装任何代理,因此暂时禁用STONITH,但是,我们将在本系列的后面部分对其进行配置:
[pcmk01]# pcs property set stonith-enabled=false [pcmk01]# crm_verify -LV
在生产环境中,启用STONITH至关重要。
请注意,对于生产集群,完全不适合使用stonith-enabled = false,这可能会花费您宝贵的工作。
在所有群集设置中都应考虑到STONITH/fencing操作,但尤其是在运行双主设置时,因为在这种情况下,可以同时从一个以上的节点访问数据。
禁用法定人数
使用STONITH时,可能会出现以下错误:
ERROR: "Cannot fence unclean nodes until quorum is attained (or no-quorum-policy is set to ignore)"
检查仲裁属性:
[pcmk01]# pcs property list --all|grep quorum no-quorum-policy: stop
当一半以上的节点处于联机状态时,群集具有仲裁。
如果群集没有仲裁,Pacemaker的默认行为是停止所有资源。
但是,在两节点群集中这没有多大意义。
如果一个节点发生故障,群集将失去仲裁。
我们可以通过设置no-quorum-policy来告诉Pacemaker忽略仲裁:
[pcmk01]# pcs property set no-quorum-policy=ignore
现在,我们已经安装了一个起搏器集群,并在两个节点上运行。