Keepalived高可用集群应用实践

一、Keepalived高可用软件

1 Keepalived介绍 
Keepalived软件起初是专门为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx,Haproxy,MySQL等)的高可用解决方案软件。 
Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,他能够保证当个别节点宕机时,整个网络可以不间断地运行。所以,Keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。 
Keepalived软件的官方站点是http://www.keepalived.org

2 Keepalived服务的三个重要功能 
(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可以实现任意两台主机之间,例如Master和Backup主机之间的故障转移和自动切换,这个主机可以是普通的不能停机的业务服务器,也可以是LVS负载均衡,Nginx反向代理这样的服务器。 
Keepalived高可用功能实现的简单原理为,两台主机同时安装好Keepalived软件并启动服务,开始正常工作时,由角色为Master的主机获得所有资源并对用户提供服务,角色为Backup的主机作为Master主机的热备;当角色为Master的主机失效或出现故障时,角色为Backup的主机将自动接管Master主机的所有工作,包括接管VIP资源及相应资源服务;而当角色为Master的主机故障修复后,又会自动接管回它原来处理的工作,角色为Backup的主机则同时释放Master主机失效时它接管的工作,此时,两台主机将恢复到最初启动时各自的原始角色及工作状态。

3 Keepalived高可用故障切换转移原理

Keepalived高可用服务之间的故障切换转移,是通过VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)来实现的。

1、VRRP协议:虚拟路由冗余协议,VRRP,全称Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现就是为了解决静态路由的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。VRRP早期是用来解决交换机,路由器等设备单点故障的,下面是交换,路由的Master和Backup切换原理描述,同样适用于Keepalived的工作原理。

2、故障转移

Keepalived高可用对,主k每秒发给备k发广播包。如果备k接收不到广播包就会认为主k死了,马上会抢走主k得vip。主k和备k是用一根网线直连得,叫心跳链接。band叫网卡绑定,防止脑裂。

二、Keepalived高可用服务搭建准备

1 安装Keepalived环境说明 
准备4台物理服务器或4台VM虚拟机,两台用来做Keepalived服务,两台做测试的Web节点 
两个Keepalived服务得主机需要各自添加一块网卡,并且要在同一网段。

添加完网卡操作如下

 
  1. [root@nginx~bak~]# cd /etc/sysconfig/network-scripts/
  2. [root@nginx~bak network-scripts]# cp ifcfg-eth0 ifcfg-eth1 #复制网卡配置文件为eth1
  3. [root@nginx~bak network-scripts]# cat ifcfg-eth1
  4. DEVICE=eth1
  5. TYPE=Ethernet
  6. ONBOOT=yes
  7. NM_CONTROLLED=yes
  8. BOOTPROTO=dhcp

image_1cs3af83c1d4cis018lbld188mm.png-64.1kB

2 开始安装Keepalived软件,要在nginx~server和nginx~bak都安装

 
  1. [root@nginx~server ~]# yum -y install keepalived
  2. [root@nginx~server ~]# rpm -qa keepalived
  3. keepalived-1.2.7-3.el6.x86_64

3 启动Keepalived服务并检查

 
  1. [root@nginx~server ~]# /etc/init.d/keepalived start
  2. [root@nginx~server ~]# ps -ef | grep keep | grep -v grep
  3. [root@nginx~server ~]# ip add | grep 192.168
  4. [root@nginx~server ~]# /etc/init.d/keepalived stop

image_1cs3b2iks1jvf1m3dj3o1poq1h5313.png-77.2kB

4 Keepalived配置文件说明 
Keepalived软件的配置文件默认路径及配置文件名为:/etc/keepalived/keepalived.conf 
具备高可用功能的Keepalived.conf配置文件包含了两个重要区块 
(1) 全局定义(Global Definitions)部分

 
  1. 1 ! Configuration File for keepalived
  2. 2
  3. 3 global_defs {
  4. 4 notification_email {
  5. 5 acassen@firewall.loc
  6. 6 failover@firewall.loc
  7. 7 sysadmin@firewall.loc
  8. 8 }
  9. 9 notification_email_from Alexandre.Cassen@firewall.loc
  10. 10 smtp_server 192.168.200.1
  11. 11 smtp_connect_timeout 30
  12. 12 router_id LVS_DEVEL
  13. 13 }

第1行是注释,!开头和#号开发一样,都是注释。 
第2行是空行。 
第3~8行是定义服务故障报警的Email地址。作用是当服务发生切换或RS节点等有故障时,发报警邮件。这几行是可选配置,notification_email指定在Keepalived发生事件时,需要发送的Email地址,可以有多个,每行一个。 
第9行是指定发送邮件的发送人,即发件人地址,也是可选的配置。 
第10行smtp_server指定发送邮件的smtp服务器,如果本机开启了sendmail或postfix,就可以使用上面默认配置实现邮件发送,也是可选配置。 
第11行smtp_connect_timeout是连接smtp的超时时间,也是可选配置。

注意: 
第4~11行所有和邮件报警相关的参数均可以不配,在实际工作中会将监控的任务交给更加擅长监控报警的Nagios或Zabbix软件。

第12行是Keepalived服务器的路由标识(router_id).在一个局域网内,这个标识(router_id)应该是唯一的。 
大括号“{}”。用来分隔区块,要成对出现。如果漏写了半个大括号,Keepalived运行时,不会报错,但也不会得到预期的结果。另外,由于区块间存在多层嵌套关系,因此很容易遗漏区块结尾处的大括号,要特别注意。

(2) VRRP实例定义区块(VRRP instance(s))部分

 
  1. 15 vrrp_instance VI_1 {
  2. 16 state MASTER
  3. 17 interface eth0
  4. 18 virtual_router_id 51
  5. 19 priority 100
  6. 20 advert_int 1
  7. 21 authentication {
  8. 22 auth_type PASS
  9. 23 auth_pass 1111
  10. 24 }
  11. 25 virtual_ipaddress {
  12. 26 192.168.200.16
  13. 27 192.168.200.17
  14. 28 192.168.200.18
  15. 29 }
  16. 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要保持一致!

三、Keepalived高可用服务单实例实战

1 配置Keepalived实现单实例单IP自动漂移接管 
(1)实战配置Keepalived主服务器nginx~server

 
  1. #删掉已有的所有默认配置,加入经过修改好的如下配置:
  2. 1 ! Configuration File for keepalived
  3. 2
  4. 3 global_defs {
  5. 4 notification_email {
  6. 5 3306684360@qq.com #邮箱随便写
  7. 6
  8. 7 }
  9. 8 notification_email_from Alexandre.Cassen@firewall.loc
  10. 9 smtp_server 127.0.0.1 #邮件服务器IP
  11. 10 smtp_connect_timeout 30
  12. 11 router_id lb01 #id为lb1,不能和其他Keepalived节点相同(全局唯一)
  13. 12 }
  14. 13
  15. 14 vrrp_instance VI_1 { #实例名字为VI_1,相同实例的备节点名字要和这个相同
  16. 15 state MASTER #状态为MASTER,备节点状态需要为BACKUP
  17. 16 interface eth1 #通信(心跳)接口为eth1,此参数备节点设置和主节点相同
  18. 17 virtual_router_id 55 #实例ID为55,要和备节点相同
  19. 18 priority 150 #优先级为150,备节点的优先级必须比此数字低
  20. 19 advert_int 1 #通信检查间隔时间1秒
  21. 20 authentication {
  22. 21 auth_type PASS #PASS认证类型,此参数备节点设置和主节点相同
  23. 22 auth_pass 1111 #密码1111,此参数备节点设置和主节点相同
  24. 23 }
  25. 24 virtual_ipaddress {
  26. 25 192.168.200.120/24 dev eht0 label eth0:1
  27. #虚拟IP,即VIP为192.168.200.120,子网掩码为24位,绑定接口为eth0,别名为eth0:1,此参数备节点设置和主节点相同
  28. 26 }
  29. 27 }

配置完毕后,启动Keepalived服务 
然后检查配置结果,查看是否有虚拟IP 192.168.232.129 
image_1cs3drvp110qr1eq219juu0l1iq12a.png-8kB

(2) 实战配置Keepalived备服务器nginx~bak

 
  1. #删掉已有的默认配置,加入经过修改的如下配置(注意和lb01的不同):
  2. ! Configuration File for keepalived
  3. global_defs {
  4. notification_email {
  5. 33063606@qq.com
  6. }
  7. notification_email_from Alexandre.Cassen@firewall.loc
  8. smtp_server 127.0.0.1
  9. smtp_connect_timeout 30
  10. router_id lb02 #此参数和nginx~server MASTER不同
  11. }
  12. vrrp_instance VI_1 { #和nginx~server 相同
  13. state BACKUP #此参数和nginx~server 不同
  14. interface eth1 #和nginx~server 相同
  15. virtual_router_id 55 #和nginx~server 相同
  16. priority 100 #此参数和nginx~server 不同
  17. advert_int 1
  18. authentication {
  19. auth_type PASS
  20. auth_pass 1111
  21. }
  22. virtual_ipaddress {
  23. 192.168.200.160/24 dev eth0 label eth0:1
  24. }
  25. }

image_1cs3fscfq18no1vqeum6sdueup37.png-17.5kB

出现上述无任何结果的现象,表示bak的Keepalived服务单实例配置成功。如果配置过滤后有192.168.200.160的IP,则表示Keepalived工作不正常,同一个IP地址同一时刻应该只能出现一台服务器。 
如果查看BACKUP备节点VIP有如下信息,说明高可用裂脑了,裂脑是两台服务器争抢同一资源导致的,例如:两边都配置了同一个VIP地址。 
出现上述两台服务器争抢同一IP资源问题,一般要先考虑排查两个地方: 
1)主备两台服务器对应的Keepalived.conf配置文件是否有错误?例如,是否同一实例的virtual_router_id配置不一致。

(3)进行高可用主备服务器切换实验

上图为高可用主服务器正常运行时 
image_1cs3gjo2510rnm5t1sr0cgn4mn78.png-19.8kB

image_1cs3gl3rib631ekbv3nvn2sqq8l.png-14.8kB

主服务器宕机时 
image_1cs3ge8qe1jntq5b1t3b1api1h975u.png-31.2kB

image_1cs3gfmrmaqmb2u5lu1heonrv6b.png-24.2kB

 

说明: 这里仅实现了VIP的自动漂移切换,因此,仅适合两台服务器提供的服务均保持开启的应用场景,这也是工作中常用的高可用解决方案。

2 单实例主备模式Keepalived配置文件对比 
image_1cs3gq28h11itamgqim11p8pmv92.png-18.4kB

四、Keepalived高可用服务器的“裂脑”问题

1 什么是裂脑 
由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并在正常运行,这样就会导致同一个IP或服务在两端同时存在而发生冲突,最严重的是两台主机占用同一个VIP地址,当用户写入数据时可能会分别写入到两端,这可能会导致服务器两端的数据不一致或造成数据丢失,这种情况就被称为裂脑。

2 导致裂脑发生的原因 
一般来说,裂脑的发生,有以下几种原因: 
(1)高可用服务器对之间心跳线链路发生故障,导致无法正常通信。 
(2)心跳线坏了(包括断了,老化) 
(3)网卡及相关驱动坏了,IP配置及冲突问题(网卡直连)。 
(4)心跳线间连接的设备故障(网卡及交换机) 
(5)仲裁的机器出问题(采用仲裁的方案) 
(6)高可用服务器上开启了iptables防火墙阻挡了心跳消息传输 
(7)高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。 
(8)其他服务配置不当等原因,如心跳方式不同,心跳广播冲突,软件BUG等

Keepalived配置里同一VRRP实例如果virtual_router_id两端参数配置不一致,也会导致裂脑问题发生。

3 解决裂脑的常见方案 
在实际生产环境中,我们可以从以下几个方面来防止裂脑问题的发生:

同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了,另一个还是好的,依然能传送心跳消息。 
当检测到裂脑时强行关闭一个心跳节点(这个功能需特殊设备支持,如Stonith,fence)。相当于备节点接收不到心跳消息,通过单独的线路发送关机命令关闭主节点的电源。 
做好对裂脑的监控报警(如邮件及手机短信等或值班),在问题发生时人为第一时间介入仲裁,降低损失。例如,百度的监控报警短信就有上行和下行的区别。报警信息发送到管理员手机上,管理员可以通过手机回复对应数字或简单的字符串操作返回给服务器,让服务器根据指令自动处理相应故障,这样解决故障的时间更短。 
当然,在实施高可用方案时,要根据业务实际需求确定是否能容忍这样的损失。对于一般的网站常规业务,这个损失是可容忍的。

4 解决Keepalived裂脑的常见方案 
作为互联网应用服务器的高可用,特别是前端Web负载均衡器的高可用,裂脑的问题对普通业务的影响是可以忍受的,如果是数据库或者存储的业务,一般出现裂脑问题就非常严重了。因此,可以通过增加冗余心跳线路来避免裂脑问题的发生,同时加强对系统的监控,以便裂脑发生时人为快速介入解决问题。

如果开启防火墙,一定要让心跳消息通过,一般通过允许IP段的形式解决。 
可以拉一条以太网网线或者串口线作为主被节点心跳线路的冗余。 
开发检测程序通过监控软件(例如Nagios)检测裂脑。 
下面是生产场景检测裂脑故障的一些思路:

1)简单判断的思想:只要备节点出现VIP就报警,这个报警有两种情况,一是主机宕机了备机接管了;二是主机没宕,裂脑了。不管属于哪个情况,都进行报警,然后由人工查看判断及解决。

2)比较严谨的判断:备节点出现对应VIP,并且主节点及对应服务(如果能远程连接主节点看是否有VIP就更好了)还活着,就说明发生裂脑了。

 

五、Keepalived双实例双主模式配置

1 Keepalived双实例双主模式配置实战 
前面给出的是Keepalived单实例主备模式的高可用演示,Keepalived还支持多实例多业务双向主备模式,即A业务在server上是主模式,在bak上是备模式,而B业务在server上是备模式,在bak上是主模式,下面就以双实例为例讲解不同业务实现双主的配置。

在server上配置Keepalived.conf,在单实例的基础上增加一个vrrp_instance VI_2实例,步骤及内容如下:

 
  1. [root@nginx~server ~]# cat /etc/keepalived/keepalived.conf
  2. ! Configuration File for keepalived
  3. global_defs {
  4. notification_email {
  5. 3306684360@qq.com
  6. }
  7. notification_email_from Alexandre.Cassen@firewall.loc
  8. smtp_server 127.0.0.1
  9. smtp_connect_timeout 30
  10. router_id lb01
  11. }
  12. vrrp_instance VI_1 {
  13. state MASTER
  14. interface eth1
  15. virtual_router_id 55
  16. priority 150
  17. advert_int 1
  18. authentication {
  19. auth_type PASS
  20. auth_pass 1111
  21. }
  22. virtual_ipaddress {
  23. 192.168.200.160/24 dev eth0 label eth0:1
  24. }
  25. }
  26. vrrp_instance VI_2 {
  27. state BACKUP
  28. interface eth1
  29. virtual_router_id 56
  30. priority 100
  31. advert_int 1
  32. authentication {
  33. auth_type PASS
  34. auth_pass 1111
  35. }
  36. virtual_ipaddress {
  37. 192.168.200.170/24 dev eth0 label eth0:2
  38. }
  39. }
  40. vrrp_instance VI_1server 服务器上的角色为主,vrrp_instance VI_2server 服务器上的角色为备。

在bak上配置Keepalived.conf,在单实例的基础上增加一个vrrp_instance VI_2实例,步骤及内容如下:

 
  1. [root@nginx~bak ~]# cat /etc/keepalived/keepalived.conf
  2. ! Configuration File for keepalived
  3. global_defs {
  4. notification_email {
  5. 33063606@qq.com
  6. }
  7. notification_email_from Alexandre.Cassen@firewall.loc
  8. smtp_server 127.0.0.1
  9. smtp_connect_timeout 30
  10. router_id lb02
  11. }
  12. vrrp_instance VI_1 {
  13. state BACKUP
  14. interface eth1
  15. virtual_router_id 55
  16. priority 100
  17. advert_int 1
  18. authentication {
  19. auth_type PASS
  20. auth_pass 1111
  21. }
  22. virtual_ipaddress {
  23. 192.168.200.160/24 dev eth0 label eth0:1
  24. }
  25. }
  26. vrrp_instance VI_2 {
  27. state MASTER
  28. interface eth1
  29. virtual_router_id 56
  30. priority 150
  31. advert_int 1
  32. authentication {
  33. auth_type PASS
  34. auth_pass 1111
  35. }
  36. virtual_ipaddress {
  37. 192.168.200.170/24 dev eth0 label eth0:2
  38. }
  39. }

vrrp_instance VI_1在bak 服务器上的角色为备,vrrp_instance VI_2在bak 
服务器上的角色为主。

image_1cs3jei14a9230qmjs4oapham.png-139.7kB

测试: 
1、 
image_1cs3huvlt15an3qf17bl1s791aus9f.png-20.8kB 
2、 
image_1cs3ilh691vvt14883ib1jh1170r9s.png-41.5kB
3、 
image_1cs3jqe6dcnibh96d2n2finuc3.png-36.1kB

特别提示: 如果测试结果不符,请查看是否没有关闭iptables 
到此为止,我们发现sever,bak主备节点已经实现了初始配置的VIP服务状态,当任意一端宕机,VIP可以实现互相切换接管。在实际工作中,可以把www.mendermi.com解析到192.168.200.140提供服务,把bbs.yunjisuan.com解析到192.168.200.139提供服务,当然了,server,bak也要配置相应服务,例如:Nginx反向代理服务等。

 

六、Nginx负载均衡配合Keepalived服务案例实战

1 在server和bak上配置Nginx负载均衡

image_1cs3l22pg5as10qg165ekn37vpcg.png-46.8kB

image_1cs3l48ku14q31g5a1cvt1edm216dd.png-47.6kB

2、用户访问准备

(1)在客户端hosts文件里把www.mendermi.com域名解析到VIP 192.168.200.160上,正式场景需通过DNS解析。bbs.mendermi.com域名解析到VIP 192.168.200.170上

(2)两台服务器配好Nginx负载均衡服务,并且确保后面代理的Web节点可以测试访问。 
image_1cs3lddr7sr2ro6u2ife65ksdq.png-15.7kB

image_1cs3ldrmce7j1u80l0n1tmginge7.png-16kB

(3)下面模拟实际的访问过程 
通过客户端浏览器输入www.mendermi.com测试访问,正常应该显示下图。 
image_1cs3lfgee5m11m65jqm1lkm155lek.png-11.1kB

image_1cs3lft0pik31q6m1qn01clrtb5f1.png-11.5kB

此时停止server服务器或停掉Keepalived服务,观察业务是否正常: 
image_1cs3ljhc215itnn51l1i1ssmbq2fe.png-24.5kB

观察bak备节点是否接管了VIP 192.168.200.160 
image_1cs3lmjik671msm198o1f5o1mn8fr.png-25.2kB

再次通过客户端浏览器输入www.mendermi.com测试访问,正常应该出现关闭server的keepalives服务前的结果,显示下图。 
image_1cs3lo10p7m2nop1epj1gk137eg8.png-11.2kB

image_1cs3logojeqs1ce21h0t1aea1b9egl.png-11.5kB

(4)开启lb01的Keepalived服务

image_1cs3m8qd913ur1e411ure15jj18o3h2.png-95.3kB

posted @ 2018-11-16 13:00  mendermi  阅读(284)  评论(0编辑  收藏  举报