一、配置Keepalived实现单实例单IP自动漂移接管
1、配置Keepalived的主服务器lb01 Master的keepalived.conf配置文件,操作步骤如下:
! Configuration File for keepalived
global_defs {
notification_email{
13273151825@163.com
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id lb01 ##id为lb01,不同的keepalived.conf此ID要唯一
}vrrp_instance VI_1 { ##实例名字为VI_1,相同实例的备节点名字要和这个相同
# 此处不设置为MASTER,通过priority来竞争master
state MASTER
# 网卡名字,文章下方会给出如何获取网卡名字的方法
interface eth0
# 同一个keepalived集群的virtual_router_id相同
virtual_router_id 51
# 权重,master要大于slave
priority 100
# 主备通讯时间间隔
advert_int 1
# 主备保持一致
authentication {
auth_type PASS #PASS认证类型,此参数备节点设置和主节点相同
auth_pass 1111 #密码是1111,此参数备节点设置和主节点相同
}
virtual_ipaddress {
# 虚拟ip地址(VIP,一个尚未占用的内网ip即可)
192.168.200.16
192.168.200.17
192.168.200.18
}
}
启动后查看是否有虚拟IP存在
2、配置Keepalived备份服务器lb02Backup
! Configuration File for keepalived
notification_email{
13273151825@163.com
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id lb02 ##id为lb02,不同的keepalived.conf此ID要唯一
} vrrp_instance VI_1 { ##实例名字为VI_1,相同实例的备节点名字要和这个相同
state BACKUP
interface eth0
# 同一个keepalived集群的virtual_router_id相同
virtual_router_id 51
# 权重,master要大于slave
priority 100
# 主备通讯时间间隔
advert_int 1
# 主备保持一致
authentication {
auth_type PASS #PASS认证类型,此参数备节点设置和主节点相同
auth_pass 1111 #密码是1111,此参数备节点设置和主节点相同
}
virtual_ipaddress {
# 虚拟ip地址(VIP,一个尚未占用的内网ip即可)
192.168.200.16
192.168.200.17
192.168.200.18
}
}
二、进行高可用主备服务器切换
1、停掉主服务器上的Keealived服务或关闭主服务器,操作。
查看主服务器虚拟IP消失,此时查看BACKUP备服务器,看是否存在主服务器的虚拟IP存在。
2、当主服务器服务启动后,发现很快又接管了VIP
三、Keepalived高可用服务器的“脑裂”问题
1、keepalived脑裂介绍
由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并且正常运行,这样就会导致同一个IP或服务在两端同时存在而发生冲突,最严重的的是两台主机占用一个VIP地址,当用户写入数据时可能会写人到两端,这可能会导致服务器两端的数据不一致或造成数据丢失,这种情况被称为脑裂。
2、导致脑裂发生的原因
1>、高可用服务器对之间心跳线联路发生故障,导致无法正常通信。
心跳坏了、网卡及相关驱动坏了,IP地址冲突、心跳间的设备故障(网卡交换机)、
2>、高可用服务器上开启了防火墙阻挡了心跳消息传输
3>、去他服务器配置不好
3、解决脑裂问题出现
1>、实时监控心跳
四、Keeplived双实例双主模式配置
1、keeplived双实例双主模式配置
keeplived支持单实例及双实例多业务双向主备模式,即A业务在lib01上是主模式,在lib02上是备模式,而B业务在lib01上是备模式,在lib02上是主模式。
lib01 ---10.0.0.7 VIP:10.0.0.12(用于绑定A业务www.etiantian.org域名)
lib02 ---10.0.0.8 VIP:10.0.0.13(用于绑定B业务bbs.etiantian.org域名)
首先配置10.0.0.7服务器中的keepalived.conf
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
! Configuration File for keepalived
global_defs {
notification_email{
13273151825@163.com
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id lib01 ##id为lb02,不同的keepalived.conf此ID要唯一vrrp_instance VI_1 { ##实例名字为VI_1,相同实例的备节点名字要和这个相同
interface eth0
virtual_router_id 55
# 权重,master要大于slave
priority 150
# 主备通讯时间间隔
advert_int 1
# 主备保持一致
authentication {
auth_type PASS #PASS认证类型,此参数备节点设置和主节点相同
auth_pass 1111 #密码是1111,此参数备节点设置和主节点相同
}
virtual_ipaddress {
# 虚拟ip地址(VIP,一个尚未占用的内网ip即可)
10.0.0.12/24 dev eht0 label eth0:1
}
}
vrrp_instance VI_2 { ##实例名字为VI_1,相同实例的备节点名字要和这个相同
state BACKUP
interface eth0
# 同一个keepalived集群的virtual_router_id相同
virtual_router_id 56
# 权重,master要大于slave
priority 100
# 主备通讯时间间隔
advert_int 1
# 主备保持一致
authentication {
auth_type PASS #PASS认证类型,此参数备节点设置和主节点相同
auth_pass 1111 #密码是1111,此参数备节点设置和主节点相同
}
virtual_ipaddress {
# 虚拟ip地址(VIP,一个尚未占用的内网ip即可)
10.0.0.13/24 dev eht0 label eth0:2
}
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
配置lib02 10.0.0.8的keepalived.conf在单实例的基础上增加vrrp_instance VI_2
! Configuration File for keepalived
global_defs {
notification_email{
13273151825@163.com
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id lib02 ##id为lb02,不同的keepalived.conf此ID要唯一
}vrrp_instance VI_1 { ##实例名字为VI_1,相同实例的备节点名字要和这个相同
interface eth0
# 同一个keepalived集群的virtual_router_id相同
virtual_router_id 55
# 权重,master要大于slave
priority 100
# 主备通讯时间间隔
advert_int 1
# 主备保持一致
authentication {
auth_type PASS #PASS认证类型,此参数备节点设置和主节点相同
auth_pass 1111 #密码是1111,此参数备节点设置和主节点相同
}
virtual_ipaddress {
# 虚拟ip地址(VIP,一个尚未占用的内网ip即可)
10.0.0.12/24 dev eht0 label eth0:1
}
}
vrrp_instance VI_2 { ##实例名字为VI_1,相同实例的备节点名字要和这个相同
state BACKUP
interface eth0
# 同一个keepalived集群的virtual_router_id相同
virtual_router_id 56
# 权重,master要大于slave
priority 150
# 主备通讯时间间隔
advert_int 1
# 主备保持一致
authentication {
auth_type PASS #PASS认证类型,此参数备节点设置和主节点相同
auth_pass 1111 #密码是1111,此参数备节点设置和主节点相同
}
virtual_ipaddress {
# 虚拟ip地址(VIP,一个尚未占用的内网ip即可)
10.0.0.13/24 dev eht0 label eth0:2
}
}
五、开发监测Keepalived裂脑脚本
检查思路:在备节点上执行脚本,如果可以PING通主节点并且备节点有VIP就报警,进行检查是否裂脑。
在lib02备节点开发脚本并执行
#! /bin/bash
lib01_vip=10.0.0.12
lib01_ip=10.0.0.7while true
do
ping -c 2 -W 3 $lib01_ip &>/dev/null
if [ $? -eq 0 -a `ip add|grep "$lib01_vip"|wc -l` -eq 1 ]
then
echo "hai is split brain.warning."
else
echo "hai is ok"
fi
sleep 5
done