目录
VRRP协议原理
高可用配置文件
Keepalived高可用服务搭建测试
Keepalived高可用服务器的"脑裂"问题
参考文档:https://weread.qq.com/web/reader/ea732b705c6eeaea7febb5ek37132b503160371bce7de3e Keepalived软件主要是通过VRRP协议实现高可用功能;
Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:nginx、haproxy、Mysql等)的高可用解决方案。
VRRP协议原理
VRRP是Virtual Router Redundancy Protocol(虚拟路由冗余协议),它出现的目的就是为了解决静态路由单点故障问题的。它能够保证当个别节点宕机是,整个网络可以不间断的运行。
Keepalived一方面具有配置管理LVS的功能,还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。
VRRP通过一种竞选机制来讲路由的任务交给某台VRRP路由器的。
在一组VRRP路由器集群中,有多台物理VRRP路由器,但是这多台物理的机器并不是同时工作的,而是有一台称为Master的机器负责路由工作,其他的机器都是Backup。Master角色并非一成不变的,VRRP会让每个VRRP路由器参与竞选,最终获胜的就是Master。获胜的Master有一些特权,比如拥有虚拟路由器的IP地址等,拥有系统资源的Master负责转发发送给网关地址的包和响应ARP请求。
VRRP通过竞选机制来实现虚拟路由器的功能,所以的协议报文都是通过IP多播(Multicast)包(默认的多播地址224.0.0.18)形式发送的。虚拟路由器有VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址:00-00-5E-00-01-{VRID}。所以,在一个虚拟路由器中,不管谁是Master,对外都是相同的MAC和IP(称之为VIP)。客户端主机并不需要因Master的改变而修改自己的路由配置。对它们来说,这种切换是透明的。
在一组虚拟路由器中,只有作为Master的VRRP路由会一直发送VRRP广播包(VRRP Advertiesment messages),此时Backup不会抢占Master。当Master不可用时,Backup就收不到来自Master的广播包了,此时多台Backup中优先级最高的路由器会抢占为Master。这种抢占是非常快速的(可能只有1秒甚至更少),以保证服务的连续性。出于安全性考虑,VRRP数据包使用了加密协议进行了加密。
在Keepalived服务正常工作时,主master节点会不断地想备节点发送(多播的方式)心跳信息,用以告诉备Backup节点自己还活着,当主Master节点发生故障时,就无法发送心跳信息,备节点也就因此无法继续检测到来自主Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的IP资源及服务。而当主Master节点恢复是,备Backup节点又会释放主节点故障是自身接管的IP资源及服务,恢复到原来的备用角色。
高可用配置文件
# 全局定义(Global Definition)部分
! Configuration File for keepalived # 注释
global_def {
# 定义服务故障报警的Email地址,作用是当服务发生切换或RS节点等有故障时,发报警邮件。email地址可以多个。
notification_email {
test1@test.com
test2@test.com
}
# 指定发送邮件的发送人,即发件人地址,可选配置
notification_email_from test@test.com
# smtp_server指定发送邮件的smtp服务器,如果本机开启了sendmail或postfix,就可以使用上面默认配置实现邮件发送,也是可选配置。
smtp_server 192.168.108.1
# smtp_connect_timeout是连接smtp的超时时间,可选配置
smtp_connect_timeout 30
# keepalived服务器的路由标识(router_id)。在一个局域网内,这个标识(router_id)应该是唯一的。
router_id LVS_DEVEL
}
# VRRP实例定义区块(VRRP instance(s) )部分
# 这部分主要用来定义具体服务的实例配置,包括Keepalived主备状态、接口、优先级、认证方式和IP信息等。
# 定义一个vrrp_instance实例,名字是VI_1,每个vrrp_instance实例可以认为是Keepalived服务的一个实例或者作为一个业务服务,
vrrp_instance VI_1 {
# 表示当前实例VI_1的角色状态,当前角色为MASTER。这个状态只有MASTER和BACKUP两种状态,并且需要大写这些字符。其中MASTER为正式工作状态,BACKUP为备用状态。
# 当MASTER所在的服务器故障或失效时,BACKUP所在的服务器会接管故障的MASTER继续提供服务。
state MASTER
# interface 为网络接口。为对外提供服务的网络接口,如eth0、eth1。
interface eth0
# virtual_router_id为虚拟路由ID标识,这个标识最好是一个数字,并且要在一个keepalived.conf配置中是唯一的。但是MASTER和BACKUP配置中相同实例virtual_router_id又必须是一致的,否则将出现脑裂问题。
virtual_router_id 51
# 优先级,其后面的数值是一个数字,数字越大,表示实例优先级越高。在同一个vrrp_instance实例里,MASTER的优先级配置要高于BACKUP的。若MASTER的priority值为150,那么BACKUP的priority必须小于150,一般建议间隔50以上,例如:设置BACKUP的priority为100 或者更小的数值。
priority 100
# 同步通知间隔。MASTER与BACKUP之间通信检查的时间间隔,单位为,秒,默认为1。
advert_int 1
# authentication 为权限认证配置。包含认证类型(auth_type)和认证密码(auth_pass)。认证类型有PASS(Simple Passwd(suggested))、AH(IPSEC(not recommended))两种,官方推荐使用的类型为PASS。验证密码为铭文方式,最好长度不要超过8个字符,建议用4位的数字,同一vrrp实例的MASTER与BACKUP使用相同的密码才能通信。
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟IP地址。可以配置多个IP地址,每个地址占一行,配置时最好明确指定子网掩码以及虚拟IP绑定的网络接口。否则,子网掩码默认是32位,绑定的接口和前面的interface参数配置的一致。注意,这里的虚拟IP就是在工作中需要和域名绑定的IP,即和配置的高可用服务监听的IP要保持一致。
virtual_ipaddress {
192.168.200.16
192.168.200.17
192.168.200.18
}
}
Keepalived高可用服务搭建测试
通过创建两个lxc ( 操作系统为ubuntu 16.04)进行keepalived的高可用测试,通过本次测试,还发现,lxc也可以用来做keepalived的高可用部署。
实验环境 IP分配
Hostname | lxc IP | vip |
keepalived-ha-test-1 | 192.168.200.40 | 172.168.188.40 |
keepalived-ha-test-2 | 192.168.200.41 |
配置文件:
keepalived 配置文件
keepalived-ha-test-1 | keepalived-ha-test-2 |
global_defs { vrrp_instance VI_1 { | global_defs { vrrp_instance VI_1 { |
启动master和backup两个lxc的keepalived服务,发现172.168.188.40,在master(keepalived-ha-test-1)上,(通过ip a,可以观察到),当将master上的keepalived服务停掉,在backup(keepalived-ha-test-2)上执行 ip a 的时候,会发现172.168.188.40在该服务器上。可以通过 watch ip a 命令来观察IP漂移的情况。
遇到一个问题:
May 31 03:38:47 keepalived-ha-test-2 Keepalived_vrrp[878]: (VI_1): ip address associated with VRID 51 not present in MASTER advert : 172.168.188.40
原因:
解决多组keepalived服务器在一个局域网内的冲突问题:
当在同一个局域网内部署了多组keepalived服务对,而又未使用专门的心跳先通信时,可能会发生高可用接管的严重故障问题。
1.VRRP协议默认是通过IP多播的形式实现高可用对之间的通信,如果同一个局域网内存在多组keepalived服务器对,就会造成IP多播地址冲突问题,导致接管错乱,不同组的keepalived都会使用默认的224.0.0.18作为多播地址。
2.局域网内有相同VRID的其他keepalived实例,即,局域网内virtual_router_id有冲突,因为vrrp是通过多播的方式进行方式,进行心跳检测的,且默认多播地址:224.0.0.18。
3.不同实例的通信认证密码也最好不同,以确保接管正常。
解决方案:
1.此时的解决方法是,在同组的keepalived服务器所有配置文件里指定独一无二的多播地址。
global_defs {
router_id LVS_19
vrrp_mcast_group4 224.0.0.19 ##指定多播地址的配置
}
2.修改两个lxc中keepalived的配置文件中的virtual_router_id(我改了一个250),重启keepalived服务后,日志中不在报错。
Keepalived高可用服务器的"脑裂"问题
1.什么是脑裂
由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务器的所有权,而此时的高可用服务器对都还活着并在正常运行,这样就会导致同一个IP或者服务在两端同时存在而发生冲突,最严重的是两台主机占用同一个VIP地址(这不是IP冲突么?),当用户写入数据时可能会分别写入到两端,这可能会导致服务器两端的数据不一致。或造成数据丢失,这种情况,就被称为脑裂。
2.导致脑裂发生的原因
(1)高可用服务器对之间心跳线链路发生故障,导致无法正常通信。
- 心跳线坏了(包括断了,老化)
- 网卡及相关驱动坏了,IP配置及冲突问题(网卡直连)
- 心跳线间连接的设备故障(网卡及交换机)
- 仲裁的机器出问题(采用仲裁的方案)
(2)高可用服务器上开启了iptalbes防火墙阻挡了心跳消息传输。
(3)高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。
(4)其他服务器配置不当等原因,如果心跳方式不同,心跳广播冲突、软件Bug等。
(5)keepalived配置里同一VRRP实例如果virtual_router_id两端参数配置不一致,也会导致脑裂问题发生。