keepalived高可用
keepalived高可用
- 一、keepalived实现高可用
- 二、部署和配置keepalived
- 三、vip漂移
- 四、脑裂
- 五、双vip架构
- 总结
一、keepalived实现高可用
官方网站:https://www.keepalived.org/
keepalived是一个用c语言编写
的路由软件,这个项目的主要目标是为Linux系统和基于Linux的基础设施提供简单而健壮的负载均衡和高可用性
设施。负载均衡框架依赖于众所周知且广泛使用的Linux Virtual Server (IPVS)内核模块提供第4层负载均衡。keepalive实现了一组检查器,可以根据负载均衡服务器池的运行状况动态地、自适应地维护和管理它们。另一方面,通过VRRP协议实现高可用性。VRRP是路由器故障转移的基本组件。此外,keepalive实现了一组到VRRP有限状态机的钩子,提供低级和高速的协议交互。为了提供最快的网络故障检测,keepalive实现了BFD协议。VRRP状态转换可以利用BFD提示实现状态快速转换。keepalive框架可以单独使用,也可以一起使用,以提供弹性基础设施
keepalived是一款免费软件;您可以根据自由软件基金会发布的GNU通用公共许可证条款重新发布和/或修改它;许可证的版本2,或者(根据您的选择)任何更新的版本
keepalived有2个功能:
- 负载均衡
底层使用lvs来实现的,调用内核里已经安装的lvs模块来实现负载均衡
lvs的另外一个名字 ipvs --》四层负载均衡
Linux Virtual Server = lvs - 高可用HA(High Availability)
通过VRRP协议实现高可用性
作用: 有2台以上的机器做相同的事情,一台出现故障,另外一台可以顶替,从而实现业务不停止,持续的提供服务,避免单点故障,增加了冗余
缺点: 增加机器,增加成本 --》理念是花钱消灾
二、部署和配置keepalived
在LB1和LB2上安装部署keepalived软件
yum install keepalived -y
keepalived.conf配置文件的解析
[root@lb1 ~]# cd /etc/keepalived/
[root@lb1 keepalived]# ls
keepalived.conf
[root@lb1 keepalived]# vim keepalived.conf
# 负载均衡器LB1上的配置#vrrp_strict 注释掉,遵守最严格的vrrp协议# 实现高可用的配置
# 启动一个vrrp的实例 VI_1 实例名,可以自定义,一个实例背后就是一个keepalived相关的进程提供服务,我们给进程传递参数。
vrrp_instance VI_1 { state MASTER # 角色是masterinterface ens33 # 在哪个接口上监听vrrp协议,同时绑定vip到那个接口virtual_router_id 80 # 虚拟路由id(帮派) 0~255范围priority 120 # 优先级 0~255advert_int 1 # advert interval 宣告消息 时间间隔 1秒authentication { auth_type PASS # 认证的类型是密码认证auth_pass 123456 # 具体的密码,可以修改}# vip的配置,vip可以是多个ip,也可以是一个vipvirtual_ipaddress { 192.168.168.180}
}[root@lb2 keepalived]# vim keepalived.conf
# 负载均衡器LB2上的配置# vrrp_strictvrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 80priority 100advert_int 1authentication {auth_type PASSauth_pass 123456}virtual_ipaddress {192.168.168.180}
}
负载均衡器LB1上的配置
启动并且设置开机自启
systemctl start keepalived
systemctl enable keepalived
查看vip地址在LB1上
[root@lb1 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:25:d8:36 brd ff:ff:ff:ff:ff:ffaltname enp2s1inet 192.168.168.132/24 brd 192.168.168.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.168.180/32 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe25:d836/64 scope link noprefixroute valid_lft forever preferred_lft forever
vip绑定到LB1的ens33网卡,就使用这块网卡的mac地址
然后可以正常访问192.168.168.180
三、vip漂移
停止LB1上的keepalived服务,不会继续发vrrp报文,然后vip重新选举到LB2上
[root@lb1 keepalived]# service keepalived stop
Redirecting to /bin/systemctl stop keepalived.service
[root@lb2 keepalived]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:25:d8:36 brd ff:ff:ff:ff:ff:ffaltname enp2s1inet 192.168.168.132/24 brd 192.168.168.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.168.180/32 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe25:d836/64 scope link noprefixroute valid_lft forever preferred_lft forever
如果不做限制,LB1的keepalived服务恢复,vip又会重新漂移到LB1上,因为LB1的优先级要高些
四、脑裂
脑裂: 就是2台或者多台LB上都有vip地址
脑裂现象 -> 原因:
- vrid(虚拟路由id)不一样
- 网络通信有问题:中间有防火墙阻止了网络之间的选举的过程,vrrp报文的通信
224.0.0.18 是 VRRP 协议专用的组播地址,主路由器通过该地址向同一 VRRP 组的备路由器发送通告报文
[root@lb2 keepalived]# iptables -A INPUT -p vrrp -d 224.0.0.18 -j DROP
[root@lb2 keepalived]# iptables -L -n -v
Chain INPUT (policy ACCEPT 6 packets, 364 bytes)pkts bytes target prot opt in out source destination 1 40 DROP 112 -- * * 0.0.0.0/0 224.0.0.18 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 4 packets, 520 bytes)pkts bytes target prot opt in out source destination [root@lb2 keepalived]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:25:d8:36 brd ff:ff:ff:ff:ff:ffaltname enp2s1inet 192.168.168.132/24 brd 192.168.168.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.168.180/32 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe25:d836/64 scope link noprefixroute valid_lft forever preferred_lft forever# 清除防火墙规则
[root@lb2 keepalived]#iptables -F
脑裂有没有危害?是否对业务有危害或者对业务有什么影响?
- 没有危害,能正常访问,反而还有负载均衡的作用
- 脑裂恢复的时候,还是有影响的,会短暂的中断,影响业务
五、双vip架构
keepalived的架构:
- 单vip 架构: 只有master上有vip,backup上没有vip,这个时候master会比较忙,backup机器会比较闲,设备使用率比较低
- 双vip 架构: 启动2个vrrp实例,每台机器上都启用2个vrrp实例,一个做master,一个做backup,启用2个vip,每台机器上都会有一个vip,这2个vip都对外提供服务,这样就可以避免单vip的情况下,一个很忙一个很闲。 可以提升设备的使用率
总结
双vip架构步骤:
1.在每个机器上启用2个vrrp实例
[root@lb1 keepalived]# vim keepalived.conf
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 60priority 100advert_int 1authentication {auth_type PASSauth_pass 123456}virtual_ipaddress {192.168.168.180}
}vrrp_instance VI_2 {state BACKUPinterface ens33virtual_router_id 70priority 120advert_int 1authentication {auth_type PASSauth_pass 123456}virtual_ipaddress {192.168.168.190}
}
第2台机器上的配置
[root@lb2 keepalived]# vim keepalived.conf
vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 60priority 120advert_int 1authentication {auth_type PASSauth_pass 123456}virtual_ipaddress {192.168.168.180}
}vrrp_instance VI_2 {state MASTERinterface ens33virtual_router_id 70priority 100advert_int 1authentication {auth_type PASSauth_pass 123456}virtual_ipaddress {192.168.168.190}
}
验证一下vip漂移,停止下keepalived服务查看
[root@lb2 keepalived]# service keepalived stop
Redirecting to /bin/systemctl stop keepalived.service
[root@LB-1 keepalived]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:25:d8:36 brd ff:ff:ff:ff:ff:ffaltname enp2s1inet 192.168.168.132/24 brd 192.168.168.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.168.180/32 scope global ens33valid_lft forever preferred_lft foreverinet 192.168.168.190/32 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe76:a68/64 scope link noprefixroute valid_lft forever preferred_lft forever