一、配置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
     }
 }

keepalived 的IP需要和物理机统一网段么 keepalived router_id_服务器

keepalived 的IP需要和物理机统一网段么 keepalived router_id_时间间隔_02

启动后查看是否有虚拟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
     }   
 }

keepalived 的IP需要和物理机统一网段么 keepalived router_id_内网_03

keepalived 的IP需要和物理机统一网段么 keepalived router_id_时间间隔_04

二、进行高可用主备服务器切换

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
     }
 }

keepalived 的IP需要和物理机统一网段么 keepalived router_id_服务器_05

keepalived 的IP需要和物理机统一网段么 keepalived router_id_内网_06

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

配置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 的IP需要和物理机统一网段么 keepalived router_id_服务器_07

keepalived 的IP需要和物理机统一网段么 keepalived router_id_服务器_08

五、开发监测Keepalived裂脑脚本

检查思路:在备节点上执行脚本,如果可以PING通主节点并且备节点有VIP就报警,进行检查是否裂脑。

在lib02备节点开发脚本并执行

keepalived 的IP需要和物理机统一网段么 keepalived router_id_时间间隔_09

#! /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