Keepalived 高可用集群实践
keepalived介绍
Keepalived是一个基于vrrp协议的高可用方案,vrrp协议的软件实现,原生设计的目的为了高可用ipvs服务。实现一个双机热备高可用功能,检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
vrrp协议
VRRP是一种容错协议,它通过把几台路由设备联合组成一台虚拟的路由设备,并通过一定的机制来保证当主机的下一跳设备出现故障时,可以及时将业务切换到其它设备,从而保持通讯的连续性和可靠性。
vip漂移实验
需求:实现VIP自动漂移的高可用环境。这种模式下,vip附属于在master的机器上,当master机器出现故障,自动把vip漂移到backup机器上;继续提供服务。
资源列表
master: 172.17.5.242 centos6.9
backup: 172.17.5.241 centos6.6
对外提供访问的IP: VIP 172.17.6.100
安装
MASTER和BACKUP都是一样,使用yum 安装
[root@master ~]# yum install -y keepalived
#修改配置文件
[root@master ~]# > /etc/keepalived/keepalived.conf [root@master ~] vim /etc/keepalived/keepalived.conf
清空原来的配置文件;把下面的配置文件分别黏贴到MASTER和BACKUP上面去。
MASTER的配置文件如下:
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_01 #keepalived服务器路由表示;局域网内唯一 } vrrp_instance VI_1 { # 实例名称 state MASTER # 实例的角色;只有MASTER和BACKUP两种。都是大写 interface eth0 # 通讯的网卡,要注意区分 VIP的ip的网卡 virtual_router_id 51 # 虚拟路由ID 跟BACKUP的一样。 priority 150 # 优先级,数字越大越优先 advert_int 1 # 与BACKUP通信间隔时间,默认1S authentication { auth_type PASS #权限认证;官方推荐PASS密码方式,与BACKUP一样。 auth_pass 1111 #明文密码。与BACKUP一样 } virtual_ipaddress { 虚拟IP,即VIP地址;绑定接口eth0 别名是:eth0:1 172.17.6.100/21 dev eth0 label eth0:1 } }
BACKUP的配置文件如下:
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_02 #keepalived服务器路由表示;局域网内唯一;与MASTER不同 } vrrp_instance VI_1 { # 实例名称 state BACKUP # 实例的角色;只有MASTER和BACKUP两种。都是大写 interface eth0 # 通讯的网卡,要注意区分 VIP的ip的网卡 virtual_router_id 51 # 虚拟路由ID 跟BACKUP的一样。 priority 100 # 优先级,数字越大越优先;低于MASTER advert_int 1 # 与BACKUP通信间隔时间,默认1S authentication { auth_type PASS #权限认证;官方推荐PASS密码方式,与BACKUP一样。 auth_pass 1111 #明文密码。与BACKUP一样 } virtual_ipaddress { 虚拟IP,即VIP地址;绑定接口eth0 别名是:eth0:1 172.17.6.100/21 dev eth0 label eth0:1 } }
留意MASTER与BACKUP上的配置文件差异。
注意:特别要留意配置文件的内容是否有错误,keepalived没有配置文件检测功能,启动并不会报错。
配置文件完成后,启动服务
[root@master ~] /etc/init.d/keepalived start #启动
master查看是否有虚拟ip
[root@master ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 00:15:5d:02:18:1a brd ff:ff:ff:ff:ff:ff
inet 172.17.5.242/21 brd 172.17.7.255 scope global eth0
inet 172.17.6.100/21 scope global secondary eth0:1
inet6 fe80::215:5dff:fe02:181a/64 scope link
valid_lft forever preferred_lft forever
查看进程
[root@master ~]# ps aux|grep keepalived
root 49936 0.0 0.0 110292 1380 ? Ss 16:22 0:00 /usr/sbin/keepalived -D
root 49937 0.0 0.0 114592 3044 ? S 16:22 0:00 /usr/sbin/keepalived -D
root 49938 0.0 0.0 114468 2304 ? S 16:22 0:00 /usr/sbin/keepalived -D
root 50072 0.0 0.0 103324 896 pts/1 S+ 16:23 0:00 grep keepalived
测试
1.在master 关掉keepalived服务。在backup上查看是否有虚拟ip
2. master 启动后,虚拟ip是否能漂移回来。
解决高可用只针对物理服务器的问题
[root@master src]# cat /usr/local/src/check_nginx.sh
#!/bin/bash
while true
do
if [ `netstat -lnpt|grep nginx|wc -l` -ne 1 ];then
/etc/init.d/keepalived stop
fi
sleep 5
done
[root@master src]# cat chk_nginx_proxy.sh
#!/bin/bash
if [ `netstat -lnpt|grep nginx|wc -l` -ne 1 ];then
/etc/init.d/keepalived stop
fi
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_01 #keepalived服务器路由表示;局域网内唯一
}
vrrp_script chk_nginx_proxy {
script "/usr/local/src/chk_nginx_proxy.sh"
interval 2
weight 2
}
vrrp_instance VI_1 { # 实例名称
state MASTER # 实例的角色;只有MASTER和BACKUP两种。都是大写
interface eth0 # 通讯的网卡,要注意区分 VIP的ip的网卡
virtual_router_id 51 # 虚拟路由ID 跟BACKUP的一样。
priority 150 # 优先级,数字越大越优先
advert_int 1 # 与BACKUP通信间隔时间,默认1S
authentication {
auth_type PASS #权限认证;官方推荐PASS密码方式,与BACKUP一样。
auth_pass 1111 #明文密码。与BACKUP一样
}
virtual_ipaddress { 虚拟IP,即VIP地址;绑定接口eth0 别名是:eth0:1
172.17.6.100/21 dev eth0 label eth0:1
}
track_script {
chk_nginx_proxy
}
}
[root@master src]# netstat -lntp|grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 49271/nginx
[root@master src]# /etc/init.d/keepalived status
keepalived (pid 49293) 正在运行...
[root@master src]# ip add|grep 172.17.6.100
inet 172.17.6.100/21 scope global secondary eth0:1
[root@master src]# service nginx stop
停止 Nginx: [确定]
[root@master src]# ip add|grep 172.17.6.100
[root@master src]# /etc/init.d/keepalived status
keepalived 已停
[root@slave ~]# ip addr |grep 172.17.6.100
inet 172.17.6.100/21 scope global secondary eth0:1