安装
基础环境:服务器:test11-192.168.37.11,test12-192.168.37.12
系统版本:centos7.6
软件版本:keepalived 1.3.5
直接yum安装:yum install keepalived -y
最新版安装的可以到官网下载源码包编译安装:https://www.keepalived.org/download.html
配置
主服务器:test11
[root@test11 ~]#vim /etc/keepalived/keepalived.conf
global_defs {
.
.
router_id test11 #不同的keepalived.conf,此ID要唯一,ID名自行定义
.
.
}
vrrp_instance VI_1 { #实例名为VI_1,相同实例的备节点要和这个相同
state MASTER #状态为MASTER,备节点状态需要为BACKUP
interface enp0s3 #注意:默认为eth0,centos7的网卡名可能不是eth0,修改成实际的网卡名
virtual_router_id 51 #实例ID为51,keepalived.conf里唯一,但备节点要相同
priority 150 #优先级为150,备节点优先级必须比此数字低
advert_int 1 #主备通讯时间间隔1秒
authentication {
auth_type PASS #PASS认证类型,此参数备节点设置和主节点相同
auth_pass 1111 #密码是1111,此参数备节点设置和主节点相同
}
virtual_ipaddress {
192.168.37.9/24 #虚拟ip地址(VIP,一个尚未占用的内网ip即可)
}
}
备服务器:test12
[root@test12 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
.
.
router_id test12 #不同的keepalived.conf,此ID要唯一,ID名自行定义
.
.
}
vrrp_instance VI_1 {
state BACKUP
interface enp0s3
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.37.9/24
}
}
注意:虽然centos7防火墙默认用的是firewall,但这里需要执行 iptables -F
清除一下防火墙虚拟ip才能ping通
在test11和test12上启动keepalived,执行命令:systemctl start keepalived
简单模拟keepalived主服务器挂掉后,vip有没有漂移到备服务器上:
- 在test11上停止keepalived服务:
systemctl stop keepalived
- 在test11上执行ip a查看vip已经消失了
- 在test12上挂靠ip a查看上面设置的vip 192.168.37.9已漂移至keepalived备服务器test12上来了
双主双实例
简介:kepalived支持多实例多业务双向主备模式,只要在配置文件止新增一个实例就可以,即A业务在负载1服务器上是主模式,在负载2上是备模式,而B业务在负载1是备模式,在负载2是主模式。
服务器:test11
[root@test11 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
.
router_id test11
.
}
vrrp_instance VI_1 {
#跟上面test11的一样
}
vrrp_instance VI_2 {
state BACKUP
interface enp0s3
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.37.10/24
}
}
服务器:test12
[root@test12 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
.
router_id test12
.
}
vrrp_instance VI_1 {
#跟test12的上面的一样
}
vrrp_instance VI_2 {
state MASTER
interface enp0s3
virtual_router_id 52
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.37.10/24
}
}
Nginx负载均衡配合Keepalived服务案例
- 把test11上的nginx配置的负载均衡配置拷贝到test12的nginx配置文件路径上,并用rsync定时同步。
- 客户端把负载均衡代理的域名都解析到 VIP:192.168.37.9 上来。
- 为了解决单个nginx负载重的问题,可以根据业务需求使用上面的双主双实例模式。
Keepalived高可用服务器“裂脑”问题
简介:由于某些原因,导致两台高可用服务器在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权 ,而些时的两台高可用服务器对都还活着并在正常运行,这样会导致同一个IP或服务在两端同时存在而发生冲突,最严重的是两台主机占用同一个VIP地址,当用户写入数据时可能会分别写入到两端,这可能会导致服务器两端的数据不一致或造成数据丢失,这种情况被称为裂脑。
原因:
- 高可用服务器对之间心跳线链路发生故障,导致无法通信。
- 高可用服务器上开启了iptables防火墙阻挡了心跳消息传输
- 高可用服务器上心跳网卡地址等信息配置不正确,导致心跳失败
- 其他服务配置不当,如心跳方式不同,心跳广播冲突,软件Bug等。
解决:
- 同时使用串口电缆和以太网电缆连接,同时使用两条心跳线路,一条坏了,另一个依然可以传播心跳
- 做好对裂脑的监控报警,在发生问题时人为第一时间介入仲裁
解决多组keepalived服务器在一个局域网的冲突问题
当在同一个局域网内部暑了多组keepalived服务器,且未使用专门的心跳线通信时,可能会发生高可用接管严重故障问题。Keepalive高可用功能是通过VRRP协议实现的,VRRP协议默认通过IP多播的形式实现高可用对之间的通信,如果同一个局域网内存在多组keepalived服务器对,就会造成IP多播地址冲突问题,导致接管错乱,不同组的keepalived都会使用默认的224.0.0.18作为多播地址。此时解决办法是,在同组的keepalived服务器所有的配置文件指定独一无二的多播地址,配置如下:
global_defs {
router_id test11
vrrp_mcast_group4 224.0.0.19
}
解决高可用服务只针对物理服务器的问题
默认情况下,keepalived软件仅仅在对方机器宕机或者keepalived停掉的时候才会接管业务。但实际工作中,有业务服务停止而keepalived服务还在工作的情况,这就会导致用户访问的VIP无法找到对应的服务,那么,如何解决业务服务宕机可以将VIP漂移到备节点上呢
例如可以定时任务监控nginx,服务有问题的就把keepalived停掉:
[root@test11 ~]# cat /scripts/chk_nginx_proxy.sh
#!/bin/bash
nginx_status=`curl -I -m 5 -s -w "%{http_code}\n" -o /dev/null 192.168.37.11`
if [ $nginx_status -ne 200 ];then
systemctl stop keepalived.service
fi