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。心跳网卡建议关闭 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.12 | 0% 丢包 |
| 时间同步 | chronyc tracking | 偏移 < 1s,Leap Normal |
| 防火墙放行 | firewall-cmd --list-all | 含 high-availability 与 5405/udp |
| SELinux | getenforce | Enforcing |