1. VRRP协议
虚拟路由冗余协议:VRRP(Virtual Router Redundancy Protocol),解决静态网关单点风险
其特点和优势如下:
- 高可用性
- 确保网络在主网关失效的情况下,能够迅速切换到备份网关,最大程度减少网络中断时间,提高业务的连续性
- 负载分担
- 支持将流量在多个网关之间进行分担,提高网络资源的利用率
- 简单配置
- 配置相对简单,降低了网络管理的复杂性和成本
- 透明性
- 对于终端用户和上层协议来说,网关的切换是透明的,无需用户干预或修改配置
1.1 相关术语
- 虚拟路由器(Virtual Router)
- 虚拟路由器标识:唯一标识虚拟路由器VRID(0-255)
- VIP:Virtual IP
- VMAC
- 物理路由器
- 主设备(MASTER)
- 备用设备(BACKUP)
- 优先级(priority)
1.2 相关技术
- 心跳
- 通告,优先级等
- 周期性
- 工作方式
- 抢占式(默认)
- 非抢占式
- 安全认证
- 无认证
- 简单字符认证:预共享密钥
- MD5
- 工作模式
- 主/备
- 主/主
2. Keepalived
2.1 Keepalived 介绍
Keepalived 是一个用于实现服务器高可用的开源软件
它的主要功能包括:
-
实现虚拟 IP(VIP)的漂移
- 当主服务器出现故障时,自动将 VIP 切换到备份服务器,确保服务的连续性
-
监控服务器状态
- 通过各种方式(如 TCP 连接、HTTP 请求等)监测后端服务器的运行状况
-
与其他高可用技术集成
- 例如与 LVS(Linux Virtual Server)、Haproxy等结合,提供更强大的负载均衡和高可用解决方案
-
IO复用器(I/O Multiplexer)
- 针对网络目的而优化的自己的线程抽象
-
内存管理(Memory Management)
- 为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限
-
控制组件(Control components)
- 提供Keepalived.conf的解析器,完成Keepalived配置
-
用户空间核心组件(Core components of user space)
- WatchDog:监控进程
- System call:实现 VRRP 协议状态转换时调用脚本的功能
- SMTP:邮件组件
- Checkers:监测后端服务器
- VRRP Stack:VIP消息通告
- IPVS wrapper:生成IPVS规则
- Netlink Reflector:网络接口
2.2 Keepalived 相关文件
路径 | 说明 |
---|---|
keepalived | 软件包名 |
/usr/sbin/keepalived | 主程序文件 |
/etc/keepalived/keepalived.conf | 主配置文件 |
/usr/share/doc/keepalived/ | 配置文件示例 |
/lib/systemd/system/keepalived.service | Unit File |
/etc/sysconfig/keepalived | Unit File的环境配置文件 |
- RHEL7中的可能出现的BUG
- systemctl restart keepalived # 新配置可能无法生效
- systemctl stop keepalived # 无法停止进程,需要kill停止
2.3 Keepalived 主配置文件说明
/etc/keepalived/keepalived.conf 主配置文件
2.3.1 组成
-
全局配置(GLOBAL CONFIGURATION)
- global_defs
- 邮件配置(notification_email、notification_email_from)
- router_id
- VRRP配置(vrrp_skip_check_adv_addr、vrrp_strict、 vrrp_garp_interval、 vrrp_gna_interval)
- 多播地址(vrrp_mcast_group)
- …
- global_defs
-
VRRP配置(VRRP CONFIGURATION)
- vrrp_instance xxx:定义每一个VRRP虚拟路由器
-
LVS配置(LVS CONFIGURATION)
- virtual_server:定义LVS中的RS(真实服务器)和VS(虚拟服务器)
- Virtual server group(s)
2.3.2 全局配置
global_defs {notification_email { # Keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个(需要配置SMTP服务器)acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.loc # 发邮件的地址smtp_server 192.168.200.1 # 邮件服务器IP地址smtp_connect_timeout 30 # 邮件服务器连接超时时间router_id LVS_DEVEL # 每个Keepalive主机唯一标识,建议使用当前主机名,多节点重名不影响vrrp_skip_check_adv_addr # 对每个通告报文都进行检查;如果收到的通告报文和上一个通告报文是同一个路由器,则跳过检查,默认为全检查;启用后对性能消耗较大vrrp_strict # 严格遵守VRRP协议;启用时,以下配置将无法正常使用(无VIP地址、配置单播邻居、在VRRP版本2中配置有IPV6地址);不建议启用此配置vrrp_garp_interval 0 # 报文发送延迟,0表示不延迟vrrp_gna_interval 0 # 消息发送延迟vrrp_mcast_group 224.0.0.18 # 指定组播IP地址范围;默认组播地址 224.0.0.18 ;若需要更改,则要手动配置
}
2.3.3 VRRP配置
vrrp_instance VI_1 {state MASTER # Keepalive主机状态;MASTER:主服务器,BACKUP:备用服务器;仅对下方的VIP生效interface eth0 # 绑定当前虚拟路由器使用的物理接口;可以和VIP不在同一个网卡上virtual_router_id 51 # 每个虚拟路由器唯一标识(0-255);每个虚拟路由器标识必须唯一,否则服务无法启动;同属于一个虚拟路由器(VIP)的多个Keepalive节点必须相同;必须要确认在同一网络中,标识是唯一的priority 100 # 当前物理节点在虚拟路由器上的优先级(1-254)advert_int 1 # VRRP通告的时间间隔,默认1sauthentication { # 认证机制auth_type PASS # PASS为简单密码(建议使用);AH为IPSEC认证(不推荐)auth_pass 1111 # 预共享密钥,仅前八位有效;同一个虚拟路由器的多个Keepalive节点需要保持一致}virtual_ipaddress { # 虚拟IP,可以按行区分写多个192.168.200.16192.168.200.17192.168.200.18<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL> # 格式# <IPADDR>:VIP <MASK>:子网掩码(/24格式);不进行指定时,默认/32# brd <IPADDR>:VIP进行广播的地址# dev <STRING>:VIP绑定的网络设备;不指定时,默认eth0# scope <SCOPE>:网络的作用范围(global、link)# label <LABEL>:为网络接口设置的标签;标识和区分不同的网络接口配置}
}
2.4 初试 Keepalived 技术
2.4.1 配置环境
必做 | 非必做 |
---|---|
关闭防火墙、SELinux | 各节点之间可以通过主机名互相通信 |
各个节点时间同步(保证虚拟机时间同步即可) | 使用/etc/hosts文件实现 |
各节点之间的Root用户可以基于密钥认证的SSH服务完成互相通信 |
- Keepalived主机:将简称为KA1或KA2
- Real servers后端服务器:将简称为RS1或RS2
KA1和KA2之间进行通告,确保保证状态正常,故障时迅速切换身份,保证业务的正常运行
KA1或KA2将客户端访问VIP的流量,分配给后端服务器RS1和RS2,再根据使用的技术决定RS如何处理流量
2.4.2 配置
基于Red Hat Linux Server 7.9
进行配置
KA1
[root@ka1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
ONBOOT=yes
BOOTPROTO=none
IPADDR1=172.25.254.10
PREFIX=24
NETMASK1=255.255.255.0
DNS1=114.114.114.114
GATRWAY1=172.25.254.2yum install keepalived -y
vim /etc/keepalived/keepalived.conf # 在自带的VI_1基础上配置
################################################# 18
vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 100priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1 # 添加标记,与eth0,进行区分}
}
################################################# 33
systemctl enable --now keepalived.service
KA2
[root@ka2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
ONBOOT=yes
BOOTPROTO=none
IPADDR1=172.25.254.20
PREFIX=24
NETMASK1=255.255.255.0
DNS1=114.114.114.114
GATEWAY1=172.25.254.2yum install keepalived -y
vim /etc/keepalived/keepalived.conf # 在自带的VI_1基础上配置
################################################# 18
vrrp_instance VI_1 {state BACKUP # 备用服务器interface eth0virtual_router_id 100 # 同属于一个虚拟路由器(VIP)的多个Keepalive节点保持相同priority 80 # 优先级低于主服务器advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}
}
################################################# 33
systemctl enable --now keepalived.service
RS1
[root@rs1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
ONBOOT=yes
BOOTPROTO=none
IPADDR1=172.25.254.110
PREFIX=24
NETMASK1=255.255.255.0
DNS1=114.114.114.114
GATRWAY1=172.25.254.2yum install httpd -y
echo 172.25.254.110 > /var/www/html/index.html
systemctl enable --now httpd
RS2
[root@rs2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
ONBOOT=yes
BOOTPROTO=none
IPADDR1=172.25.254.120
PREFIX=24
NETMASK1=255.255.255.0
DNS1=114.114.114.114
GATEWAY1=172.25.254.2yum install httpd -y
echo 172.25.254.120 > /var/www/html/index.html
systemctl enable --now httpd
测试
此时VIP处于KA1上
[root@ka1 ~]# tcpdump -i eth0 -nn host 224.0.0.18 # 监控 224.0.0.18 广播地址
[root@rs1 ~]# ssh root@172.25.254.10
[root@ka1 ~]# systemctl stop keepalived.service # 通过SSH停止KA1的keepalived服务
[root@ka1 ~]# systemctl restart keepalived.service # 重启KA1的keepalived服务,此时VIP应在KA1身上
当KA1故障后,KA2迅速接过VIP,维持服务正常进行
配置时可能出现的问题:
- 两个节点都有VIP
- 可能由防火墙没关闭导致
- 无法使用VRRP协议
- 可能由SELinux没关闭导致
2.5 启用 Keepalived 日志功能
将Keepalived 日志分离出来,方便查看、排错、优化等
2.5.1 配置
# 可以两个节点的日志都进行分离
vim /etc/sysconfig/keepalived
# -D:详细记录日志 -S:设置本地系统日志级别(0-7)
KEEPALIVED_OPTIONS="-D -S 6"vim /etc/rsyslog.conf
# 74
local6.* /var/log/keepalived.logsystemctl restart rsyslog.service
systemctl restart keepalived.service
可以观察到有日志生成
2.6 实现 Keepalived 独立子配置文件
在实际生产中,不同的集群的配置是单独放在子配置文件中的
过多不同集群的配置,集中在主配置文件中,显得十分杂乱,不易于管理
2.6.1 配置
KA
vim /etc/keepalived/keepalived.conf
include /etc/keepalived/conf.d/*.conf # 关键命令 后跟子配置文件的路径mkdir -p /etc/keepalived/conf.d # 创建子配置文件目录
vim /etc/keepalived/conf.d/VI_1.conf # 将 vrrp_instance VI_1 配置 转移
#################################################
vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 100priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}
}
#################################################
systemctl restart keepalived.service
测试
KA1停止服务后,VIP消失
观察KA2,发现VIP漂移
重新开启KA1的服务,发现VIP回归,说明子配置文件生效
验证后完,请将删掉子配置目录及配置命令,保证后续实战内容的纯净实验环境
3. Keepalived 企业应用
3.1 实现Keepalived 单主架构
即 初试 Keepalived 技术的配置
3.2 抢占模式 与 非抢占模式
- 抢占模式——preempt
- 非抢占模式——nopreempt
- 延迟抢占模式——(Preempt_Delay)
Keepalived 默认 抢占模式,即当高优先级的主机恢复在线后,会抢占低先级的主机的VIP
这样会使 VIP 在 Keepalived 主机中来回漂移,造成网络抖动
非抢占模式 :即高优先级主机恢复后,不会抢占低优先级主机的VIP
非抢占模式下,如果高优先级原主机宕机,VIP漂移到低优先级主机,若低优先级主机也宕机时,仍会将VIP迁移回高优先级主机(此时已经恢复服务),假如Keepalived 主机均宕机,则VIP 消失
- 配置要点
- 各个节点必须互为BACKUP
KA1
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {state BACKUP # 互为BACKUPnopreempt # 关键配置命令interface eth0...
KA2
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {state BACKUP # 互为BACKUPnopreemptinterface eth0...
测试
当前VIP在KA1上
[root@ka2 ~]# systemctl restart keepalived.service # KA2先重启服务
[root@ka1 ~]# systemctl restart keepalived.service # KA1后重启服务
# 由于KA1在重启服务过程中,关闭服务,KA2认为KA1故障,将VIP抢过来
可以发现VIP已经漂移到KA2上,即使KA1已经重启完服务,VIP也不会被抢过去
3.2.1 延迟抢占模式(Preempt_Delay)
抢占延迟模式,即优先级高的主机恢复后,不会立即抢回VIP,而是等待一段时间(默认300s)再抢回 VIP
preempt_delay # 指定抢占延迟时间为 xxx s,默认延迟300s
- 各节点互为BACKUP,且不能启用 vrrp_strict 参数
- 配置前提:已配置非抢占模式
配置
KA1
vim /etc/keepalived/keepalived.conf
global_defs {....vrrp_skip_check_adv_addr# vrrp_strict # 不启用此参数vrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_instance VI_1 {state BACKUPnopreempt # 配置前提preempt_dalay 10s # 关键配置命令interface eth0...
KA2
vim /etc/keepalived/keepalived.conf
global_defs {....vrrp_skip_check_adv_addr# vrrp_strict # 不启用此参数vrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_instance VI_1 {state BACKUPnopreemptpreempt_dalay 10sinterface eth0...
测试
重启服务后,VIP在KA1上
[root@ka1 ~]# systemctl stop keepalived.service # 关闭服务后,VIP在KA2上
[root@kaserver1 ~]# systemctl restart keepalived.service # 重启服务后,在KA2上一直刷新,一段时间后,KA2上的VIP消失
3.3 VIP单播配置
默认Keepalived 主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量
- 进行单播时,不能启用 vrrp_strict 参数
3.3.1 配置
KA1
vim /etc/keepalived/keepalived.conf
global_defs {....vrrp_skip_check_adv_addr# vrrp_strict # 不启用此参数vrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_instance VI_1 {....virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}inicast_src_ip 172.25.254.10 # 源IPunicast_peer {172.25.254.20 # 对端IP,多个 keepalived 主机,分多行书写}
}
systemctl restart keepalived.service
KA2
vim /etc/keepalived/keepalived.conf
global_defs {....vrrp_skip_check_adv_addr# vrrp_strict # 不启用此参数vrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_instance VI_1 {....virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}inicast_src_ip 172.25.254.20 # 源IPunicast_peer {172.25.254.10 # 对端IP,多个 keepalived 主机,分多行书写}
}
systemctl restart keepalived.service
测试
未修改前,KA1发送组播信息
KA1不发送组播信息,采用单播方式发送给对端172.25.254.20
[root@ka1 ~]# systemctl stop keepalived.service # 暂停keepalived 服务
KA2同样如此
3.4 Keepalived 通知脚本配置
3.4.1 授权邮件发送
由QQ邮箱的 账号与安全 中的安全设置 生成授权码
[root@ka1 ~]# yum install mailx -y
[root@ka1 ~]# vim /etc/mail.rc # 配置邮箱信息,在最后添加
set from=xxxxxx@qq.com # 你的邮箱地址
set smtp=smtp.qq.com
set smtp-auth-user=xxxxxx@qq.com # 你的邮箱地址
set smtp-auth-password=dleajewhexxxacha # 邮箱的授权码
set smtp-auth=login
set ssl-verify=ignore[root@ka1 ~]# echo test message | mail -s test xxxxxx@qq.com # 发送测试邮件,有可能会在邮箱的垃圾箱中
# 假如不能 ping www.baidu.com 则邮件发送是失败的,即便能在垃圾箱中收到(请检查网关信息等)
3.4.2 邮件通知 Keepalived 状态变化
通知脚本类型
<QUOTED-STRING> 表示被引号括起来的字符串,这样能更精确地指定字符串的内容,特别是包含特殊字符时
- 当前节点成为主节点时触发
- notify_master <STRING> | <QUOTED-STRING>
- 当前节点转为备节点时触发
- notify_backup <STRING> | <QUOTED-STRING>
- 当前节点转为“失败”状态时触发
- notify_fault <STRING> | <QUOTED-STRING>
- 通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知
- notify <STRING> | <QUOTED-STRING>
- 当停止VRRP时触发的脚本
- notify_stop <STRING> | <QUOTED-STRING>
3.4.3 Keepalived 脚本配置
[root@ka1 ~]# vim /etc/keepalived/mail.sh # 编写邮件通知脚本
#!/bin/bash
mail_dst="xxxxxx@qq.com" # 邮件接收的邮箱地址
send_message()
{mail_sub="$HOSTNAME to be $1 vip move" # 邮件标题mail_msg="`date +%F\ %T`: vrrp move $HOMENAME change $1" # 邮件内容echo $mail_msg | mail -s "$mail_sub" $mail_dst # 发送邮件
}case $1 inmaster)send_message master ;;backup)send_message master;;fault)send_message fault;;*);;
esacchmod +x /etc/keepalived/mail.sh # 给脚本增加执行权限
/etc/keepalived/mail.sh master # 测试脚本是否可用,注意接收邮件vim /etc/keepalived/keepalived.conf # 修改配置文件
vrrp_instance VI_1 {...inicast_src_ip 172.25.254.10unicast_peer {172.25.254.20}notify_master "/etc/keepalived/mail.sh master"notify_backup "/etc/keepalived/mail.sh backup"notify_fault "/etc/keepalived/mail.sh fault"
}systemctl restart keepalived.service # 重启服务,并观察是否收到邮件
3.5 实现Keepalived 双主架构
传统 Master/Slave 的单主架构,同一时间只有一个Keepalived 主机对外提供服务,Master 主机繁忙,而Slave 主机在偷闲摸鱼 ,利用率低下
故此,采用Master/Master的双主架构,解决Slave 主机摸鱼问题
原理:将两个或两个以上VIP分别运行在不同的Keepalived 主机,以实现主机并行提供Web访问的目的,提高服务器资源利用率
3.5.1 配置
KA1
vim /etc/keepalived/keepalived.conf
#################################################
vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 100priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}
}
#################################################
vrrp_instance VI_2 {state BACKUPinterface eth0virtual_router_id 80 # 多个Keepalive 节点,唯一标识必须相同priority 80advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.200/24 dev eth0 label eth0:2 # VIP 200 标签eth0:2 与VIP 100 相区分}
}
#################################################
systemctl restart keepalived.service
KA2
vim /etc/keepalived/keepalived.conf
#################################################
vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 100priority 80advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}
}
#################################################
vrrp_instance VI_2 {state MASTERinterface eth0virtual_router_id 80priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.200/24 dev eth0 label eth0:2}
}
#################################################
systemctl restart keepalived.service
测试
KA1 和 KA2 均有对应VIP
KA1 \ KA2 主机停止服务后,VIP 100 \ 200 正常漂移
3.6 实现 IPVS 高可用架构
3.6.1 虚拟服务器(IPVS)定义格式
参数 | 说明 |
---|---|
virtual_server IP port | 定义VIP 和 端口 |
virtual_server fwmark int | IPVS的防火墙打标,实现基于防火墙的负载均衡集群 |
virtual_server group string | 使用虚拟服务器组 |
3.6.2 虚拟服务器(IPVS)配置
virtual_server IP port { # VIP和端口delay_loop <INT> # 检查RS的时间间隔lb_algo rr|wrr|lc|wlc|lblc|sh|dh # 定义调度方法lb_kind NAT|DR|TUN # 集群的类型,需要使用大写persistence_timeout <INT> # 持久连接时长protocol TCP|UDP|SCTP # 指定服务协议,一般为TCPsorry_server <IPADDR> <PORT> # 所有RS故障时,备用服务器地址real_server <IPADDR> <PORT> { # RS的IP和PORTweight <INT> # RS权重notify_up <STRING>|<QUOTED-STRING> # RS上线通知脚本notify_down <STRING>|<QUOTED-STRING> # RS下线通知脚本HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... } # 定义当前主机健康状态检测方法}
}
#注意:括号必须分行写,两个括号写在同一行,如 }} 会出错
3.6.3 应用层监测
HTTP_GET|SSL_GET {url {path <URL_PATH> # 定义要监控的URLstatus_code <INT> # 判断上述检测机制为健康状态的响应码,一般为 200}connect_timeout <INTEGER> # 客户端请求的超时时长, 相当于haproxy的timeout servernb_get_retry <INT> # 重试次数,过快会影响服务器性能delay_before_retry <INT> # 重试之前的延迟时长connect_ip <IP ADDRESS> # 向当前RS哪个IP地址发起健康状态检测请求connect_port <PORT> # 向当前RS的哪个PORT发起健康状态检测请求bindto <IP ADDRESS> # 向当前RS发出健康状态检测请求时使用的源地址bind_port <PORT> # 向当前RS发出健康状态检测请求时使用的源端口
}
3.6.4 TCP监测
TCP_CHECK {connect_ip <IP ADDRESS> # 向当前RS的哪个IP地址发起健康状态检测请求connect_port <PORT> # 向当前RS的哪个PORT发起健康状态检测请求bindto <IP ADDRESS> # 发出健康状态检测请求时使用的源地址bind_port <PORT> # 发出健康状态检测请求时使用的源端口connect_timeout <INTEGER> # 客户端请求的超时时长,等于haproxy的timeout server
}
3.6.5 单主的 LVS-DR 模式
配置
KA
yum install ipvsadm -y
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 100priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}
}
virtual_server 172.25.254.100 80 {delay_loop 3lb_algo wrrlb_kind DRprotocol TCPreal_server 172.25.254.110 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 2nb_get_retry 2delay_before_retry 2}}real_server 172.25.254.120 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 2nb_get_retry 2delay_before_retry 2}}
}
systemctl restart keepalived.serviceipvsadm -Ln # 多出来的策略是keepalived 配置文件中的
# 出现以下内容,则keepalived配置正确,否则检查keepalived的缩进是否正确;SELinux、防火墙是否关闭-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 wrr-> 172.25.254.110:80 Route 1 0 0-> 172.25.254.120:80 Route 1 0 0
KA2的 virtual_server 172.25.254.100 80 {…} 与KA1配置一样,仅需要注意KA2是BACKUP身份
RS
vim /etc/sysctl.d/arp.conf # RS均关闭ARP应答功能
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
sysctl --system # 查看ARP信息,注意查看倒数5行vim /etc/sysconfig/network-scripts/ifcfg-lo # RS均配置VIP
DEVICE=lo
IPADDR1=127.0.0.1
NETMASK1=255.0.0.0
IPADDR2=172.25.254.100 # VIP
NETMASK2=255.255.255.255 # 掩码:32
NETWORK=127.0.0.0
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
# 同一集群的RS配置相同
systemctl restart network
测试
两个后端服务器均配置上VIP 100
两个Keepalived 主机均存在LVS 策略
流量均能正常访问
停止KA1 服务,VIP 100 漂移到KA2 上,访问没有被中断,断开瞬间有些卡顿,这与配置的参数有关
3.7 实现HAProxy 高可用架构
3.7.1 VRRP Script 配置
分两个步骤实现
- 定义脚本
Vrrp_Script:自定义资源监控脚本,通常用于监控指定应用的状态
一旦发现应用的状态异常,则对MASTER节点的优先级 减至低于 BACKUP节点,从而实现 VIP 切换到BACKUP 节点
vrrp_script <SCRIPT_NAME> {script <STRING>|<QUOTED-STRING> # 执行脚本路径,脚本返回值为非0时,会触发下面OPTIONS执行OPTIONS
}
- 调用脚本
track_script:调用vrrp_script定义的脚本去监控资源,定义在VRRP实例之内,调用事先定义的 vrrp_script
track_script {SCRIPT_NAME_1 # 调用的脚本名称SCRIPT_NAME_2
}
定义VRRP script
vrrp_script <SCRIPT_NAME> { # 定义一个检测脚本,在global_defs 之外配置script <STRING>|<QUOTED-STRING> # shell命令或脚本路径interval <INTEGER> # 执行间隔时间,单位为秒,默认1秒timeout <INTEGER> # 超时时间weight <INTEGER:-254..254> # 默认为0,如果设置负数,此值与节点优先级相加,减低节点优先级(fall);如果设置正数,两值相加,增加节点优先级(rise)fall <INTEGER> # 执行脚本连续几次都失败,则转换为失败,建议设为2以上rise <INTEGER> # 执行脚本连续几次都成功,把服务器从失败标记为成功user USERNAME [GROUPNAME] # 执行监测脚本的用户或组init_fail # 设置默认标记为失败状态,监测成功之后再转换为成功状态
}
调用VRRP script
vrrp_script <SCRIPT_NAME> {... # 脚本定义内容,必须放在调用脚本前面... # VRRP定义内容track_script {<SCRIPT_NAME> # 调用时,不需要加.sh}
}
3.7.2 利用脚本实现主从角色切换
配置
[root@ka1 ~]# vim /mnt/test.sh
#!/bin/bash
[ ! -f "/mnt/lee" ] # 复制时,可能变成中文的感叹号
chmod +x /mnt/test.shvim /etc/keepalived/keepalived.conf
#################################################
vrrp_script check_test {script "/mnt/check_test.sh"interval 1weight -30fall 2fise 2timeout 2
}vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 100priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}track_script {check_test}
}
#################################################touch /mnt/haha
tail -f /var/log/messages
测试
当存在/mnt/haha文件,脚本运行,返回非0值,执行脚本语句,降低当前keepalived 主机的优先级,VIP漂移
3.7.3 HAProxy 与 Keepalived 实现高可用
为防止 当前持有VIP的Keepalived 主机的HAProxy 服务挂掉后
不能及时将VIP漂移到其他正常运行HAProxy 服务的Keepalived 主机(假如Keepalived 服务挂掉,VIP会自然漂移到其他Keepalived 主机上)
原理:利用脚本检测HAProxy 服务的状态,当HAProxy 服务挂掉后,使得当前Keepalived 主机的优先级发生改变而使VIP漂移
配置
yum install psmisc -y # 安装killall命令
mkdir -p /etc/keepalived/scripts
vim /etc/keepalived/scripts/haproxy.sh # 编写脚本检测haproxy 服务的状态
#!/bin/bash
/usr/bin/killall -0 haproxy
chmod +x /etc/keepalived/scripts/haproxy.sh # 赋予脚本执行权限vim /etc/keepalived/keepalived.conf
#################################################
vrrp_script check_haproxy {script "/etc/keepalived/scripts/haproxy.sh"interval 1weight -30 # 表示原先的优先级需要减去的数值,最终结果要比其他keepalived 主机低,否则VIP不转移fall 2fise 2timeout 2
}vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 100priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}track_script {check_haproxy # 脚本的名称}
}
#################################################echo net.ipv4.ip_nonlocal_bind=1 >> /etc/sysctl.conf # 开启内核参数
cat /etc/sysctl.conf # 查看一下内容是否被追加
yum install haproxy.x86_64 -y # 安装haproxy
vim /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
listen webserverbind 172.25.254.100:80mode httpbalance roundrobinserver web1 172.25.254.110:80 checkserver web2 172.25.254.120:80 checksystemctl restart keepalived.service
systemctl restart haproxy.service
yum remove ipvsadm -y # LVS会影响结果
KA2
vim /etc/keepalived/keepalived.conf
#################################################
vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 100priority 80advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}
}
#################################################echo net.ipv4.ip_nonlocal_bind=1 >> /etc/sysctl.conf # 开启内核参数
cat /etc/sysctl.conf # 查看一下内容是否被追加
yum install haproxy.x86_64 -y # 安装haproxy
vim /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
listen webserverbind 172.25.254.100:80mode httpbalance roundrobinserver web1 172.25.254.110:80 checkserver web2 172.25.254.120:80 checksystemctl restart keepalived.service
systemctl restart haproxy.service
yum remove ipvsadm -y # LVS会影响结果
RS
vim /etc/sysctl.d/arp.conf # RS均开启ARP应答功能
net.ipv4.conf.all.arp_ignore=0
net.ipv4.conf.all.arp_announce=0
net.ipv4.conf.lo.arp_ignore=0
net.ipv4.conf.lo.arp_announce=0
sysctl --system # 查看ARP信息,注意查看倒数5行vim /etc/sysconfig/network-scripts/ifcfg-lo # RS均不配置VIP
DEVICE=lo
IPADDR=127.0.0.1
NETMASK=255.0.0.0
NETWORK=127.0.0.0
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
# 同一集群RS均要开启ARP应答功能 和 不配置VIP
- 停止haproxy服务后,VIP未发生改变,可能keepalived 和 脚本的配置有问题
- 停止keepalived服务后,VIP正常飘移,但不能访问后端服务器,可能haproxy 配置有问题
测试
用户正常访问
在用户访问过程中,停止KA1的haproxy服务,发现不影响用户的访问,且VIP处于KA2上