Keepalived高可用集群应用
1、keepalived服务说明
1.1、keepalived介绍
Keepalived是一个用C语言编写的路由软件。该项目的主要目标是为Linux系统和基于Linux的基础设施提供简单而强大的负载均衡和高可用性设施。Loadbalancing框架依赖于众所周知且广泛使用的 提供Layer4负载平衡的Linux虚拟服务器(IPVS)内核模块。Keepalived实现了一组检查器,根据其健康动态地自适应维护和管理负载均衡服务器池。另一方面,VRRP实现高可用性协议。VRRP是路由器故障转移的基础砖块。此外,Keepalived还为VRRP有限状态机提供了一系列挂钩,以提供低级别和高速协议交互。Keepalived框架可以独立使用,也可以一起使用,以提供弹性基础设施。
Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。
Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。
所以,Keepalived 一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能
1.2、keepalived服务的三个重要功能
管理LVS负载均衡软件
实现对LVS集群节点的健康检查功能
作为系统网络服务的高可用功能(failover)
1.3、keepalived高可用故障切换转移原理
Keepalived高可用服务对之间的故障切换转移,是通过 VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)来实现的。VRRP的出现就是为了解决静态踣甶的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。
在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活看,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。
1.4、keepalived 原理
Keepalived高可用对之间是通过VRRP通信的,因此,我们从 VRRP开始了解起:
1) VRRP,全称 Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。
2) VRRP是通过一种竞选协议机制来将路由任务交给某台 VRRP路由器的。
3) VRRP用 IP多播的方式(默认多播地址(224.0.0.18))实现高可用对之间通信。
4) 工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的开源。备节点可以有多个,通过优先级竞选,但一般 Keepalived系统运维工作中都是一对。
5) VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。
工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。在 Keepalived服务对之间,只有作为主的服务器会一直发送 VRRP广播包,告诉备它还活着,此时备不会枪占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性.接管速度最快可以小于1秒。
2、keepalived部署
环境说明
主机名 |
IP地址 |
说明 |
lb01 |
10.0.0.5 |
负载均衡(keepalived主服务器) |
lb02 |
10.0.0.6 |
负载均衡(keepalived备服务器) |
Web01 |
10.0.0.7 |
网站服务器(已经搭建好discuz和wordpress) |
db01 |
10.0.0.51 |
网站数据库服务器 |
2.1、软件安装及配置文件说明
yum install keepalived -y
配置文件/etc/keepalived/keepalived.conf说明
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
1 ! Configuration File for keepalived #注释,说明该配置文件为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 #邮箱服务器
11 smtp_connect_timeout 30 #定义超时时间
12 router_id LVS_DEVEL #定义路由器标识,相同局域网要求唯一
13 }
14
15 vrrp_instance VI_1 { #实例定义区,实例名称为VI_1
16 state MASTER #当前实例角色状态,可选项为MASTER(主)和BACKUP(备)
17 interface eth0 #虚拟ip地址放置的网络通信接口
18 virtual_router_id 51 #虚拟路由ID标识
19 priority 100 #优先级权值,决定主备,越大越优先
20 advert_int 1 #主备间同步通知间隔
21 authentication { #权限认证配置
22 auth_type PASS #认证类型
23 auth_pass 1111 #认证密码,密码相同主备间才能互相通信
24 }
25 virtual_ipaddress { #虚拟ip地址
26 192.168.200.16
27 192.168.200.17
28 192.168.200.18
29 }
30 }
后面内容省略
2.2、部署
去掉配置文件中不必要的内容
主负载均衡服务器配置
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL1
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
备负载均衡服务器配置
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
2.3、启动服务
在lb01和lb02上配置好负载均衡后,都启动nginx和keepalived服务
[root@lb01 ~]# nginx
[root@lb01 ~]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
利用ip addr命令查看ip
[root@lb01 ~]# 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 pfifo_fast state UP qlen 1000
link/ether 00:0c:29:c1:51:ec brd ff:ff:ff:ff:ff:ff
inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0
inet 10.0.0.3/32 scope global eth0
inet6 fe80::20c:29ff:fec1:51ec/64 scope link
valid_lft forever preferred_lft forever
[root@lb02 ~]# 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 pfifo_fast state UP qlen 1000
link/ether 00:0c:29:e6:5f:14 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0
inet6 fe80::20c:29ff:fee6:5f14/64 scope link
valid_lft forever preferred_lft forever
可以发现,主负载均衡服务器上有我们配置的虚拟ip,备负载均衡服务器上没有,这是根据配置来决定的。可以通过抓包软件wireshark来抓取VRRP协议来检验,keepalived服务使lb01和lb02都通过VRRP协议和组播地址224.0.0.18通信,使用虚拟ip10.0.0.3以及1111来进行认证
这个时候我们在lb01即主服务器上停止其keepalived服务,再查看lb01和lb02的ip,可以发现ip地址10.0.0.3到了lb02备服务器上,这与理论是相符合的,相当于主服务器宕机之后,虚拟ip会通过组播VRRP分配到备服务器上
[root@lb01 ~]# 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 pfifo_fast state UP qlen 1000
link/ether 00:0c:29:c1:51:ec brd ff:ff:ff:ff:ff:ff
inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0
inet6 fe80::20c:29ff:fec1:51ec/64 scope link
valid_lft forever preferred_lft forever
[root@lb02 ~]# 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 pfifo_fast state UP qlen 1000
link/ether 00:0c:29:e6:5f:14 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0
inet 10.0.0.3/32 scope global eth0
inet6 fe80::20c:29ff:fee6:5f14/64 scope link
valid_lft forever preferred_lft forever
3、keepalived存在的问题
3.1、keepalived服务器的"生锈"问题
在配置好主负载均衡服务器和备负载均衡服务器之后,如果某个服务器宕机,keepalived服务会将虚拟ip分配分配给另外一台服务器。但是如果这种情况不会发生,那么备负载均衡服务器将一直不会起到负载均衡服务器的作用来与后端服务器进行负载均衡的分配,通俗的来说即"生锈"。我们如果有多个网站需要运行在web服务器上,那么在配置主负载均衡和备负载均衡时我们可以将其交叉进行,即一台服务器作为一个网站的主负载均衡服务器,同时又作为另外一个网站的备负载均衡服务器,另外一台跟这一台相仿。这样大体来看,负载均衡服务器没有了主备之分,都起到了相应作用。
例如我们将discuz论坛的主负载均衡服务器指定为lb01,备负载均衡服务器指定为lb02。将wordpress博客的主负载均衡服务器指定为lb02,备负载均衡服务器指定为lb01。
其中lb01的keepalived配置文件如下
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL1
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id
priority
advert_int 1
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
10.0.0.3
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id
priority
advert_int 1
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
10.0.0.4
}
}
3.2、keepalived服务器的"脑裂"问题
3.2.1 脑裂问题介绍
在高可用(HA)系统中,当联系2个节点的"心跳线"断开时(不能通过VRRP相互通信),本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像"裂脑人"一样,争抢"共享资源"、争起"应用服务",就会发生严重后果——或者共享资源被瓜分、2边"服务"都起不来了;或者2边"服务"都起来了,但同时读写"共享存储",导致数据损坏(常见如数据库轮询着的联机日志出错)。
3.2.2 脑裂问题产生的原因
一般来说,脑裂的发生,有以下几种原因:
※ 高可用服务器对之间心跳线链路发生故障,导致无法正常通信。
因心跳线坏了(包括断了,老化)。
因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。
因心跳线间连接的设备故障(网卡及交换机)。
因仲裁的机器出问题(采用仲裁的方案)。
※ 高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
※ 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。
※ 其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。
※ 提示: Keepalived配置里同一 VRRP实例如果 virtual_router_id两端参数配置不一致也会导致裂脑问题发生
3.2.3 脑裂问题的解决方案
在实际生产环境中,我们可以从以下几个方面来防止裂脑问题的发生:
※ 同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了,另一个还是好的,依然能传送心跳消息。
※ 当检测到裂脑时强行关闭一个心跳节点(这个功能需特殊设备支持,如Stonith、feyce)。相当于备节点接收不到心跳消患,通过单独的线路发送关机命令关闭主节点的电源。
※ 做好对裂脑的监控报警(如邮件及手机短信等或值班).在问题发生时人为第一时间介入仲裁,降低损失。例如,百度的监控报警短倍就有上行和下行的区别。报警消息发送到管理员手机上,管理员可以通过手机回复对应数字或简单的字符串操作返回给服务器.让服务器根据指令自动处理相应故障,这样解决故障的时间更短.
当然,在实施高可用方案时,要根据业务实际需求确定是否能容忍这样的损失。对于一般的网站常规业务.这个损失是可容忍的。
3.2.4 脑裂情况监控
可以利用脚本在备负载均衡服务器上进行监控,在脑裂情况未发生的情况下
执行命令ip a show eth0 |grep 10.0.0.3|wc -l可以得出虚拟ip有没有在该备服务器上,以0和1来进行区分
脚本如下
[root@lb02 scripts]# vim check_keepalived.sh
#!/bin/bash
while true
do
if [ `ip a show eth0 |grep 10.0.0.3|wc -l` -ne 0 ]
then
echo "keepalived is error!"
else
echo "keepalived is OK !"
fi
done
脚本要赋予执行权限,可以添加定时任务来进行定时的监控
3.3、keepalived服务器不随业务停止而停止服务
在实际中还存在着一种情况:若主负载均衡服务器的负载均衡功能(nginx服务)停止,但是keppalived服务并不会主动随nginx的停止而停止,即keepalived服务和其他负载均衡服务如nginx服务之间没有必然关联。那么这样的情况就导致虚拟ip无法主动漂移到备服务器上使备服务器接管业务。
执行命令ps -ef |grep nginx |grep -v grep |wc –l过滤出nginx进程并计数,正常情况下为2,当这个数小于2时,就主动停止keepalived服务(自杀式任务)从而使备服务器接管工作,在主服务器上利用脚本让keepalived监控nginx
[root@lb02 scripts]# vim check_nginx.sh
#!/bin/bash
ngx_pro_count=`ps -ef|grep nginx|grep -v "grep"|wc -l`
if [ $ngx_pro_count -lt 2 ];then
/etc/init.d/keepalived stop
fi
同样脚本要赋予执行权限,可以添加定时任务来进行定时的监控或者将脚本引入到keepalived.conf中执行
[root@lb01 scripts]# chmod +x check_nginx.sh
[root@lb01 scripts]# ll
总用量 4
-rwxr-xr-x 1 root root 134 5月 20 16:51 check_nginx.sh
[root@lb01 scripts]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL1
}
vrrp_script check { #定义脚本
script "/service/scripts/check_nginx.sh" #表示将一个脚本信息赋值给变量check_web
interval 2 #执行监控脚本的间隔时间
weight 2 #利用权重值和优先级进行运算,从而降低主服务优先级使之变为备服务器(建议先忽略)
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
track_script { #调用脚本
check
}
}
文章部分内容参考来源:https://www.cnblogs.com/clsn/p/8052649.html
转载请务必注明出处