安装

基础环境:服务器: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
文档更新时间: 2019-07-22 14:38   作者:子木