Keepalived高可用集群

  1. Keepalived介绍
    Keepalived软件起初是专门为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx,Haproxy,MySQL等)的高可用解决方案软件。

Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,他能够保证当个别节点宕机时,整个网络可以不间断地运行。所以,Keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。

(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主机失效时它接管的工作,此时,两台主机将恢复到最初启动时各自的原始角色及工作状态。

Keepalived高可用之间是通过VRRP通信的,因此,我从VRRP开始给您讲起:

  • VRRP也就是虚拟路由冗余协议,它的出现就是为了解决静态路由的单点故障。
  • VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的。
  • VRRP用IP多播的方式(默认多播地址(224.0.0.18))实现高可用之间通信。
  • 工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对。
  • VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。

介绍完了VRRP,接下来我再介绍一下Keepalived服务的工作原理:

  • Keepalived高可用之间是通过VRRP进行通信的,VRRP是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。
  • 在Keepalived服务之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性。接管速度最快可以小于1秒。

2.Keepalived高可用服务搭建准备
(1)硬件环境准备

准备4台物理服务器或4台VM虚拟机,两台用来做Keepalived服务,两台做测试的Web节点如下表所示:

HOSTNAME IP 说明
lb01 192.168.0.221 Keepalived主服务器(Nginx主负载均衡器)
lb02 192.168.0.222 Keepalived备服务器(Nginx备负载均衡器)
web01 192.168.0.223 web01服务器
web02 192.168.0.224 web02服务器

2.1开始安装Keepalived软件
说明:下面有关Keepalived安装,启动服务的操作都是同时处理lb01,lb02两台机器。

[root@lb01 ~]# yum -y install keepalived
[root@lb01 ~]# rpm -qa keepalived
keepalived-1.2.7-3.el6.x86_64

启动Keepalived服务并检查
启动及检查Keepalived服务的命令如下:

    [root@lb01 ~]# /etc/init.d/keepalived start
    Starting keepalived:                                       [  OK  ]
    [root@lb01 ~]# ps -ef | grep keep | grep -v grep
    root       7111      1  0 11:18 ?        00:00:00 /usr/sbin/keepalived -D
    root       7114   7111  0 11:18 ?        00:00:00 /usr/sbin/keepalived -D
    root       7117   7111  0 11:18 ?        00:00:00 /usr/sbin/keepalived -D

#提示:启动后有3个Keepalived进程表示安装正确

[root@lb01 ~]# ip add | grep 192.168
    inet 192.168.0.221/24 brd 192.168.0.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
#提示:默认情况会启动三个VIP地址

[root@lb01 ~]# /etc/init.d/keepalived stop
Stopping keepalived:                                       [  OK  ]

#提示:测试完毕后关闭服务,上述测试需要同时在lb01和lb02两台服务器上进行
2.2Keepalived配置文件说明
和其他使用yum安装的软件一样,Keepalived软件的配置文件默认路径及配置文件名为:

[root@lb02 ~]# ls -l /etc/keepalived/keepalived.conf 
-rw-r--r--. 1 root root 3562 Feb 21  2013 /etc/keepalived/keepalived.conf

前面已经说过,Keepalived软件有3个主要功能,而这里仅讲解其高可用部分的功能。

这里的具备高可用功能的Keepalived.conf配置文件包含了两个重要区块,下面会分别说明

(1)全局定义(Global Definitions)部分

这部分主要用来设置Keepalived的故障通知机制和Router ID标识。示例代码如下:

[root@lb02 ~]# 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
    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的超时时间,也是可选配置。

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

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

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

[root@lb02 ~]# sed -n '15,30{=;p}' /etc/keepalived/keepalived.conf | xargs -L2
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要保持一致!

3Keepalived高可用服务单实例实战
3.1 配置Keepalived实现单实例单IP自动漂移接管

  • 事实上,网络服务的高可用功能基本原理都很简单,就是把手动的操作自动化运行而已。当没有配置高可用服务时,如果服务器宕机了怎么解决呢?无非就是找一个新服务器,配好域名解析的那个原IP,然后搭好相应的网络服务罢了,只不过手工去实现这个过程会比较漫长,相比而言,自动化切换效率更高,效果更好,而且还可以有更多的功能,例如:发送ARP广播,触发执行相关脚本动作等。
  • 实际上也可以将高可用对的两台机器应用服务同时开启,但是只让有VIP一端的服务器提供服务,若主的服务器宕机,VIP会自动漂移到备用服务器上,此时用户的请求直接发送到备用服务器上,而无需临时启动对应服务(事先开启应用服务)。下面就来学习VIP自动漂移的实战案例。

(1)实战配置Keepalived主服务器lb01 MASTER

首先,配置lb01 MASTER的keepalived.conf配置文件,操作步骤如下:

[root@lb01 ~]# cd /etc/keepalived/
[root@lb01 keepalived]# vim keepalived.conf

#删掉已有的所有默认配置,加入经过修改好的如下配置:
[root@lb01 keepalived]# cat keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
    215379068@qq.com        #邮箱随便写
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1        #邮件服务器IP
   smtp_connect_timeout 30
   router_id lb01               #id为lb1,不能和其他Keepalived节点相同(全局唯一)
}

vrrp_instance VI_1 {                #实例名字为VI_1,相同实例的备节点名字要和这个相同
    state MASTER                    #状态为MASTER,备节点状态需要为BACKUP
    interface eth1                  #通信(心跳)接口为eth1,此参数备节点设置和主节点相同
    virtual_router_id 55            #实例ID为55,要和备节点相同
    priority 150                    #优先级为150,备节点的优先级必须比此数字低
    advert_int 1                    #通信检查间隔时间1秒
    authentication {
        auth_type PASS              #PASS认证类型,此参数备节点设置和主节点相同
        auth_pass 1111              #密码1111,此参数备节点设置和主节点相同
    }
    virtual_ipaddress {
    192.168.0.240/24 dev eth0 label eth0:1 
    #虚拟IP,即VIP为192.168.0.240,子网掩码为24位,绑定接口为eth0,别名为eth0:1,此参数备节点设置和主节点相同
    }
}
配置完毕后,启动Keepalived服务,如下:

[root@lb01 keepalived]# /etc/init.d/keepalived start
然后检查配置结果,查看是否有虚拟IP 192.168.0.240

[root@lb01 keepalived]# ip a | grep 192.168.0.240
    inet 192.168.0.240/24 scope global secondary eth0:1

出现上述带有vip:192.168.0.240行的结果表示lb01的Keepalived服务单实例配置成功

(2)实战配置Keepalived备服务器lb02 BACKUP

首先,配置lb02 BACKUP的keepalived.conf配置文件,操作步骤如下:

[root@lb02 ~]# cd /etc/keepalived/
[root@lb02 keepalived]# vim keepalived.conf 

#删掉已有的默认配置,加入经过修改的如下配置(注意和lb01的不同):
[root@lb02 keepalived]# cat keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
    215379068@qq.com
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb02               #此参数和lb01 MASTER不同
}

vrrp_instance VI_1 {            #和lb01 MASTER相同
    state BACKUP                #此参数和lb01 MASTER不同
    interface eth1              #和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.0.240/24 dev eth0 label eth0:1
    }
}
配置完成后,启动Keepalived服务,如下:

[root@lb02 keepalived]# /etc/init.d/keepalived start
Starting keepalived:                                       [  OK  ]

#然后检查配置结果,查看是否有虚拟IP 192.168.0.240

[root@lb02 keepalived]# ip a | grep 192.168.0.240
[root@lb02 keepalived]# 

#这里没有返回任何结果就对了,因为lb02为BACKUP,当主节点活着的时候,它不会接管VIP 192.168.0.240
出现上述无任何结果的现象,表示lb02的Keepalived服务单实例配置成功。如果同学们的配置过滤后有192.168.0.240的IP,则表示Keepalived工作不正常,同一个IP地址同一时刻应该只能出现一台服务器。
如果查看BACKUP备节点VIP有如下信息,说明高可用裂脑了,裂脑是两台服务器争抢同一资源导致的,例如:两边都配置了同一个VIP地址。
出现上述两台服务器争抢同一IP资源问题,一般要先考虑排查两个地方:
1)主备两台服务器对应的Keepalived.conf配置文件是否有错误?例如,是否同一实例的virtual_router_id配置不一致。
(2)进行高可用主备服务器切换实验

root@lb01 keepalived]# ip a | grep 192.168.0.240        #虚拟VIP在lb01服务器上
    inet 192.168.0.240/24 scope global secondary eth0:1
[root@lb01 keepalived]# /etc/init.d/keepalived stop     #停掉服务
Stopping keepalived:                                       [  OK  ]
[root@lb01 keepalived]# /etc/init.d/keepalived stop
[root@lb01 keepalived]# ip a | grep 192.168.0.240       #虚拟VIP消失了
[root@lb01 keepalived]# 

#再检查lb02服务器
[root@lb02 keepalived]# ip a | grep 192.168.0.240           #虚拟VIP出现在了lb02上
    inet 192.168.0.240/24 scope global secondary eth0:1
[root@lb02 keepalived]#

我们可以发现,备节点lb02已经接管绑定了192.168.0.240这个VIP,这期间备节点还会发送ARP广播,让所有的客户端更新本地的ARP表,以便客户端访问新接管VIP服务的节点。
此时如果再启动主服务器的Keepalived服务,主服务器就会接管回VIP 192.168.0.240,启动后可以观察下主备的IP漂移情况,备服务器是否释放了IP?主服务器是否又接管了IP?
主节点启动Keepalived服务后,发现很快就又接管了VIP 192.168.0.240,操作及检查步骤如下:

[root@lb01 keepalived]# ip a | grep 192.168.0.240
[root@lb01 keepalived]# /etc/init.d/keepalived start
Starting keepalived:                                       [  OK  ]
[root@lb01 keepalived]# ip a | grep 192.168.0.240
    inet 192.168.0.240/24 scope global secondary eth0:1

#与此同时,备节点上的VIP 192.168.0.240则被释放了,如下:
[root@lb02 keepalived]# ip a | grep 192.168.0.240
[root@lb02 keepalived]#

#这样就实现了单实例Keepalived服务IP自动漂移接管了,VIP飘逸到了新机器新服务上,用户的访问请求自然就会找新机器新服务了。
说明:
这里仅实现了VIP的自动漂移切换,因此,仅适合两台服务器提供的服务均保持开启的应用场景,这也是工作中常用的高可用解决方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值