keepalived高可用
什么是高可用
- 一般是指2台机器启动着完全相同的业务系统,当有一台机器down机了,另外一台服务器就能快速的接管,对于访问的用户是无感知的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 比如公司的网络是通过网关进行上网的,那么如果该路由器故障了,网关无法转发报文了,此时所有人都无法上网了, 怎么办?
通常做法是给路由器增加一台备节点,但是问题是,如果我们的主网关master故障了,用户是需要手动指向backup的, 如果用户过多修改起来会非常麻烦。
问题一:假设用户将指向都修改为backup路由器,那么master路由器修好了怎么办? 问题二:假设Master网关故障,我们将backup网关配置为master网关的ip是否可以? 其实是不行的,因为PC第一次通过ARP广播寻找到Master网关的MAC地址与IP地址后,会将信息写到ARP的缓存表中, 那么PC之后连接都是通过那个缓存表的信息去连接,然后进行数据包的转发,即使我们修改了IP但是Mac地址是唯一的, pc的数据包依然会发送给master。(除非是PC的ARP缓存表过期,再次发起ARP广播的时候才能获取新的backup对应 的Mac地址与IP地址)
如何才能做到出现故障自动转移,我们往下看
|
高可用常用的工具
1 2
| 1.硬件通常使用 F5 2.软件通常使用 keepalived
|
keepalived是如何实现的?
VRRP协议
- VRRP协议会在一个局域网中进行广播
- keepalived软件是基于VRRP协议实现的,VRRP是虚拟路由冗余协议,主要用于解决单点故障问题
1 2 3
| 如何才能做到出现故障自动转移,此时VRRP就出现了,我们的VRRP其实是通过软件或者硬件的形式在Master和 Backup外面增加一个虚拟的MAC地址(VMAC)与虚拟IP地址(VIP),那么在这种情况下,PC请求VIP的时候, 无论是Master处理还是Backup处理,PC仅会在ARP缓存表中记录VMAC与VIP的信息。
|
高可用keepalived的核心概念
1 2 3
| 1、如何确定谁是主节点谁是备节点(选举投票,优先级) 2、如果Master故障,Backup自动接管,那么Master恢复后会夺权吗(抢占试、非抢占式) 3、如果两台服务器都认为自己是Master会出现什么问题(脑裂)
|
部署keepalived
1、环境准备
主机 |
IP |
身份 |
lb01 |
192.168.15.5 |
master |
lb02 |
192.168.15.6 |
backup |
|
192.168.15.3 |
VIP |
2、保证lb01和lb02配置完全一致
1 2
| [root@lb02 conf.d] [root@lb02 conf.d]
|
3、安装Keepalived
1 2
| [root@lb01 conf.d]# yum install keepalived -y [root@lb02 conf.d]# yum install keepalived -y
|
4、Keepalived配置
主
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| [root@lb01 ~] ! Configuration File for keepalived
global_defs { router_id lb01 }
vrrp_script check_nginx { script "/etc/keepalived/checkNG.sh" interval 5 }
vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.15.3 } track_script { check_nginx } }
[root@lb01 ~]
|
备
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| [root@lb02 ~] ! Configuration File for keepalived
global_defs { router_id lb02 }
vrrp_script check_nginx { script "/etc/keepalived/checkNG.sh" interval 5 }
vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 50 priority 80 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.15.3 } track_script { check_nginx } }
[root@lb02 ~]
|
高可用keepalived的脑裂
- 两台高可用服务器在指定时间内,无法互相检查到对方的心跳而各自启动故障转移功能。
1 2 3 4 5 6 7 8
| 1、如果Nginx宕机怎么办? 想办法告诉keepalived,Nginx的情况。
2、局域网之内,keepalived无法相互广播,怎么办? 判断VIP是否可以ping的通
$? : 上一条命令执行的结果。
|
1、Nginx故障切换脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| [root@lb01 ~]
ps -ef | grep -q [n]ginx
if [ $? -ne 0 ];then systemctl start nginx &>/dev/null sleep 2 ps -ef | grep -q [n]ginx if [ $? -ne 0 ];then systemctl stop keepalived fi fi
|
2、测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| [root@lb01 ~]
[root@lb01 ~]
[root@lb01 ~]
[root@lb01 ~] [root@lb01 ~]
[root@lb01 ~]
|
3、抢占式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| [root@lb01 ~] inet 192.168.15.3/32 scope global eth0
[root@lb01 ~]
[root@lb01 ~]
[root@lb02 ~] inet 192.168.15.3/32 scope global eth0
[root@lb01 ~]
[root@lb01 ~] inet 192.168.15.3/32 scope global eth0
|
keepalived的非抢占式
- 实现非抢占式,避免keepalived在切换IP的时候出现问题,我们一般配置的都是非抢占式的,因为宕机这种行为一次就够了
- 1、状态全部都设置成backup
- 2、增加 nopreempt
主
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| [root@lb01 ~] ! Configuration File for keepalived
global_defs { router_id lb01 }
vrrp_script check_nginx { script "/etc/keepalived/checkNG.sh" interval 5 }
vrrp_instance VI_1 { state BACKUP nopreempt interface eth0 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.15.3 } track_script { check_nginx } }
|
备
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| [root@lb02 ~] ! Configuration File for keepalived
global_defs { router_id lb02 }
vrrp_script check_nginx { script "/etc/keepalived/checkNG.sh" interval 5 }
vrrp_instance VI_1 { state BACKUP nopreempt interface eth0 virtual_router_id 50 priority 80 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.15.3 } track_script { check_nginx } }
|