CentOS 7上具有Pacemaker,Corosync和DRBD的主动/被动群集

时间:2020-03-21 11:43:57  来源:igfitidea点击:

将介绍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:

HostnameLAN IP
pcmk01, vm-pcmk0110.247.50.211
pcmk02, vm-pcmk0210.247.50.212
pcmk-vip (floating cluster resource)10.247.50.213
HostnameCorosync IP
pcmk01-cr172.16.21.11
pcmk02-cr172.16.21.12
HostnameDRBD IP
pcmk01-drbd172.16.22.11
pcmk02-drbd172.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

现在,我们已经安装了一个起搏器集群,并在两个节点上运行。