Keepalived 高可用集群
- Keepalived,专门为LVS设计的,用来管理并监控LVS集群中的各个服务节点状态,后来又加入了可以实现高可用的VRRP功能。所以Keepalived还能作为其他服务。
- Keepalived主要是通过VRRP协议实现高可用。VRRP是Virtual Router Redundancy Protocol (虚拟路由器冗余协议),VRRP解决静态路由单点故障问题的,它能保证个别宕机后,整个网络不间断运行,所以Keepalived具有配置管理LVS功能,对LVS下面节点进行健康检查功能,以及实现网络的高可用。
- Keepalived官方网址:http://www.keepalived.org
- Keepailved除了LVS,对其他软件而言,只能实现高可用功能。
Keepalived的三大功能
- 管理LVS负载均衡软件:Keepalived可以通过读取自身的配置文件,实现通过更底层的接口直接管理LVS的配置以及控制服务的启动,停止功能
- 实现对LVS集群节点健康检查功能:当LVS集群中的某些节点同时发生故障,Keepalived自动将失效的节点从LVS正常转发列队中清除,并将请求调度到正常节点服务器上,当故障的节点被修复后,Keepalived又会自动的把他们加入到正常转发列队中,对客户提供服务。
- 作为系统网络服务的高可用功能(failover):
- Keepalived可以实现任意两台主机之间的故障转移和自动切换。如Master和Backup,这个主机可以是普通的不能停机的业务服务器,也可以是LVS负载均衡,也可以是Nginx反向代理服务器。
- Keepalived高可用的简单原理:两台主机同时安装好Keepalived并启动服务,开始工作是,Master主机提供服务,backup主机作为Master主机的热备。当Master失效或故障时,backup将自动接管Master的所有工作,包括接管VIP资源及相应资源服务,而当Master故障修复后,会自动接管回它原来处理的工作,backup则释放之前接管的工作。两台主机将恢复到最初的状态
Keepalived高可用故障切换转移原理
- Keepalived高可用服务之间的故障切换转移,时通过VRRP实现的
- Keepalived正常工作时,主Master节点会不端的向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活着,当主Master故障时,就无法发送心跳消息,备节点就会无法继续检测来自主的Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的IP资源及服务。当主恢复时,备节点又会释放之前接管的任务,恢复到原来分备用角色
裂脑及故障思路
- 裂脑:(网线坏掉)主会定时(比如每一秒)给备发心跳消息,当主出现故障,备接管任务,这没问题。但是,当主没有出现故障而是主备之间的网络坏掉,这时网关型防火墙过来的ARP协议通过IP查MAC地址,就会不知道给谁了,这就是裂脑。(网卡坏掉不会产生裂脑,Keepalived有健康检测)
- 解决脑裂办法(心跳连接):主备之间都要准备至少两块网卡。一块是和其他服务器在同一网段,另外的网卡组合成虚拟网卡默认名字(band0),实现网卡高可用。在单独的另一个网段,让主备之间单独互通。这个另外的网卡直接用真实的网线彼此连接。这种连接叫心跳连接。之所以分出另一个网段,也是为了防止多组主备之间的影响。比如:有主1 备1 和主2 备2,当主1坏了,但是主2还是好的,那么备1还会接受到主机发来的心跳消息,就不能及时接受主1的任务,会出现混淆。
- 故障思路:
- 简单判断:只要节点出现VIP就报警,两种情况:1是主机宕机了备机接管了;2是主机没宕机,裂脑了,
- 严重判断:备节点出现对应的VIP,并且主节点及对应的服务还活着,就说明裂脑了
CentOS 7.5安装keepalived
https://blog.youkuaiyun.com/cuiyaoqiang/article/details/79412599
https://jingyan.baidu.com/album/09ea3ede58d035c0aede3938.html?picindex=3
Keepalived过程简介(CentOS 6.5)
准备两台虚拟机master和backup(nginx反向代理)
在vmware中给想要实验的虚拟机增加虚拟网卡,并设置成不同网段。(在这里用仅主机模式)(两台都要做)
#查看网卡 eth1 没开启(state DOWN)
[root@moban6 ~]# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:1d:b3:55 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 00:0c:29:1d:b3:5f brd ff:ff:ff:ff:ff:ff
#做eth1的网卡配置文件
[root@moban6 ~]# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth1
[root@moban6 ~]# cat > /etc/sysconfig/network-scripts/ifcfg-eth1 << fff
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp
fff
[root@moban6 ~]# ifup eth1
#### 检查 ####
#yum本地安装
[root@moban6 ~]# mount /dev/sr0 /media/cdrom
[root@moban6 ~]# yum -y install keepalived
#yum本地安装的启动脚本就在
[root@moban6 ~]# /etc/init.d/keepalived start
#默认出现三个就是正确的
[root@moban6 conf]# ps -ef |grep -v grep|grep keep
root 3459 1 0 21:47 ? 00:00:00 /usr/sbin/keepalived -D
root 3460 3459 0 21:47 ? 00:00:00 /usr/sbin/keepalived -D
root 3461 3459 0 21:47 ? 00:00:00 /usr/sbin/keepalived -D
#默认会启动三个VIP地址
[root@moban6 conf]# ip add |grep 192.168
inet 192.168.200.152/24 brd 192.168.200.255 scope global eth0
inet 192.168.200.16/32 scope global eth0
inet 192.168.200.17/32 scope global eth0
inet 192.168.200.18/32 scope global eth0
#配置文件
[root@moban6 ~]# ll /etc/keepalived/keepalived.conf
#检查完就关了
[root@moban6 ~]# /etc/init.d/keepalived stop
#看配置文件(我们只能用高可用功能,因为是Nginx反向代理)
[root@moban6 conf]# head -13 /etc/keepalived/keepalived.conf |cat -n
1 ! Configuration File for keepalived
2
3 global_defs { #全局模块
4 notification_email { #里面是邮箱,出了问题给谁发邮件
5 acassen@firewall.loc #任意写就就行,因为没有邮件服务
6 failover@firewall.loc
7 sysadmin@firewall.loc
8 }
#下面是发件人邮箱地址,也随便写
9 notification_email_from Alexandre.Cassen@firewall.loc
10 smtp_server 192.168.200.1 #邮件服务器的ip地址
11 smtp_connect_timeout 30 #邮件服务器超时时间
12 router_id LVS_DEVEL #真实路由地址,主备的不能一样
13 }
[root@moban6 conf]# sed -n '15,30{=;p}' /etc/keepalived/keepalived.conf |xargs -L2
#这又是一个大的函数15-30行
15 vrrp_instance VI_1 { #vrrp(高可用对)的虚拟实例的名字VI_1主备之间名字一样(高可用对)
16 state MASTER #当前配置文件是主。从写BACKUP或SLAVE
17 interface eth0 #网卡接口,改为eth1
18 virtual_router_id 51 #虚拟路由IP主备相同的
19 priority 100 #优先级数字,一般主优先级高,就是数字大,一般主150,备100
20 advert_int 1 #每隔一秒发送心跳包
21 authentication { #密码验证,接受心跳包需要验证
22 auth_type PASS #一般就是使用默认的不改
23 auth_pass 1111
24 }
25 virtual_ipaddress { #虚拟IP地址就是VIP
26 192.168.200.16 #写一个就行
27 192.168.200.17
28 192.168.200.18
#修改后
29 192.168.200.16/24 dev eth0 label eth0:1
#eth0的网段,IP不能是主和备冲突但这两个配置文件里IP的需要相同
#虚拟IP绑定接口为eth0,接受数据包是eth0,别名(label)eth0:1,此参数节点设置主备相同
}
30 }
keepalived 单实例
###### 修改后 ######
[root@moban6 conf]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
740296672@qq.com
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LB01 #从LB02
}
vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 55
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16/24 dev eth0 label eth0:1
#eth0的网段,IP不能是主和备冲突但这两个配置文件里IP的需要相同
#虚拟IP绑定接口为eth0,接受数据包是eth0,别名(label)eth0:1,此参数节点设置主备相同
}
}
[root@moban6 conf]# /etc/init.d/keepalived start
Keepalived 双实例
#单实例是一种浪费资源。假如主不出故障呢,备就浪费了,所以我们做双实例,主备各有个VIP,这样就是有两个域名,大企业由于是多个域名,这样做节约资源
[root@moban6 conf]# vim /etc/keepalived/keepalived.conf
#### 上面的没有变化在这里就不写了 ####
vrrp_instance VI_2 {
state BACKUP
interface eth1
virtual_router_id 60
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.170/24 dev eth0 label eth0:2
}
}
[root@moban6 conf]# /etc/init.d/keepalived restart
##测试:就是两台服务器分别关闭服务,然后查看对方服务器的ifconfig
keepalived高可用对物理服务器问题
keepalived解决的是物理服务器故障,比如keepalived stop(刚才的实验),网卡坏掉。
但是keepalived不能检测htttp端口坏了,(/usr/local/nginx/sbin/nginx -s stop),所以我们要写个脚本。
##### 方法一 #####
#在主Master上做脚本
#如果没有80端口存在,就停掉Keepalived服务,实现释放本地VIP,在后台执行并检查
[root@moban6 conf]# cat check_nginx.sh
#!/bin/bash
while true
do
if [ `netstat -antup |grep nginx |wc -l` -ne 1 ];then
/etc/init.d/keepalived stop
fi
sleep 5
done
[root@moban6 conf]# sh check_nginx.sh &
[root@moban6 conf]# ps -ef | grep check | grep -v grep
##### 方法二 #####
[root@moban6 conf]# cat chk_nginx_proxy.sh
#!/bin/bash
if [ `netstat -antup |grep nginx |wc -l` -ne 1 ] ; then
/etc/init.d/keepalived stop
fi
[root@moban6 conf]#chmod +x chk_nginx_proxy.sh
[root@moban6 conf]#cat /etc/keepalived/keepalived.conf
[root@moban6 conf]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
740296672@qq.com
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LB01 #从LB02
}
vrrp_script chk_nginx_proxy { #定义vrrp脚本,检测http端口
script "/server/scripts/chk_nginx_proxy.sh" #执行脚本,有问题就停掉keepalived
interval 2 #间隔2秒
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 55
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16/24 dev eth0 label eth0:1
}
}
track_script {
chk_nginx_proxy #触发检查
}
解决多组Keepalived服务器在一个局域网的冲突问题
当在同一个局域网内部署了多组keepalived,而又未使用专门的心跳通信时,可能会发生高可用接管的严重故障。VRRP协议默认通过IP多播的形式实现高可用对之间的通信,默认为224.0.0.18,我们修改此多播地址,就可配置实现唯一的多播地址
[root@moban6 conf]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_19
vrrp_mcast_group4 224.0.0.19 #这就是指定多播地址的配置
}
#不同实例的通信密码最好不同,以确保接管正常
#另一款高可用原件Heartbeat,如果采用更多播方式实现主备通信,也会有多播地址冲突问题
检测裂脑简本
检测思路:再备节点上执行脚本,如果可以ping通主节点并备节点有VIP就报警,让人员介入检查
#正常情况下,主节点活着,VIP在主节点上,就不会报警
#可以将此脚本整合到Zabbix或者Nagios上监控
[root@moban6 conf]# cat check_split_brain.sh
#!/bin/bash
lb01_vip=192.168.200.150
lb01_ip=192.168.200.153
while true
do
ping -c 2 -W 3 $lb01_ip &>/dev/null
if [ $? -eq 0 -a `ip a |grep "$lb01_vip" |wc -l` -eq 1 ];then
echo "ha is split brain.warning"
else
echo "ha is OK"
fi
sleep 5
done