群集 是一组计算机(称为节点/成员),可以一起工作以执行任务的业务模型。群集根据应用场景可以分为四种类型,分别是存储群集;高可用性群集;负载均衡群集和高性能计算群集。在生产环境中,HA(高可用性)和 LB(负载均衡)群集是群集环境中部署最多的群集类型。它为终端用户提供了不间断的服务/数据可用性。HA 群集配置有时分为两种模式:主动-主动和主动-被动。

  • 主动-主动模式:通常至少需要两个节点,两个节点在同一服务/应用程序上主动运行。这主要用于实现负载均衡(LB)群集,以在节点之间分配工作负载。
  • 主动-被动模式:至少需要两个节点才能提供完全冗余的系统。此时,服务/应用程序一次仅在一个节点上运行,并且主要用于实现高可用性(HA)群集,因为一个节点将是活动的,而另一个节点将是备用的(被动)。

本文将演示如何在 CentOS 7 系统配置高可用(HA)群集,在我们的设置中,将仅关注高可用性(即主动-被动模式,也可以称为故障转移群集)。在 HA 群集中的节点,可以相互跟踪其他节点的状态,在节点出现故障时将服务迁移到其他节点。另外,节点的故障对于群集外部的客户端来说是看不到的,但是在迁移期间会有很小的服务中断。

RedHat / Centos 7 中的高可用性群集与以前的版本完全不同。从 RedHat 7 开始,”pacemaker”成为默认的集群资源管理器(RM),Corosync 负责与其他群集节点定期交换和更新群集信息。Pacemaker 和 Corosync 都是非常强大的开源工具,它们完全替代了RedHat 之前版本中使用的 CMAN 和 RGManager。

本教程将演示如何在 CentOS 7 系统上配置具有公共 iscsi 共享存储的高可用性(HA)/故障转移群集。这些内容将适合 RHEL/CentOS/Fedora,只需要对其中的部分内容做较少的改动。

1] 实验环境

本教程将使用三台主机,两台为 HA 群集节点,另外一台为  iSCSI 目标服务器。

  • HA 节点1
    • 主机名:node-1
    • IP 地址:172.16.200.1
    • 操作系统:CentOS 7
  • HA 节点2
    • 主机名:node-2
    • IP 地址:172.16.200.2
    • 操作系统:CentOS 7
  • 浮动 IP:172.16.200.3
  • iSCSI 目标服务器
    • 主机名:iscsi-server
    • IP 地址:172.16.200.4
    • 操作系统:CentOS 7

2] 配置共享存储服务器(iSCSI 目标)

在 iSCSC 服务器执行如下命令,查看服务器块文件信息:

# lsblk

输入信息如下:

图.1 iSCSI 目标服务器块存储信息

使用上面的命令,就可以用树状格式列出主机所有块设备。示例将配置”/dev/sdb”作为群集节点的共享存储。

特别提示:

共享存储是所有高可用群集的重要资源之一,因为它为集群中的所有节点提供相同类型的应用程序数据,并且可以让群集中所有节点的应用程序进行访问。在生产环境中,SAN 存储将被广泛使用。示例中,我们将 iSCSI 共享存储用于HA群集。

现在更新 iSCSI 服务器的系统并安装相应工具:

# yum update -y
# yum install targetcli -y

安装好后,使用 targetcli 工具,按如下步骤创建 iSCSI 目标:

1. 创建块存储设备

/> cd /backstores/block
/> create iscsilun1 /dev/sdb

2. 创建 iSCSI 目标

/> cd /iscsi
/> create iqn.2021-01.local.server-iscsi:server

3. 创建 ACLs

/> cd /iscsi/iqn.2021-01.local.server-iscsi:server/tpg1/acls
/> create iqn.2021-01.local.client-iscsi:client1

4. 创建 LUNs

/> cd /iscsi/iqn.2021-01.local.server-iscsi:server/tpg1/luns
/> create /backstores/block/iscsilun1

5. 启用 CHAP 认证

/> cd /iscsi/iqn.2021-01.local.server-iscsi:server/tpg1/
/> set attribute authentication=1
/> cd /iscsi/iqn.2021-01.local.server-iscsi:server/tpg1/acls/iqn.2021-01.local.client-iscsi:client1/
/> set auth userid=rultr
/> set auth password=rultr
/> cd /
/> saveconfig

全部配置完成后,在 targetcli 工具命令行使用 ls 命令查看全部配置,典型输出如下所示:

图.2  iSCSI 目标配置详情

iSCSI 目标配置完成了,开启防火墙端口并关闭 SELinux,启动 target 服务后,就完成了 iSCSI 目标服务器的配置:

# firewall-cmd --add-service=iscsi-target --permanent --zone=public
# firewall-cmd --reload
# systemctl enable --now target 
# systemctl status target

2] 配置高可用(HA)群集

配置 HA 群集之前,先将如下内容添加至”/etc/hosts”文件中,以便通过主机名识别主机:

172.16.200.1    node-1
172.16.200.2    node-2
172.16.200.4    iscsi-server

两台节点主机均安装 iSCSI 启动器工具,连接使用共享存储:

# yum install iscsi-initiator-utils -y

启动器安装成功后,编辑”/etc/iscsi/initiatorname.iscsi”文件,将启动器名称设置为与 iSCSI 目标服务器的一致:

InitiatorName=iqn.2021-01.local.client-iscsi:client1

启动 iscsid 服务:

# systemctl enable --now iscsid
# systemctl status iscsid

由于目标服务器配置了CHAP 认证,所以需要修改 iscsi 服务的配置文件”/etc/iscsi/iscsid.conf”,配置 CHAP 认证信息:

# systemctl enable --now iscsid

全部完成后,使用如下命令发现并连接 iSCSI 目标:

# iscsiadm --mode discoverydb --type sendtargets --portal iscsi-server --discover
# iscsiadm -m node --login
# lsblk

图.3 HA 节点连接 iSCSI 共享存储

可以看到,iSCSI 目标已经被系统所识别。之后就可以格式化该设备并将它挂载到系统目录:

# mkfs.xfs /dev/sdb
# mkdir -p /iscsi
# mount /dev/sdb /iscsi/

两台主机均挂载成功后,修改”/etc/fstab”文件,添加如下内容,以使目标卷开机自动挂载到系统:

/dev/sdb    /iscsi    xfs    defaults,_netdev    0 0

两个 HA 节点均可以访问共享存储后,继续创建群集。注意以下命令两台 HA 节点均需要执行。

# yum install pcs fence-agents-all -y
# firewall-cmd --add-service=high-availability --zone=public --permanent
# firewall-cmd --reload
# systemctl enable --now pcsd

HA 软件包安装成功后,会自动创建一个”hacluster”用户,来管理高可用程序,使用如下命令为该用户设置密码:

# passwd hacluster

群集节点使用”hacluster”用户在节点之间进行通信,为了能够正确的进行通信,我们需要为此帐户设置一个密码。建议在所有节点上使用相同的密码。

密码设置完成后,使用如下命令验证群集:

# pcs cluster auth node-1 node-2

图.4 验证群集中的所有节点

上面的命令主要用于验证群集中每个节点之间的 pcsd。身份验证只需要执行一次,验证通过后,令牌(授权)密钥文件将保存在以下路径”~/.pcs/tokens 或 /var/lib/pcsd/tokens”中。

群集中所有节点均验证通过后,就可以使用如下命令创建群集了:

#  pcs cluster setup --start --enable --name HA_cluster node-1 node-2

图.5 创建高可用群集

通过上面的命令,我们可以建立一个新群集。使用”–name”参数设置群集的名称,示例中使用”HA_cluster”,并添加了 node- 1 和 node-2 作为群集中的节点。”–start”和”–enable”的参数将同时影响群集中两个节点上的群集服务。

从图.5 的输出中,可以看到群集已成功创建并在两个节点上启动了服务。

最后,将群集设置为开机自动启动,并查看群集状态:

# pcs cluster enable --all
# pcs cluster status

图.6 查看群集状态

以上命令只列出了群集部件的状态,使用”pcs status”命令会显示群集的详细信息,包括节点的详细信息,主机状态和资源信息。

从图.6 的输出中,可以看到群集设置在两个节点上均正常运行,但是尚未配置任何资源。接下来,我们将演示添加一些资源以完成群集的所有设置。

在添加资源之前,我们先验证一下群集配置:

# crm_verify -L -V

图.7 验证群集配置

看到一堆的错误也不要头大,这只是意味着验证工具发现有关 Fencing 设置的一些错误,因为在默认情况下启用了STONITH。演示方便起见,我们将禁用此功能。而对于生产环境的群集,则不建议禁用此项。

Fencing 也称为 STONITH,它是群集中的重要工具之一,用于保护共享存储上的数据不受损坏;当节点之间无法相互通信时,Fencing 起着至关重要的作用,它将分离故障节点访问的共享存储。

对于 Fencing,有两种可用的类型:资源级防护和节点级防护。

在本演示中,由于我们的计算机运行在不支持 Fmware 的环境中,因此我将不运行 Fencing(STONITH),但是在生产环境中实施的用户,请点击 >>这里<< 查看 Fencing 的相关设置。

使用以下命令禁用 STONITH 并忽略仲裁策略,并检查”群集属性”的状态以确保两者均被禁用:

# pcs property set stonith-enabled=false
# pcs property set no-quorum-policy=ignore
# pcs property list

图.8 关闭群集 STONITH 功能

此时,群集的 STONITH 和仲裁策略全部禁用,再次使用之前的命令验证群集配置,也不会出现报错了。

群集架构搭建完成后,就可以为群集添加资源了,没有资源的群集是没有任何实际意义的。在群集服务中,资源可以是物理硬件单元(例如磁盘驱动器),也可以是逻辑单元(例如 IP 地址,文件系统或应用程序)。在群集中,资源一次只能在单个节点上运行。

示例演示中,我们将使用以下资源:

  • HTTP 服务
  • IP 地址
  • 文件系统

我们首先在每个节点均安装 HTTP 服务器,使用 NGINX,安装教程可以参考 >>这里<<

安装完成后,使用以下命令修改服务器主目录以及开启防火墙服务:

# vi /etc/nginx/conf.d/default.conf
    location / {
        root /iscsi/html;
        index index.html index.htm;
    }
# firewall-cmd --add-service=http --zone=public --permanent
# firewall-cmd --reload

为了能够让群集软件监控 NGINX 服务状态,在”/etc/nginx/conf.d/”目录下添加一个”status.conf”配置文件,内容如下:

server {
    listen 8008;
    server_name localhost;

    location / {
        stub_status on;
        access_log off;
    }
}
//开启防火墙
# firewall-cmd --add-port=8008/tcp --zone=public --permanent 
# firewall-cmd --reload

现在开始创建群集资源,我们将添加三个群集资源:名为 NGINX_FS 的文件系统资源,名为 NGINX_VIP 的浮动 IP 地址资源,以及名为 NGINX_WEB 的 Web 服务器资源。使用以下命令将三个资源添加到同一资源组中:

# pcs resource create NGINX_FS Filesystem device="/dev/sdb" directory="/iscsi/" fstype="xfs" --group nginx
# pcs resource create NGINX_VIP IPaddr2 ip=172.16.200.3 cidr_netmask=24 --group nginx
# pcs resource create NGINX_WEB ocf:heartbeat:nginx configfile="/etc/nginx/nginx.conf" httpd="/usr/sbin/nginx" port=8008 status10url="http://localhost" --group nginx

全部配置完成后,就可以使用如下命令查看群集资源状态:

# pcs resource show

图.9 查看群集资源状态

可以看到,所有群集资源均已经启动,并且所有资源均归属于 node-1 节点。

此时,就可以分别查看两个节点的文件系统及 IP 地址信息:

图.10 节点1 文件系统及 IP 地址信息

图.11 节点2 文件系统及 IP 地址信息

可以看出,节点1 已经挂载了”/dev/sdb”卷,并且使用了群集的浮动 IP 地址。而节点2并没有被分配这些群集资源,与之前描述的 HA 群集同时只有一个节点使用资源一致。至于 Nginx 服务也由节点1 来承担,可以通过浏览器分别访问节点1的 IP 地址以及浮动 IP 来进行验证,这里就不再过多演示。

至此,我们已经 CentOS 7 系统上成功配置了两个节点高可用性群集。希望本文能帮助您了解有关”HA /故障转移群集”的一些知识。 如果想要了解更为细致的内容,可以参考相关手册。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注