3. 实验环境规划与集群节点准备

在真正安装 Pacemaker、Corosync 之前,实验环境本身的设计质量往往决定了后续排障的难度。一个规划良好的两节点或三节点集群,应当让心跳、业务、管理三类流量在物理或逻辑上彼此隔离,让每台节点的主机名与 DNS 解析在集群内外保持一致,让所有节点的时间偏差控制在毫秒级,并且提前把防火墙与 SELinux 策略调整到"允许集群组件通信、但不盲目关闭安全机制"的状态。本节围绕这四件事展开,并给出可直接套用的规划示例。

一、拓扑设计:虚拟机还是裸机

教学与验证阶段,推荐使用虚拟机搭建 3 节点集群,原因是快照回滚成本低、可反复破坏性实验。但虚拟机有一个必须正视的缺陷:如果所有节点都跑在同一台物理宿主机上,宿主机宕机时"集群"会整体消失,无法验证真实的高可用语义。因此更合理的做法是:至少把节点分散到两台物理宿主机,或者使用一台物理机加两台虚拟机的混合拓扑。生产环境则优先裸机,且要求节点之间具备独立的心跳链路。

拓扑上建议采用"双网卡起步、三网卡更佳"的形态:

  • 心跳网络:节点之间点对点或经独立交换机互联,承载 Corosync 的 ring0/ring1 与 Pacemaker 的成员探测流量,不跑业务。
  • 业务网络:对外提供 VIP 与服务的网段,客户端从这里访问。
  • 管理网络:用于 SSH、pcs 管理、监控采集,可与业务网合并,但不要与心跳网合并。

下面这张图给出一个典型的三节点实验拓扑,包含三类网络的分离关系与地址规划示例。

三节点集群实验拓扑与网络分离 心跳交换机 10.0.0.0/24 业务交换机 192.168.10.0/24 管理交换机 172.16.0.0/24 node1 eth0 心跳 10.0.0.11 eth1 业务 192.168.10.11 eth2 管理 172.16.0.11 node2 eth0 心跳 10.0.0.12 eth1 业务 192.168.10.12 eth2 管理 172.16.0.12 node3 eth0 心跳 10.0.0.13 eth1 业务 192.168.10.13 eth2 管理 172.16.0.13 业务 VIP 192.168.10.100 由 Pacemaker 在节点间漂移 客户端 / 测试机 图例 心跳链路 业务链路 VIP 漂移路径

二、网络规划与地址分配

三类网络必须使用互不重叠的网段,且心跳网段不要与业务网段处于同一广播域。上例中:心跳 10.0.0.0/24、业务 192.168.10.0/24、管理 172.16.0.0/24。心跳网卡建议关闭 NetworkManager 的自动管理,改用 ifcfg 或 nmcli 静态配置,避免 DHCP 续租导致地址漂移。

# 以 node1 心跳网卡为例(nmcli 方式)
nmcli con mod eth0 ipv4.method manual \
  ipv4.addresses 10.0.0.11/24 \
  ipv4.gateway "" \
  connection.autoconnect yes
nmcli con up eth0

# 验证
ip -4 addr show eth0
ping -c 2 10.0.0.12

心跳网段通常不配置默认网关,防止节点把管理流量误走心跳链路。若使用双心跳(ring0/ring1),可再增加一块网卡或使用 bond,Corosync 会分别绑定到两个地址。

三、主机名与 DNS 解析

集群节点的主机名必须满足两个条件:一是与 hostname 输出一致,二是能被所有节点正反向解析。推荐使用短名加 FQDN 的方式,例如 node1.cluster.local。教学环境可直接写 /etc/hosts,生产环境应使用内部 DNS。

# 三节点统一写入 /etc/hosts
cat >> /etc/hosts <<'EOF'
10.0.0.11  node1.cluster.local node1
10.0.0.12  node2.cluster.local node2
10.0.0.13  node3.cluster.local node3
EOF

hostnamectl set-hostname node1.cluster.local
# 验证正反向解析
getent hosts node1
getent hosts 10.0.0.11
注意:/etc/hosts 中不要同时出现同一主机名的多个 IP,否则 Corosync 可能解析到错误地址,导致成员无法加入。修改主机名后务必重启一次,或至少重新登录,确保 shell 提示符与解析结果一致。

四、时间同步 chrony

集群的成员探测、日志时间戳、资源状态判断都依赖一致的时间。时间偏差过大时,可能出现"节点认为对方已死、对方却认为自己正常"的脑裂式误判。因此所有节点必须启用 chrony,并指向同一时间源。

# 安装并配置 chrony
dnf install -y chrony
cat > /etc/chrony.conf <<'EOF'
server ntp.aliyun.com iburst
server time.cloudflare.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
EOF

systemctl enable --now chronyd
chronyc sources -v
chronyc tracking

判断同步是否成功的依据:chronyc tracking 中 System time 偏移应小于 1 秒,Leap status 为 Normal;chronyc sources -v 中对应源前出现 ^* 表示已选中。若三节点都指向同一上游,节点间偏差通常可控制在毫秒级。

五、防火墙与 SELinux 预配置

不建议直接 systemctl stop firewalld 或 setenforce 0 了事,那样会掩盖真实问题。正确做法是放行集群所需端口,并保持 SELinux 处于 enforcing 状态。

# 放行集群组件端口
firewall-cmd --permanent --add-service=high-availability
firewall-cmd --permanent --add-port=2224/tcp   # pcsd
firewall-cmd --permanent --add-port=3121/tcp   # pcsd 旧端口
firewall-cmd --permanent --add-port=5405/udp   # corosync
firewall-cmd --permanent --add-port=21064/tcp  # corosync-qdevice
firewall-cmd --reload
firewall-cmd --list-all

# SELinux 保持 enforcing,仅确认策略包存在
getenforce
sestatus
dnf install -y selinux-policy-targeted

若后续使用 pcs 管理,还需确保 pcsd 服务在各节点启动并设置 hacluster 用户密码,这是节点间互信的前提。完成以上五步后,可用一张检查表快速确认环境就绪。

检查项命令期望结果
主机名一致hostname -f返回 FQDN,与 hosts 一致
正反向解析getent hosts node2返回 10.0.0.12
心跳连通ping -c 2 10.0.0.120% 丢包
时间同步chronyc tracking偏移 < 1s,Leap Normal
防火墙放行firewall-cmd --list-all含 high-availability 与 5405/udp
SELinuxgetenforceEnforcing
建议在完成本节所有配置后,对每台节点做一次快照。后续安装 Corosync/Pacemaker 时若出现成员无法加入、资源无法启动等问题,可快速回滚到"干净且一致"的基线环境,把排障精力集中在集群配置本身,而不是环境差异上。