|
(1)管理LVS负载均衡软件
早期的LVS软件,需要通过命令行或脚本实现管理,并且没有针对LVS节点的健康检查功能。为了解决LVS的这些使用不便问题,Keepalived诞生了,可以说,Keepalived软件起初是专为解决LVS的问题而诞生的。因此,Keepalived和LVS的感情很深,他们的关系如同夫妻一样,可以紧密地结合,愉快地工作。Keepalived可以通过读取自身的配置文件,实现通过更底层的接口直接管理LVS的配置以及控制服务的启动,停止功能,这使得LVS的应用更加简单方便了。 |
(2)实现对LVS集群节点健康检查功能(healthcheck)
前文已讲过,Keepalived可以通过在自身的Keepalived.conf文件里配置LVS的节点IP和相关参数实现对LVS的直接管理;除此之外,当LVS集群中的某一个甚至是几个节点服务器同时发生故障无法提供服务时,Keepalived服务会自动将失效的节点服务器从LVS的正常转发队列中清除出去,并将请求调度到别的正常节点服务器上,从而保证最终用户的访问不受影响;当故障的节点服务器被修复以后,Keepalived服务又会自动地把它们加入到正常转发队列中,对客户提供服务。 |
(3)作为系统网络服务的高可用功能(failover)
|
|
Keepalived高可用之间是通过VRRP通信的,因此,我从VRRP开始给您讲起:
介绍完了VRRP,接下来我再介绍一下Keepalived服务的工作原理:
(1)硬件环境准备
准备4台物理服务器或4台VM虚拟机,两台用来做Keepalived服务,两台做测试的Web节点如下表所示:
HOSTNAME | IP | 说明 |
---|---|---|
yzh | 192.168.198.128 | Keepalived主服务器(Nginx主负载均衡器) |
yzh2 | 192.168.198.137 | Keepalived备服务器(Nginx备负载均衡器) |
web01 | 192.168.198.129 | web01服务器 |
(2)CentOS系统及Nginx代理环境
下面是CentOS系统及Nginx代理环境:
[root@yzh ~]# cat /etc/redhat-release
CentOS release 6.10 (Final)
[root@yzh ~]# uname -r
2.6.32-754.el6.x86_64
[root@yzh ~]# uname -m
x86_64
[root@yzh ~]# cat /etc/redhat-release
CentOS release 6.10 (Final)
[root@yzh ~]# ls -l /usr/local/nginx/
total 36
drwx------. 2 www root 4096 May 27 20:43 client_body_temp
drwxr-xr-x. 4 root root 4096 Jun 29 17:39 conf
drwx------. 2 www root 4096 May 27 20:43 fastcgi_temp
drwxr-xr-x. 4 root root 4096 May 27 21:04 html
drwxr-xr-x. 2 root root 4096 Jun 30 15:17 logs
drwx------. 2 www root 4096 May 27 20:43 proxy_temp
drwxr-xr-x. 2 root root 4096 Jun 29 15:55 sbin
drwx------. 2 www root 4096 May 27 20:43 scgi_temp
drwx------. 2 www root 4096 May 27 20:43 uwsgi_temp
说明:下面有关Keepalived安装,启动服务的操作都是同时处理lb01,lb02两台机器。
[root@yzh ~]# yum -y install keepalived
^Z
[1]+ Stopped yum -y install keepalived
[root@yzh ~]# rpm -qa keepalived
keepalived-1.2.13-5.el6_6.x86_64
启动及检查Keepalived服务的命令如下:
[root@yzh keepalived]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
[root@yzh keepalived]# ps -ef | grep keep | grep -v grep
root 3068 1 0 16:40 ? 00:00:00 /usr/sbin/keepalived -D
root 3070 3068 0 16:40 ? 00:00:00 /usr/sbin/keepalived -D
root 3071 3068 5 16:40 ? 00:00:00 /usr/sbin/keepalived -D
[root@yzh keepalived]# ip add | grep 192.168
inet 192.168.198.128/24 brd 192.168.198.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@yzh keepalived]# /etc/init.d/keepalived stop
Stopping keepalived: [ OK ]
#提示:测试完毕后关闭服务,上述测试需要同时在lb01和lb02两台服务器上进行
(1)全局定义(Global Definitions)部分
这部分主要用来设置Keepalived的故障通知机制和Router ID标识。示例代码如下:
1 ! Configuration File for keepalived
2
3 global_defs {
4 notification_email {
5 [email protected]
6 [email protected]
7 [email protected]
8 }
9 notification_email_from [email protected]
10 smtp_server 192.168.200.1
11 smtp_connect_timeout 30
12 router_id LVS_DEVEL
13 }
基础参数说明:
第1行是注释,!开头和#号开发一样,都是注释。
第2行是空行。
第3~8行是定义服务故障报警的Email地址。作用是当服务发生切换或RS节点等有故障时,发报警邮件。这几行是可选配置,notification_email指定在Keepalived发生事件时,需要发送的Email地址,可以有多个,每行一个。
第9行是指定发送邮件的发送人,即发件人地址,也是可选的配置。
第10行smtp_server指定发送邮件的smtp服务器,如果本机开启了sendmail或postfix,就可以使用上面默认配置实现邮件发送,也是可选配置。
第11行smtp_connect_timeout是连接smtp的超时时间,也是可选配置。
(2)VRRP实例定义区块(VRRP instance(s))部分
15 vrrp_instance VI_1 {
16 state MASTER
17 interface eth0
18 virtual_router_id 51
19 priority 100
20 advert_int 1
21 authentication {
22 auth_type PASS
23 auth_pass 1111
24 }
25 virtual_ipaddress {
26 192.168.200.16
27 192.168.200.17
28 192.168.200.18
29 }
30 }
参数说明:
第15行表示定义一个vrrp_instance实例,名字是VI_1,每个vrrp_instance实例可以认为是Keepalived服务的一个实例或者作为一个业务服务,在Keepalived服务配置中,这样的vrrp_instance实例可以有多个。注意,存在于主节点中的vrrp_instance实例在备节点中也要存在,这样才能实现故障切换接管。
第16行state MASTER表示当前实例VI_1的角色状态,当前角色为MASTER,这个状态只能有MASTER和BACKUP两种状态,并且需要大写这些字符。其中MASTER为正式工作的状态,BACKUP为备用的状态。当MASTER所在的服务器故障或失效时,BACKUP所在的服务器会接管故障的MASTER继续提供服务。
第17行interface为网络通信接口。为对外提供服务的网络接口,如eth0,eth1。当前主流的服务器都有2~4个网络接口,在选择服务接口时,要搞清楚了。
第18行virtual_router_id为虚拟路由ID标识,这个标识最好是一个数字,并且要在一个keepalived.conf配置中是唯一的。但是MASTER和BACKUP配置中相同实例的virtual_router_id又必须是一致的,否则将出现脑裂问题。
第19行priority为优先级,其后面的数值也是一个数字,数字越大,表示实例优先级越高。在同一个vrrp_instance实例里,MASTER的优先级配置要高于BACKUP的。若MASTER的priority值为150,那么BACKUP的priority必须小于150,一般建议间隔50以上为佳,例如:设置BACKUP的priority为100或更小的数值。
第20行advert_int为同步通知间隔。MASTER与BACKUP之间通信检查的时间间隔,单位为秒,默认为1.
第21~24行authentication为权限认证配置。包含认证类型(auth_type)和认证密码(auth_pass)。认证类型有PASS(Simple Passwd(suggested)),AH(IPSEC(not recommended))两种,官方推荐使用的类型为PASS。验证密码为明文方式,最好长度不要超过8个字符,建议用4位数字,同一vrrp实例的MASTER与BACKUP使用相同的密码才能正常通信。
第25 ~ 29 行virtual_ipaddress为虚拟IP地址。可以配置多个IP地址,每个地址占一行,配置时最好明确指定子网掩码以及虚拟IP绑定的网络接口。否则,子网掩码默认是32位,绑定的接口和前面的interface参数配置的一致。注意,这里的虚拟IP就是在工作中需要和域名绑定的IP,即和配置的高可用服务监听的IP要保持一致!
|
(1)实战配置Keepalived主服务器yzh MASTER
首先,配置yzh MASTER的keepalived.conf配置文件,操作步骤如下:
[root@yzh keepalived]# cd /etc/keepalived/
[root@yzh keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id yzh
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 55
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.198.240/24 dev eth0 label eth0:1
}
}
配置完毕后,启动Keepalived服务,然后检查配置结果,查看是否有虚拟IP 192.168.198.240
[root@yzh keepalived]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
[root@yzh keepalived]# ip a | grep 192.168.198.240
inet 192.168.198.240/24 scope global secondary eth0:1
出现上述带有vip:192.168.198.240行的结果表示yzh的Keepalived服务单实例配置成功
(2)实战配置Keepalived备服务器yzh2 BACKUP
[root@yzh2 keepalived]# cd /etc/keepalived/
[root@yzh2 keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id yzh2 #此参数和lb01 MASTER不同
}
vrrp_instance VI_1 { #和lb01 MASTER相同
state BACKUP #此参数和lb01 MASTER不同
interface eth0 #和lb01 MASTER相同
virtual_router_id 55 #和lb01 MASTER相同
priority 100 #此参数和lb01 MASTER不同
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.198.240/24 dev eth0 label eth0:1
}
}
配置完成后,启动Keepalived服务,如下:
[root@yzh2 keepalived]# /etc/init.d/keepalived start
正在启动 keepalived: [确定]
[root@yzh2 keepalived]# ip a | egrep "192.168.198.240|192.168.198.250"
#这里没有返回任何结果就对了,因为yzh2为BACKUP,当主节点活着的时候,它不会接管VIP 192.168.198.240
|
(3)进行高可用主备服务器切换实验
root@yzh keepalived]# ip a | grep 192.168.198.240 #虚拟VIP在lb01服务器上
inet 192.168.198.240/24 scope global secondary eth0:1
[root@yzh keepalived]# /etc/init.d/keepalived stop #停掉服务
Stopping keepalived: [ OK ]
[root@yzh keepalived]# /etc/init.d/keepalived stop
[root@yzh keepalived]# ip a | grep 192.168.198.240 #虚拟VIP消失了
[root@yzh keepalived]#
#再检查lb02服务器
[root@yzh2 keepalived]# ip a | grep 192.168.198.240 #虚拟VIP出现在了yzh2上
inet 192.168.198.240/24 scope global secondary eth0:1
[root@yzh2 keepalived]#
主节点启动Keepalived服务后,发现很快就又接管了VIP 192.168.198.240,操作及检查步骤如下:
[root@yzh keepalived]# ip a | grep 192.168.198.240
[root@yzh keepalived]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
[root@yzh keepalived]# ip a | grep 192.168.198.240
inet 192.168.198.240/24 scope global secondary eth0:1
[root@yzh2 keepalived]# ip a | grep 192.168.198.240
[root@yzh2 keepalived]
#这样就实现了单实例Keepalived服务IP自动漂移接管了,VIP漂移到了新机器新服务上,用户的访问请求自然就会找新机器新服务了。
Keepalived配置参数 | MASTER节点特殊参数 | BACKUP节点特殊参数 |
router_id(唯一标识) | router_id yzh | router_id yzh2 |
state(角色状态) | state MASTER | state BACKUP |
priority(竞选优先级) | priority 150 | priority 100 |
由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并在正常运行,这样就会导致同一个IP或服务在两端同时存在而发生冲突,最严重的是两台主机占用同一个VIP地址,当用户写入数据时可能会分别写入到两端,这可能会导致服务器两端的数据不一致或造成数据丢失,这种情况就被称为裂脑。 |
一般来说,裂脑的发生,有以下几种原因:
提示:
Keepalived配置里同一VRRP实例如果virtual_router_id两端参数配置不一致,也会导致裂脑问题发生。
在实际生产环境中,我们可以从以下几个方面来防止裂脑问题的发生:
作为互联网应用服务器的高可用,特别是前端Web负载均衡器的高可用,裂脑的问题对普通业务的影响是可以忍受的,如果是数据库或者存储的业务,一般出现裂脑问题就非常严重了。因此,可以通过增加冗余心跳线路来避免裂脑问题的发生,同时加强对系统的监控,以便裂脑发生时人为快速介入解决问题。
下面是生产场景检测裂脑故障的一些思路:
1)简单判断的思想:只要备节点出现VIP就报警,这个报警有两种情况,一是主机宕机了备机接管了;二是主机没宕,裂脑了。不管属于哪个情况,都进行报警,然后由人工查看判断及解决。
2)比较严谨的判断:备节点出现对应VIP,并且主节点及对应服务(如果能远程连接主节点看是否有VIP就更好了)还活着,就说明发生裂脑了。
具体检测系统裂脑的脚本见本节附录
前面给出的是Keepalived单实例主备模式的高可用演示,Keepalived还支持多实例多业务双向主备模式,即A业务在lb01上是主模式,在lb02上是备模式,而B业务在lb01上是备模式,在lb02上是主模式,下面就以双实例为例讲解不同业务实现双主的配置。
下图为Keepalived双实例双主模式IP及VIP规划表
HOSTNAME | IP | 说明 |
---|---|---|
yzh | 192.168.198.128 | VIP:192.168.198.240(用于绑定A服务www.yzh.com域名) |
yzh2 | 192.168.198.137 | VIP:192.168.198.250(用于绑定B服务bbs.yzh.com域名) |
首先,配置lb01 192.168.0.221的Keepalived.conf,在单实例的基础上增加一个vrrp_instance VI_2实例,步骤及内容如下:
[root@yzh keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id yzh
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 55
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.198.240/24 dev eth0 label eth0:1
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 56
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.198.250/24 dev eth0 label eth0:2
}
}
#提示: 以vrrp_instance VI_1在yzh 192.168.198.128服务器上的角色为主,vrrp_instance VI_2在yzh 192.168.198.128服务器上的角色为备。
然后配置yzh2 192.168.198.137的Keepalived.conf,在单实例的基础上增加vrrp_instance VI_2实例,步骤及内容如下:
[root@yzh2 keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id yzh2 #此参数和lb01 MASTER不同
}
vrrp_instance VI_1 { #和lb01 MASTER相同
state BACKUP #此参数和lb01 MASTER不同
interface eth0 #和lb01 MASTER相同
virtual_router_id 55 #和lb01 MASTER相同
priority 100 #此参数和lb01 MASTER不同
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.198.240/24 dev eth0 label eth0:1
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 56
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.198.250/24 dev eth0 label eth0:2
}
}
#提示: 以vrrp_instance VI_1在yzh2 192.168.198.137服务器上的角色为备,vrrp_instance VI_2在yzh2 192.168.198.137服务器上的角色为主。
接着,在yzh,yzh2上分别重启Keepalived服务,观察初始VIP设置情况。
[root@yzh keepalived]# /etc/init.d/keepalived restart
Stopping keepalived: [ OK ]
Starting keepalived: [ OK ]
[root@yzh keepalived]# ip a | egrep "192.168.198.240|192.168.198.250"
inet 192.168.198.240/24 scope global secondary eth0:1
inet 192.168.198.250/24 scope global secondary eth0:2
[root@yzh2 keepalived]# ip a | egrep "240|250"
inet 192.168.198.250/24 scope global secondary eth0:2
[root@yzh keepalived]# ip a | egrep "240|250"
inet 192.168.198.240/24 scope global secondary eth0:1
yzh上只有192.168.198.240了。
特别提示: 如果测试结果不符,请查看是否没有关闭iptables |