(负载均衡)(keepalived) 脑裂和数据包分裂解决方案。(无主多从式keepalived负载均衡热备设计)
keepalived等负载均衡都有一个固定的主keepalived 提供数据分发和数据包转发功能,此种设计导致当主Keepalived出现故障后,数据包转发丢失,或脑裂的问题:
1.问题描述
广发电子签名接口两台keepalived做主备出现主keepalived切换至从keepalived时无法访问keepalived 80接口的情况。且时断时续,部分数据包正常访问,部分数据包只有sep包,无ack包。
2.解决方案
重新设计keeplived负载均衡模式,采用无固定主keepalived模式的设计
3.测试详解:
<1>原始keepalived存在固定主keepalived做负载均衡的模式的测试数据:
原始keepalived 配置文件:
-------------------------------------------------------------------------------------------------------------------------------------------
主keepalived:
[shell]
! Configuration File for keepalived
vrrp_instance VI_1 {
#VRRP 配置标识 VI_1是实列名称,一个文件可配置多个
state MASTER
#指定Keepalived角色 MASTER表示此主机为主服务器 BACKUP 则是表示为备用服务器
interface p4p1
#节点固有IP(非VIP)的网卡,用来发VRRP包
lvs_sync_daemon_inteface p4p1
#抗脑裂设置(双节点同步监听ip心跳)
mcast_src_ip 192.168.1.254
#设置发送VRRP包的IP地址
virtual_router_id 51
#虚拟路由标识(0-255),同一个VRRP实列使用唯一的标识,DB中的规范是使用节点IP的最后一位。如:192.168.1.254>的254(主备相同)
priority 100
#节点优先级,数字越大表示节点的优先级越高。keepalived启动时会通过选举将优先级最高的节点选举为master。
advert_int 1
# 发送通告的时间间隔,
# 按照vrrp的官方文档,backup会接收master的advert_int的值,然后计算出skew time和master down interval,
#认为master宕机触发的选举时间应该是(3 * Master_Adver_Interval) + Skew_time
nopreempt
#设置为不自动抢占虚拟IP地址
authentication {
auth_type PASS
auth_pass 1111
#同一 VRRP 实列 MASTER 与 BACKUP 使用相同的密码才能正常通信(主备相同)
}
virtual_ipaddress {
192.168.1.252/24 dev p4p1
#设置虚拟IP地址(VIP),又叫做漂移IP地址 可以有多个,每个一行(主备机必须相同,也是对外的虚拟IP)
}
}
[/shell]
-------------------------------------------------------------------------------------------------------------------------------------------
从keepalived:
[shell]
! Configuration File for keepalived
vrrp_instance VI_1 {
#VRRP 配置标识 VI_1是实列名称,一个文件可配置多个
state BACKUP
#指定Keepalived角色 MASTER表示此主机为主服务器 BACKUP 则是表示为备用服务器
interface ens33
#节点固有IP(非VIP)的网卡,用来发VRRP包
lvs_sync_daemon_inteface ens33
#抗脑裂设置(双节点同步监听ip心跳)
mcast_src_ip 192.168.1.253
#设置发送VRRP包的IP地址
virtual_router_id 51
#虚拟路由标识(0-255),同一个VRRP实列使用唯一的标识,DB中的规范是使用节点IP的最后一位。如:192.168.1.254>的254(主备相同)
priority 99
#节点优先级,数字越大表示节点的优先级越高。keepalived启动时会通过选举将优先级最高的节点选举为master。
advert_int 1
# 发送通告的时间间隔,
# 按照vrrp的官方文档,backup会接收master的advert_int的值,然后计算出skew time和master down interval,
#认为master宕机触发的选举时间应该是(3 * Master_Adver_Interval) + Skew_time
nopreempt
#设置为不自动抢占虚拟IP地址
authentication {
auth_type PASS
auth_pass 1111
#同一 VRRP 实列 MASTER 与 BACKUP 使用相同的密码才能正常通信(主备相同)
}
virtual_ipaddress {
192.168.1.252/24 dev p4p1
#设置虚拟IP地址(VIP),又叫做漂移IP地址 可以有多个,每个一行(主备机必须相同,也是对外的虚拟IP)
}
}
[/shell]
-------------------------------------------------------------------------------------------------------------------------------------------
存在缺陷:
1.当主keepalived宕机或者关闭keepalived后虽然负载均衡会自动切换至从keepalived,但是当主keepalived恢复后负载均衡又会切回主keepalived导致不必要的多次切换,损失性能和增加了切换导致的数据丢失风险。
2.tcp数据包由于主keepalived转发错误导致的数据包丢失不完整以及脑裂等时断时续可能出现的问题:
现象为实际提供服务的服务器数据包接收到不完整的tcp数据包:
3.主keepalived宕机后影响服务的稳定性。
<1>新设计的keepalived无固定主keepalived做负载均衡的模式的测试数据:
无固定keepalived 配置文件:
-------------------------------------------------------------------------------------------------------------------------------------------
主keepalived:
[shell]
! Configuration File for keepalived
vrrp_instance VI_1 {
#VRRP 配置标识 VI_1是实列名称,一个文件可配置多个
state BACKUP
#指定Keepalived角色 MASTER表示此主机为主服务器 BACKUP 则是表示为备用服务器
interface p4p1
#节点固有IP(非VIP)的网卡,用来发VRRP包
lvs_sync_daemon_inteface p4p1
#抗脑裂设置(双节点同步监听ip心跳)
mcast_src_ip 192.168.1.254
#设置发送VRRP包的IP地址
virtual_router_id 51
#虚拟路由标识(0-255),同一个VRRP实列使用唯一的标识,DB中的规范是使用节点IP的最后一位。如:192.168.1.254>的254(主备相同)
priority 100
#节点优先级,数字越大表示节点的优先级越高。keepalived启动时会通过选举将优先级最高的节点选举为master。
advert_int 1
# 发送通告的时间间隔,
# 按照vrrp的官方文档,backup会接收master的advert_int的值,然后计算出skew time和master down interval,
#认为master宕机触发的选举时间应该是(3 * Master_Adver_Interval) + Skew_time
nopreempt
#设置为不自动抢占虚拟IP地址
authentication {
auth_type PASS
auth_pass 1111
#同一 VRRP 实列 MASTER 与 BACKUP 使用相同的密码才能正常通信(主备相同)
}
virtual_ipaddress {
192.168.1.252/24 dev p4p1
#设置虚拟IP地址(VIP),又叫做漂移IP地址 可以有多个,每个一行(主备机必须相同,也是对外的虚拟IP)
}
}
[/shell]
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------
从keepalived:
[shell]
! Configuration File for keepalived
vrrp_instance VI_1 { #VRRP 配置标识 VI_1是实列名称,一个文件可配置多个
state BACKUP #指定Keepalived角色 MASTER表示此主机为主服务器 BACKUP 则是表示为备用服务器
#当 mater 出现异常后,backup 自动切换为 master。当backup称为master后,master恢复正常后会再次抢占称为master,导致不必要的主备切换
#实际应用中,可以将两台keepalived初始状态均配置为backup,设置不同的优先级,优先级高的设置nopreempt(非抢
占),导致不必要的额主备切换
nopreempt #设置为不自动抢占,以免不必要的切换
interface ens33 #节点固有IP(非VIP)的网卡,用来发VRRP包
virtual_router_id 51 #虚拟路由标识(0-255),同一个VRRP实列使用唯一的标识,DB中的规范是使用节点IP的最后一位。如:192.168.1.254>的254(主备相同)
priority 99 #节点优先级,数字越大表示节点的优先级越高。keepalived启动时会通过选举将优先级最高的节点选举为master。
如果某个节点初始state是master,但是优先级低,该节点会变成backup
advert_int 1 # 发送通告的时间间隔,
# 按照vrrp的官方文档,backup会接收master的advert_int的值,然后计算出skew time和master down interval,
认为master宕机触发的选举时间应该是(3 * Master_Adver_Interval) + Skew_time
lvs_sync_daemon_inteface ens33 #抗脑裂设置
mcast_src_ip 192.168.1.253 #设置发送VRRP包的IP地址
authentication {
auth_type PASS
auth_pass 1111 #同一 VRRP 实列 MASTER 与 BACKUP 使用相同的密码才能正常通信(主备相同)
}
virtual_ipaddress {
192.168.1.252/24 dev ens33 #设置虚拟IP地址(VIP),又叫做漂移IP地址 可以有多个,每个一行(主备机必须相同,也是对外的虚拟IP)
}
}
[/shell]
-------------------------------------------------------------------------------------------------------------------------------------------
设计优势:
- keepalived宕机或者关闭keepalived后负载均衡会自动切换至从keepalived,即使当主keepalived恢复后负载均衡也不会切回主keepalived减少了不必要的多次切换,损失性能和减少了切换导致的数据丢失风险。
2.采用选举的方式选举产生主keepalived,且主keepalived与实际提供服务的keepaliived为同一台服务器,防止了主keepalived转发错误导致的数据包丢失不完整以及脑裂等时断时续可能出现的问题。
3.由于没有主keepalived,所以当提供服务的主keepaived宕机后,剩余的从keepalived服务器会自动根据优先级选举出新的主keepalived并提供服务,所以主keepalived宕机后不会影响服务。
使用新设计的keepalived:
测试结果:
实际测试7天中未发现:
1.多次重复切换导致的稳定性不足的问题。
2.数据包不完整和脑裂问题。
3.主keepalived宕机也不影响服务的稳定性。