LVS+Keepalived高可用集群

发布于:2025-05-30 ⋅ 阅读:(18) ⋅ 点赞:(0)

目录

一、Keepalived 双机热备核心原理与基础配置

(一)Keepalived 技术定位与核心功能

(二)VRRP 协议工作机制

1. 基本概念

2. 状态迁移

3. 漂移 IP 实现特点

(三)环境准备与软件安装

1. 实验环境规划

2. 安装步骤

(四)双机热备核心配置解析

1. 主服务器(Master)配置

2. 备用服务器(Backup)配置

3. 关键参数说明

(五)服务控制与状态验证

1. 启动服务前准备

2. 启动服务并验证状态

二、双机热备功能测试与故障切换验证

(一)连通性测试:VIP 漂移验证

1. 客户端持续 Ping 测试

2. 模拟 Master 故障

3. Master 恢复测试

(二)Web 服务切换测试:业务连续性验证

1. 配置测试页面

2. 客户端访问测试

3. 故障切换验证

(三)日志分析:故障切换过程追踪

1. 日志文件位置

2. Master 节点关键日志

3. Backup 节点关键日志

三、LVS+Keepalived 高可用群集构建

(一)群集架构设计

1. 组件分工

2. 工作模式选择:直接路由(DR 模式)

(二)基础环境配置(主 / 从调度器通用)

1. 关闭防火墙与 SELinux

2. 修改主机名

3. 加载 LVS 模块与安装工具

(三)主调度器详细配置

1. 热备与 VIP 配置(同双机热备部分,新增虚拟服务器配置)

2. 关键参数解析

3. 重启服务使配置生效

(四)从调度器配置

(五)Web 节点服务器配置(DR 模式)

1. 配置 VIP 回环接口

2. 调整 ARP 参数(避免 ARP 欺骗)

3. 启动 Nginx 服务并挂载共享存储(示例)

(六)NFS 共享服务器配置(可选,用于数据一致性)

1. 安装 NFS 服务

2. 创建共享目录并设置权限

3. 配置 NFS 共享

4. 启动服务并验证

(七)群集功能测试

1. 负载均衡测试

2. 节点健康检查验证

3. 调度器故障切换测试

4. LVS 规则查看

四、高级配置与优化实践

(一)多虚拟 IP 配置

(二)端口监控与服务联动

(三)权重动态调整

(四)安全加固建议

五、故障排查与常见问题解决

(一)VIP 无法绑定

(二)主备切换失败

(三)节点未被剔除(健康检查失效)


一、Keepalived 双机热备核心原理与基础配置

(一)Keepalived 技术定位与核心功能

Keepalived 最初专为 LVS 负载均衡器设计,核心目标是解决单点故障问题,实现高可用性(HA)。其核心功能包括:

  • 故障切换(Failover):基于 VRRP 协议实现主备节点自动切换,确保服务持续可用。
  • 健康检查(Health Checking):监测 LVS 调度器及后端节点服务器的健康状态,自动剔除故障节点。
  • 虚拟 IP 管理:通过漂移 IP(VIP)实现服务地址透明切换,客户端无需感知后端服务器变化。

(二)VRRP 协议工作机制

1. 基本概念
  • 热备组(VRRP Group):由多台服务器组成,共享一个虚拟 IP 地址(VIP),同一时刻仅一台主服务器(Master)提供服务,其余为备用服务器(Backup)。
  • 虚拟路由器:逻辑上的路由器实体,对应热备组,通过 VIP 对外提供服务。
  • 优先级(Priority):决定主备选举顺序,数值越大优先级越高(范围 1-254,默认 100)。
2. 状态迁移
  • Master 状态:持有 VIP,周期性发送 VRRP 通告(默认 1 秒)。
  • Backup 状态:监听通告,当超时未收到 Master 通告(默认 3 倍通告间隔),触发主备选举。
  • Initialize 状态:初始启动状态,完成配置加载后进入 Backup 或 Master 状态。
3. 漂移 IP 实现特点
  • 无需手动创建虚接口(如 ens33:0),由 Keepalived 根据配置自动管理。
  • VIP 通过路由机制在热备组内迁移,对客户端透明。

(三)环境准备与软件安装

1. 实验环境规划
操作系统 配置 IP 地址 角色 服务
OpenEuler24 2C4G 192.168.10.101 主服务器(Master) Keepalived、Nginx
OpenEuler24 2C4G 192.168.10.102 备用服务器(Backup) Keepalived、Nginx
2. 安装步骤
# 安装Keepalived及依赖工具(ipvsadm用于LVS管理,nginx用于测试服务)
yum install -y keepalived ipvsadm nginx
# 启动Keepalived服务并设置开机自启
systemctl start keepalived
systemctl enable keepalived

(四)双机热备核心配置解析

1. 主服务器(Master)配置
# 进入配置目录
cd /etc/keepalived/
# 复制示例配置文件
cp keepalived.conf.sample keepalived.conf
# 编辑主配置文件
vi keepalived.conf
global_defs {
  router_id HA_TEST_R1  # 本服务器标识,需唯一
}

vrrp_instance VI_1 {
  state MASTER          # 节点状态:MASTER为主服务器,BACKUP为备用
  interface ens33       # 承载VIP的物理接口(需与实际网卡一致)
  virtual_router_id 1   # 虚拟路由ID,同一热备组内必须相同
  priority 100          # 优先级,数值越大越优先成为Master
  advert_int 1          # VRRP通告间隔(秒)
  authentication {
    auth_type PASS      # 认证类型,支持PASS和AH(此处使用简单密码认证)
    auth_pass 123456    # 认证密码,热备组内需一致
  }
  virtual_ipaddress {
    192.168.10.100/24   # 虚拟IP地址(VIP),可配置多个
  }
}
2. 备用服务器(Backup)配置
vi keepalived.conf

global_defs {
  router_id HA_TEST_R2  # 备用服务器标识,需与Master不同
}

vrrp_instance VI_1 {
  state BACKUP          # 状态设置为备用
  interface ens33
  virtual_router_id 1
  priority 99           # 优先级低于Master(确保Master优先)
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 123456
  }
  virtual_ipaddress {
    192.168.10.100/24
  }
}
3. 关键参数说明
  • router_id:用于标识热备组内不同节点,需唯一,建议包含角色信息(如 R1/Master、R2/Backup)。
  • virtual_router_id:热备组唯一标识,取值范围 1-255,同一组内必须一致,不同组需不同。
  • priority:决定主备选举顺序,Master 需设置为高于 Backup 的数值(如 100 vs 99),且组内唯一。
  • advert_int:心跳间隔,建议保持默认 1 秒,过小可能增加网络负载,过大可能延长故障切换时间。
  • auth_pass:认证密码,需在热备组内保持一致,避免未授权节点加入。

(五)服务控制与状态验证

1. 启动服务前准备
# 关闭防火墙(测试环境使用,生产环境需配置安全策略)
systemctl stop firewalld
systemctl disable firewalld
# 关闭SELinux(临时生效)
setenforce 0
# 永久关闭SELinux(修改配置文件)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
2. 启动服务并验证状态
# 启动Keepalived服务
systemctl start keepalived
# 查看Master节点VIP是否绑定
ip addr show dev ens33 | grep inet
# 预期输出:包含192.168.10.101(物理IP)和192.168.10.100(VIP)
inet 192.168.10.101/24 scope global ens33
inet 192.168.10.100/32 scope global ens33
# 查看Backup节点VIP状态(此时Master正常运行,Backup不应持有VIP)
ip addr show dev ens33 | grep inet
# 预期输出:仅包含192.168.10.102(物理IP)
inet 192.168.10.102/24 scope global ens33

二、双机热备功能测试与故障切换验证

(一)连通性测试:VIP 漂移验证

1. 客户端持续 Ping 测试
# 在客户端执行持续Ping VIP
ping -t 192.168.10.100
2. 模拟 Master 故障
# 停止Master节点Keepalived服务
systemctl stop keepalived

  • 预期结果
    • Ping 请求短暂中断(1-2 个包丢失),随后恢复正常,说明 Backup 接管 VIP。
    • Backup 节点执行ip addr show可见 VIP 绑定到 ens33 接口。
3. Master 恢复测试
# 重新启动Master节点Keepalived服务
systemctl start keepalived

  • 预期结果
    • Ping 请求再次短暂中断后恢复,说明 Master 重新获取 VIP 控制权。
    • Master 节点ip addr show显示 VIP 重新绑定,Backup 节点 VIP 消失。

(二)Web 服务切换测试:业务连续性验证

1. 配置测试页面
# 在Master节点设置Nginx首页内容
echo "Master Server (192.168.10.101)" > /usr/share/nginx/html/index.html
systemctl start nginx
# 在Backup节点设置不同的首页内容
echo "Backup Server (192.168.10.102)" > /usr/share/nginx/html/index.html
systemctl start nginx
2. 客户端访问测试
# 在客户端浏览器访问http://192.168.10.100
# 正常情况下显示Master的页面内容
3. 故障切换验证
  • 停止 Master 服务
    • 浏览器刷新后应显示 Backup 的页面内容,说明 VIP 已切换至 Backup。
  • 恢复 Master 服务
    • 浏览器刷新后应重新显示 Master 的页面内容,说明 Master 重新接管 VIP。

(三)日志分析:故障切换过程追踪

1. 日志文件位置
# 查看Keepalived日志(需实时跟踪)
tail -f /var/log/messages
2. Master 节点关键日志
  • 正常运行时
    Sep 11 13:36:42 localhost Keepalived_vrrp[18280]: VRRP_Instance(VI_1) Entering MASTER STATE
    Sep 11 13:36:43 localhost Keepalived_vrrp[18280]: VRRP_Instance(VI_1) setting protocol VIPs.
    
  • 停止服务时
    Sep 11 13:32:24 localhost Keepalived_vrrp[18261]: VRRP_Instance(VI_1) removing protocol VIPs.
    
3. Backup 节点关键日志
  • 接管 VIP 时
    Sep 11 13:12:44 localhost Keepalived_vrrp[25338]: VRRP_Instance(VI_1) Entering MASTER STATE
    Sep 11 13:12:44 localhost Keepalived_vrrp[25338]: VRRP_Instance(VI_1) setting protocol VIPs.
    
  • 释放 VIP 时(Master 恢复后)
    Sep 11 13:14:23 localhost Keepalived_vrrp[25338]: VRRP_Instance(VI_1) Entering BACKUP STATE
    Sep 11 13:14:23 localhost Keepalived_vrrp[25338]: VRRP_Instance(VI_1) removing protocol VIPs.
    

三、LVS+Keepalived 高可用群集构建

(一)群集架构设计

1. 组件分工
  • 负载调度器(Director):主(192.168.10.101)、从(192.168.10.102)各一台,基于 Keepalived 实现热备,共享 VIP(192.168.10.100)。
  • 节点服务器(Real Server):两台 Web 服务器(192.168.10.103、192.168.10.104),提供 HTTP 服务。
  • 共享存储(NFS):一台 NFS 服务器(192.168.10.105),存储 Web 内容,确保节点数据一致性。
2. 工作模式选择:直接路由(DR 模式)
  • 特点:调度器仅处理入站请求,响应报文直接由节点服务器返回给客户端,性能较高。
  • 要求:节点服务器需配置 VIP 的本地回环接口(lo:0),并调整 ARP 参数避免地址冲突。

(二)基础环境配置(主 / 从调度器通用)

1. 关闭防火墙与 SELinux
systemctl stop firewalld && systemctl disable firewalld
setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
2. 修改主机名
# 主调度器
hostnamectl set-hostname lb01
# 从调度器
hostnamectl set-hostname lb02
# Web节点1
hostnamectl set-hostname web01
# Web节点2
hostnamectl set-hostname web02
3. 加载 LVS 模块与安装工具
modprobe ip_vs          # 加载LVS内核模块
cat /proc/net/ip_vs     # 验证模块加载(显示LVS版本信息)
yum install -y ipvsadm keepalived  # 安装LVS管理工具与Keepalived

(三)主调度器详细配置

1. 热备与 VIP 配置(同双机热备部分,新增虚拟服务器配置)
vi /etc/keepalived/keepalived.conf
global_defs {
  router_id LVS_HA_R1  # 主调度器标识
}

vrrp_instance VI_1 {
  state MASTER
  interface ens33
  virtual_router_id 1
  priority 100
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 123456
  }
  virtual_ipaddress {
    192.168.10.100/24  # 群集VIP
  }
}

# 虚拟服务器配置(LVS负载均衡规则)
virtual_server 192.168.10.100 80 {
  delay_loop 15          # 健康检查间隔(秒)
  lb_algo rr             # 调度算法:轮询(Round Robin)
  lb_kind DR             # 群集模式:直接路由(DR)
  protocol TCP           # 协议类型:TCP
  persistence_timeout 50 # 连接保持时间(秒,可选,用于会话保持)

  # 第一个Web节点配置
  real_server 192.168.10.103 80 {
    weight 1             # 节点权重(1-254,数值越大处理请求越多)
    TCP_CHECK {          # TCP健康检查
      connect_port 80    # 检查端口
      connect_timeout 3  # 连接超时时间
      nb_get_retry 3     # 重试次数
      delay_before_retry 4 # 重试间隔
    }
  }

  # 第二个Web节点配置
  real_server 192.168.10.104 80 {
    weight 1
    TCP_CHECK {
      connect_port 80
      connect_timeout 3
      nb_get_retry 3
      delay_before_retry 4
    }
  }
}
2. 关键参数解析
  • delay_loop:健康检查频率,建议根据服务响应速度调整,默认 15 秒。
  • lb_algo:调度算法,支持 rr(轮询)、wrr(加权轮询)、lc(最少连接)等,此处使用简单轮询。
  • lb_kind:群集模式,DR 模式要求调度器与节点服务器在同一子网,且节点配置 VIP 回环接口。
  • TCP_CHECK:健康检查机制,通过尝试连接节点指定端口判断存活状态,失败则从服务器池中剔除。
3. 重启服务使配置生效
systemctl restart keepalived

(四)从调度器配置

vi /etc/keepalived/keepalived.conf

global_defs {
  router_id LVS_HA_R2  # 从调度器标识,需唯一
}

vrrp_instance VI_1 {
  state BACKUP         # 状态设置为备用
  interface ens33
  virtual_router_id 1
  priority 90          # 优先级低于主调度器
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 123456
  }
  virtual_ipaddress {
    192.168.10.100/24
  }
}

# 虚拟服务器配置与主调度器完全一致,无需修改节点列表
virtual_server 192.168.10.100 80 {
  # 内容同主调度器的virtual_server区段
}

systemctl restart keepalived

(五)Web 节点服务器配置(DR 模式)

1. 配置 VIP 回环接口
vi /etc/sysconfig/network-scripts/ifcfg-lo:0

DEVICE=lo:0
IPADDR=192.168.10.100
NETMASK=255.255.255.255
ONBOOT=yes
USERCTL=no

# 启动接口
ifup lo:0
# 验证IP绑定
ip addr show dev lo | grep inet
# 预期输出:包含192.168.10.100/32
inet 192.168.10.100/32 scope host lo
2. 调整 ARP 参数(避免 ARP 欺骗)
# 临时设置(立即生效)
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce   # 限制ARP通告源地址为本地接口IP
echo "2" > /proc/sys/net/ipv4/conf/default/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore     # 忽略非本地接口的ARP请求
echo "1" > /proc/sys/net/ipv4/conf/default/arp_ignore
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore      # 针对回环接口单独配置
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce

# 永久生效(修改系统配置文件)
sed -i '$a net.ipv4.conf.all.arp_announce = 2' /etc/sysctl.conf
sed -i '$a net.ipv4.conf.default.arp_announce = 2' /etc/sysctl.conf
sed -i '$a net.ipv4.conf.all.arp_ignore = 1' /etc/sysctl.conf
sed -i '$a net.ipv4.conf.default.arp_ignore = 1' /etc/sysctl.conf
sed -i '$a net.ipv4.conf.lo.arp_ignore = 1' /etc/sysctl.conf
sed -i '$a net.ipv4.conf.lo.arp_announce = 2' /etc/sysctl.conf
sysctl -p  # 使配置立即生效
3. 启动 Nginx 服务并挂载共享存储(示例)
# 安装Nginx
yum install -y nginx
# 启动服务
systemctl start nginx
systemctl enable nginx
# 挂载NFS共享(假设NFS服务器地址为192.168.10.105,共享目录为/var/www/html)
mkdir -p /var/www/html
mount -t nfs 192.168.10.105:/var/www/html /var/www/html
# 开机自动挂载(添加到fstab)
echo "192.168.10.105:/var/www/html /var/www/html nfs defaults 0 0" >> /etc/fstab

(六)NFS 共享服务器配置(可选,用于数据一致性)

1. 安装 NFS 服务
yum install -y nfs-utils rpcbind
2. 创建共享目录并设置权限
mkdir -p /var/www/html
chmod -R 755 /var/www/html
chown -R nfsnobody:nfsnobody /var/www/html  # 设置NFS用户权限
3. 配置 NFS 共享
vi /etc/exports
/var/www/html 192.168.10.0/24(rw,sync,no_root_squash)  # 允许192.168.10.0/24网段读写
4. 启动服务并验证
systemctl start rpcbind && systemctl start nfs-server
systemctl enable rpcbind && systemctl enable nfs-server
# 验证共享导出(在客户端执行)
showmount -e 192.168.10.105
# 预期输出:显示/var/www/html共享
Export list for 192.168.10.105:
/var/www/html 192.168.10.0/24

(七)群集功能测试

1. 负载均衡测试
# 在客户端循环访问VIP并记录响应节点IP
while true; do curl -s http://192.168.10.100; echo -e "\n--------"; sleep 1; done
# 预期输出:交替显示web01(10.103)和web02(10.104)的页面内容
Master Server (192.168.10.103)
--------
Master Server (192.168.10.104)
--------
2. 节点健康检查验证
  • 模拟节点故障

    # 停止web01的Nginx服务
    systemctl stop nginx
    
     
    • 预期结果
      • 客户端访问不再返回 web01 内容,Keepalived 自动将其从服务器池剔除。
      • 主调度器日志显示:
        Keepalived_vrrp[xxx]: VRRP_Instance(VI_1) removing real_server 192.168.10.103:80
        
  • 恢复节点

    systemctl start nginx
    
     
    • 预期结果
      • web01 重新加入服务器池,客户端再次轮询到其响应。
3. 调度器故障切换测试
  • 停止主调度器 Keepalived

    systemctl stop keepalived
    
     
    • 预期结果
      • 从调度器接管 VIP,客户端访问通过从调度器负载均衡,业务不中断。
      • 从调度器日志显示:

        log

        Keepalived_vrrp[xxx]: VRRP_Instance(VI_1) Entering MASTER STATE
        
  • 恢复主调度器

    systemctl start keepalived
    
     
    • 预期结果
      • 主调度器重新获取 VIP,从调度器退回备用状态,负载均衡继续由主调度器处理。
4. LVS 规则查看
# 查看当前服务器池节点(主调度器执行)
ipvsadm -ln
# 预期输出:显示VIP及后端节点IP
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.100:80 rr
  -> 192.168.10.103:80            Route   1      0          0
  -> 192.168.10.104:80            Route   1      0          0

# 查看连接状态
ipvsadm -lnc
# 预期输出:显示当前连接的客户端IP及目标节点
TCP 00:00:05 192.168.10.1:50123 192.168.10.100:80 FIN_WAIT 192.168.10.103:80

四、高级配置与优化实践

(一)多虚拟 IP 配置

vrrp_instance VI_1 {
  # ... 其他配置 ...
  virtual_ipaddress {
    192.168.10.100/24  # 主VIP
    192.168.10.101/24  # 备用VIP(可选)
  }
}

(二)端口监控与服务联动

virtual_server 192.168.10.100 80 {
  # ... 其他配置 ...
  notify_master "/etc/keepalived/scripts/master.sh"  # Master节点激活时执行脚本
  notify_backup "/etc/keepalived/scripts/backup.sh"  # 切换至Backup时执行
  notify_fault "/etc/keepalived/scripts/fault.sh"    # 故障时执行
}

示例脚本(master.sh)

#!/bin/bash
# 当Master激活时启动额外服务
systemctl start mysql

(三)权重动态调整

# 通过脚本实时监控节点负载,调整权重(需结合crontab定时执行)
#!/bin/bash
LOAD=$(wget -q http://127.0.0.1/load -O -)  # 获取节点负载
if [ $LOAD -gt 8 ]; then
  ipvsadm -e -t 192.168.10.100:80 -r 192.168.10.103:80 -w 0  # 负载过高时设置权重为0
else
  ipvsadm -e -t 192.168.10.100:80 -r 192.168.10.103:80 -w 1  # 恢复权重
fi

(四)安全加固建议

  1. 认证方式升级

    • 使用 AH(Authentication Header)认证替代 PASS 明文密码,提高安全性。
    authentication {
      auth_type AH
      auth_hmac_key "复杂加密密钥"  # 需使用工具生成随机密钥
    }
    
  2. 防火墙策略

    # 允许VRRP协议(多播地址224.0.0.18,端口112)
    firewall-cmd --add-protocol=vrrp --permanent
    firewall-cmd --reload
    
  3. SELinux 策略

    # 允许Keepalived绑定非特权端口(如需使用80/443等)
    semanage port -a -t http_port_t -p tcp 80
    

五、故障排查与常见问题解决

(一)VIP 无法绑定

  • 可能原因
    • 物理接口名称错误(如误写为 ens32 而非实际的 ens33)。
    • 防火墙拦截 VRRP 协议或 VIP 绑定操作。
    • 同一子网内存在重复 VIP。
  • 解决步骤
    # 检查接口名称与配置是否一致
    ip link show
    # 临时关闭防火墙验证
    systemctl stop firewalld
    # 检查子网内IP冲突
    arp -a | grep 192.168.10.100
    

(二)主备切换失败

  • 可能原因
    • 优先级配置错误(Backup 优先级高于 Master)。
    • 认证密码不一致。
    • 网络故障导致 VRRP 通告无法传输。
  • 解决步骤
    # 对比主备配置文件中的priority和auth_pass
    diff /etc/keepalived/keepalived.conf master.conf backup.conf
    # 测试网络连通性(主备互Ping)
    ping 192.168.10.101 -c 3 && ping 192.168.10.102 -c 3
    # 检查VRRP通告是否正常(抓包分析)
    tcpdump -i ens33 vrrp -n
    

(三)节点未被剔除(健康检查失效)

  • 可能原因
    • TCP_CHECK 参数设置不合理(如超时时间过短)。
    • 节点防火墙阻止健康检查请求。
    • LVS 模块未正确加载。
  • 解决步骤
    # 调整健康检查参数(延长超时时间)
    vi /etc/keepalived/keepalived.conf
    # 将connect_timeout从3秒调整为5秒
    TCP_CHECK {
      connect_timeout 5
      # ... 其他参数 ...
    }
    # 检查节点防火墙规则
    firewall-cmd --list-ports | grep 80
    # 重新加载LVS模块
    modprobe -r ip_vs && modprobe ip_vs
    


网站公告

今日签到

点亮在社区的每一天
去签到