梧州市网站建设_网站建设公司_产品经理_seo优化
2025/12/19 15:51:27 网站建设 项目流程

在生产环境中,单节点故障可能导致整个业务系统瘫痪,高可用组件的核心价值就在于通过故障自动检测、资源接管,实现服务“秒级切换”,将停机时间降至最低。

一、高可用核心概念与组件选型

(一)高可用基础认知

高可用(HA,High Availability)通常用“几个9”衡量:

  • 99.9%:每年停机≤8.76小时
  • 99.99%:每年停机≤52.56分钟
  • 99.999%:每年停机≤5.26分钟
    实现高可用的核心逻辑:冗余部署+故障检测+自动切换,其中Keepalived和Heartbeat是实现这一逻辑的核心组件。

(二)Keepalived vs Heartbeat 选型对比

特性 Keepalived Heartbeat(Heartbeat V3/PCS)
核心协议 VRRP(虚拟路由冗余协议) CCM(集群通信机制)+ STONITH
部署复杂度 低(单配置文件,无需依赖) 中(需配置集群资源、stonith设备)
故障检测方式 网卡心跳+脚本检测(如检测Nginx存活) 网络心跳+资源状态检测
切换速度 秒级(默认1-3秒) 秒级(可配置,略慢于Keepalived)
适用场景 负载均衡器、Web服务、简单应用集群 数据库集群、存储集群、复杂资源管理
资源接管能力 主要接管VIP、服务进程 支持磁盘挂载、数据库服务、VIP等复杂资源
社区活跃度 高(持续维护) 低(Heartbeat V2停止维护,PCS为替代方案)

选型建议

  • 简单场景(如Nginx高可用、单服务VIP切换):优先Keepalived(部署快、维护成本低);
  • 复杂场景(如MySQL主从切换+存储挂载):选择Heartbeat/PCS(资源管理能力强)。

二、Keepalived实战:从部署到故障自动切换

(一)Keepalived核心原理

Keepalived基于VRRP协议实现:

  1. 角色划分:主节点(MASTER)、备节点(BACKUP),主节点持有虚拟IP(VIP),对外提供服务;
  2. 心跳检测:主备节点通过组播/单播发送VRRP报文(默认1秒一次),备节点监控主节点心跳;
  3. 故障切换:若备节点连续3次未收到主节点心跳(可配置),则判定主节点故障,备节点升级为主节点,接管VIP和服务;
  4. 脑裂防护:通过优先级(priority)、认证密码避免多主节点冲突。

(二)环境准备

节点角色 IP地址 操作系统 需安装软件 核心服务
主节点 192.168.1.10 CentOS 7.9 keepalived、nginx nginx
备节点 192.168.1.11 CentOS 7.9 keepalived、nginx nginx
VIP 192.168.1.100 - - -

(三)Keepalived部署步骤

1. 安装Keepalived

# 主备节点均执行
yum install -y keepalived
# 验证安装
keepalived -v

2. 配置主节点(192.168.1.10)

编辑/etc/keepalived/keepalived.conf

! Configuration File for keepalivedglobal_defs {router_id LVS_MASTER  # 节点标识(主备需不同)script_user root root # 执行监控脚本的用户enable_script_security # 启用脚本安全检查
}# 定义监控Nginx的脚本
vrrp_script chk_nginx {script "/etc/keepalived/nginx_check.sh"  # 监控脚本路径interval 2  # 每2秒检查一次weight -20  # 检查失败,节点优先级减20fall 3      # 连续3次失败判定为异常rise 2      # 连续2次成功恢复正常
}# VRRP实例配置
vrrp_instance VI_1 {state MASTER  # 角色为主节点interface eth0 # 绑定VIP的网卡(根据实际修改)virtual_router_id 51 # 虚拟路由ID(主备需一致,范围0-255)priority 100  # 优先级(主节点高于备节点)advert_int 1  # 心跳间隔(1秒)authentication {  # 认证配置(主备需一致)auth_type PASSauth_pass 1111}virtual_ipaddress {  # 虚拟IP(VIP)192.168.1.100/24 dev eth0 label eth0:0}# 绑定监控脚本track_script {chk_nginx}# 主节点故障恢复后是否抢占VIP(默认抢占,可设nopreempt关闭)# nopreempt
}

3. 编写Nginx监控脚本

创建/etc/keepalived/nginx_check.sh

#!/bin/bash
# 检查Nginx进程是否存在
nginx_process=$(ps -C nginx --no-header | wc -l)# 进程不存在则尝试重启
if [ $nginx_process -eq 0 ]; thensystemctl start nginxsleep 3# 再次检查,仍不存在则停止Keepalived,触发切换nginx_process=$(ps -C nginx --no-header | wc -l)if [ $nginx_process -eq 0 ]; thensystemctl stop keepalivedfi
fi

添加执行权限:

chmod +x /etc/keepalived/nginx_check.sh

4. 配置备节点(192.168.1.11)

仅需修改以下参数,其余与主节点一致:

global_defs {router_id LVS_BACKUP  # 备节点标识
}vrrp_instance VI_1 {state BACKUP  # 角色为备节点priority 90   # 优先级低于主节点(100)
}

5. 启动Keepalived

# 主备节点均执行
systemctl start keepalived
systemctl enable keepalived
# 查看状态
systemctl status keepalived

(四)故障切换实战验证

1. 正常状态验证

# 在任意节点执行,查看VIP是否在主节点
ip addr show eth0
# 主节点会显示:inet 192.168.1.100/24 scope global eth0:0

2. 模拟主节点故障

# 主节点停止Nginx
systemctl stop nginx
# 等待3秒,查看Keepalived状态
systemctl status keepalived  # 主节点Keepalived已停止
# 在备节点执行,查看VIP是否接管
ip addr show eth0  # 备节点显示192.168.1.100

3. 故障恢复验证

# 主节点重启Nginx和Keepalived
systemctl start nginx
systemctl start keepalived
# 若开启抢占(默认),主节点会重新接管VIP;关闭抢占则备节点继续持有VIP

(五)Keepalived关键优化配置

  1. 关闭抢占模式:避免主节点恢复后频繁切换,在主节点vrrp_instance中添加:
    nopreempt
    # 需配合state BACKUP(主节点也设为BACKUP,靠优先级选主)
    state BACKUP
    
  2. 单播心跳:默认组播可能被网络拦截,改为单播:
    vrrp_instance VI_1 {# 主节点配置(指向备节点IP)unicast_peer {192.168.1.11}
    }
    
  3. 日志优化:默认日志无输出,添加日志配置:
    global_defs {log_file /var/log/keepalived.loglog_level INFO
    }
    

三、Heartbeat/PCS实战:复杂集群高可用实现

Heartbeat(V3后整合为PCS,Pacemaker/Corosync/Stonith)适合复杂资源管理,以下以MySQL高可用为例讲解部署。

(一)PCS核心原理

  1. Corosync:负责集群节点间通信(心跳),检测节点故障;
  2. Pacemaker:资源管理器,负责资源调度、故障切换;
  3. Stonith:“射杀故障节点”,避免脑裂(如断电、强制释放资源)。

(二)环境准备

节点角色 IP地址 操作系统 需安装软件 核心服务
节点1 192.168.1.20 CentOS 7.9 pcs pacemaker corosync mysqld
节点2 192.168.1.21 CentOS 7.9 pcs pacemaker corosync mysqld
VIP 192.168.1.200 - - -

(三)PCS部署步骤

1. 初始化环境(所有节点)

# 关闭防火墙、selinux
systemctl stop firewalld && systemctl disable firewalld
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config# 安装PCS
yum install -y pcs pacemaker corosync psmisc# 设置hacluster密码(所有节点一致)
echo "123456" | passwd --stdin hacluster# 启动PCS服务
systemctl start pcsd && systemctl enable pcsd

2. 创建集群

# 节点1执行,认证集群节点
pcs cluster auth 192.168.1.20 192.168.1.21 -u hacluster -p 123456# 创建集群(命名为mysql_cluster)
pcs cluster setup --name mysql_cluster 192.168.1.20 192.168.1.21# 启动集群
pcs cluster start --all
# 启用集群开机自启
pcs cluster enable --all

3. 配置集群参数

# 禁用STONITH(测试环境,生产需启用)
pcs property set stonith-enabled=false
# 禁用Quorum(2节点集群)
pcs property set no-quorum-policy=ignore

4. 添加资源(VIP+MySQL)

# 添加VIP资源
pcs resource create VirtualIP ocf:heartbeat:IPaddr2 ip=192.168.1.200 cidr_netmask=24 nic=eth0 op monitor interval=30s# 添加MySQL资源
pcs resource create MySQL ocf:heartbeat:mysql binary="/usr/bin/mysqld_safe" config="/etc/my.cnf" datadir="/var/lib/mysql" op monitor interval=20s timeout=30s op start timeout=60s op stop timeout=60s# 设置资源依赖(VIP先启动,再启动MySQL)
pcs constraint colocation add MySQL with VirtualIP INFINITY
# 设置启动顺序(先启动VIP,再启动MySQL)
pcs constraint order VirtualIP then MySQL

(四)故障切换验证

1. 正常状态

# 查看资源状态
pcs status
# 正常输出:VirtualIP (ocf::heartbeat:IPaddr2):   Started 192.168.1.20
#          MySQL (ocf::heartbeat:mysql):        Started 192.168.1.20

2. 模拟节点1故障

# 节点1停止MySQL
systemctl stop mysqld
# 等待10秒,查看资源状态
pcs status
# 输出:VirtualIP (ocf::heartbeat:IPaddr2):   Started 192.168.1.21
#       MySQL (ocf::heartbeat:mysql):        Started 192.168.1.21

四、集群故障自动切换核心问题解决

(一)脑裂问题(Split Brain)

现象:主备节点均认为自己是主节点,同时持有VIP,导致服务冲突。
解决方案

  1. Keepalived:启用认证密码、单播心跳,配置nopreempt
  2. Heartbeat/PCS:启用STONITH(如配置IPMI断电),执行:
    pcs stonith create stonith_ipmi fence_ipmilan ipaddr=192.168.1.254 login=admin passwd=123456 op monitor interval=60s
    
  3. 增加仲裁节点(Quorum):3节点集群,需2个节点确认故障才切换。

(二)切换延迟问题

现象:故障后切换超过10秒,影响业务。
优化方案

  1. Keepalived:缩短心跳间隔(advert_int 1),减少检测次数(fall 2);
  2. PCS:调整资源监控间隔(op monitor interval=5s);
  3. 简化切换逻辑:避免切换时执行复杂脚本(如大量数据同步)。

(三)资源接管失败

常见原因

  1. 权限不足:监控脚本/资源启动脚本需赋予执行权限;
  2. 网络问题:心跳端口被防火墙拦截(Keepalived默认VRRP端口112,Corosync默认5404/5405);
  3. 资源依赖缺失:如MySQL切换时未挂载数据盘。

五、高可用集群最佳实践

(一)监控告警

  1. 监控Keepalived/PCS状态:通过Zabbix/Prometheus监控keepalivedpcsd进程;
  2. 监控VIP状态:脚本定时检测VIP是否存在,不存在则告警;
  3. 监控切换日志:/var/log/keepalived.log/var/log/pacemaker.log,出现切换记录及时排查根因。

(二)灾备演练

  1. 每周模拟单节点故障(停止核心服务/断网),验证切换是否正常;
  2. 每月模拟网络分区(断开主备节点通信),验证脑裂防护是否生效;
  3. 演练后恢复节点,检查数据一致性(如MySQL主从同步)。

(三)性能调优

组件 调优参数 建议值
Keepalived advert_int 1秒
Keepalived fall/rise 2/1
PCS monitor interval 5-10秒
PCS start/stop timeout 30-60秒
通用 心跳网络 独立网卡/交换机

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询