在此之前,我已经用docker部署了mysql、mycat、haproxy。现在要支持高可用,还需要部署keepalived。如果也把keepalived部署到docker容器里,那么配置的虚拟vip就是容器里的ip,而不是宿主机上的,是无法通过外网访问的。所以我直接在宿主机上部署keepalived服务。
1、安装keepalived服务。
apt-get install keepalived -y
2、keepalived默认配置文件是/etc/keepalived/keepalived.conf,但该文件不存在,需要新建。
vim /etc/keepalived/keepalived.conf
内容如下:
#keepalived配置文件
global_defs {
router_id NodeA #路由ID, 主备的ID不能相同
notification_email {
xxx@xxx.com
}
notification_email_from xxx@xxx.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
vrrp_skip_check_adv_addr
#在keepalived的服务器上配合使用nginx或haproxy时,需要把这一项注掉,否则VIP ping不通,80端口也无法正常访问
# vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#自定义监控脚本
vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 5
weight -10
}
vrrp_instance VI_1 {
state MASTER #Master为主机,备机设为BACKUP
interface ens160 #指定网卡(宿主机真实网卡,ip a查看)
virtual_router_id 1
priority 100 #优先级,BACKUP机器上的优先级要小于这个值
advert_int 1 #设置主备之间的检查时间,单位为s
authentication { #定义验证类型和密码,主备需相同
auth_type PASS
auth_pass ruijie
}
track_script {
chk_haproxy #ha存活监控脚本
}
virtual_ipaddress { #VIP地址,可为多个。如果有需要可以部署双机双VIP
192.168.10.199 #必须和宿主机在同一个网段,我的宿主机是192.168.10.46
}
}
3、上面的配置内容中有个执行脚本,/etc/keepalived/check_haproxy.sh需要新建。
vim /etc/keepalived/check_haproxy.sh
内容如下:
#!/bin/bash
# 查看进程是否存在
exist=`docker inspect --format '{{.State.Running}}' haproxy`
if [ "${exist}" != "true" ]; then
#service keepalived stop
/etc/init.d/keepalived stop
fi
4、把check_haproxy.sh脚本文件设置为可执行。
chmod +x /etc/keepalived/check_haproxy.sh
5、service keepalived start
6、下面在另一台宿主机上也如此操作,不过这个是设为备机。
和之前的主机配置不同的地方只有两处,都是在keepalived.conf文件里。
router_id NodeB #路由ID, 主备的ID不能相同
state BACKUP #Master为主机,备机设为BACKUP
其他的都一样。
7、执行ip a命令,可以在主机上看到指定网卡ens160里面有了虚拟ip地址192.168.10.199
8、停止主机的keepalived服务,看看虚拟ip是否转移到了备机上了。部署没问题的话,会成功转移到备机。
9、重启主机的keepalived服务,看看虚拟ip是否回到了主机。
10、假设虚拟ip现在主机上,停掉主机上的haproxy,根据检测脚本,keepalived服务也会被停止,这时候虚拟ip应该又成功转移到备机了。
至此,高可用搭建完成。