0%

高可用keepalived

高可用keepalived

1
2
3
4
四层负载均衡
动静分离
rewrite rewrite 正则 替换的字符串 flag标记 跳转
https 单台https 多台 SLB

1.什么是高可用。
通常情况下,都是启动2台相同的业务系统,一台故障,另外一台自动接管。

2.高可用实现的工具。
服务高可用,keepalived软件实现 (硬件。)

3.keepalived如何实现高可用?
keepalived基于VRRP协议,虚拟路由冗余协议。

1.实践环境,配置实现虚IP转移

状态 IP 角色
节点1 10.0.0.5 Master
节点2 10.0.0.6 Backup
VIP 10.0.0.3

安装keepalived

1
yum install keepalived -y

配置Master的Keepalived

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
global_defs {     				#全局配置
router_id lb01 #表示身份->名称
}

vrrp_instance VI_1 {
state MASTER #标识角色状态
interface eth0 #网卡绑定接口
virtual_router_id 50 #虚拟路由id
priority 150 #优先级
advert_int 1 #监测间隔时间
authentication { #认证
auth_type PASS #明文认证
auth_pass 1111 #明文密码
}
virtual_ipaddress {
10.0.0.3 #虚拟的VIP地址
}
}

配置Backup的Keepalived

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
global_defs {
router_id lb02
}

vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}

对比keepalived的master与backup配置的区别

Keepalived配置区别 Master配置 Backup节配置
route_id(唯一标识) lb01 lb02
state(角色状态) Master Backup
priority(竞选优先级) 150 100

启动keepalived

1
2
[root@lb01 ~]# systemctl enable  keepalived
[root@lb01 ~]# systemctl start keepalived

5.配置非抢占式

​ 1、两个节点的state都必须配置为BACKUP
​ 2、两个节点都必须加上配置 nopreempt
​ 3、其中一个节点的优先级必须要高于另外一个节点的优先级。
两台服务器都角色状态启用nopreempt后,必须修改角色状态统一为BACKUP,唯一的区分就是优先级。

引用官方文档对nopreempt字段的说明:

1
2
3
"nopreempt" allows the lower priority machine to maintain the master role, even when a higher priority machine comes back online. 
NOTE: For this to work, the initial state of this entry must be BACKUP.
根据上述描述,第一点提到的state必须配置为BACKUP就明白了。
1
2
3
4
5
6
7
8
9
10
11
12
13
Master
vrrp_instance VI_1 {
state BACKUP
priority 150
nopreempt
}

Backup
vrrp_instance VI_1 {
state BACKUP
priority 100
nopreempt
}

通过windows的arp去验证,是否会切换MAC地址、
arp -a

keepalived虚拟地址漂移与Nginx服务进行关联
1.Nginx默认监听在所有的IP地址上。
2.用户将域名解析到VIP上面即可。

由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器又都还活着。

服务器网线松动等网络故障
服务器硬件故障发生损坏现象而崩溃
主备都开启firewalld防火墙

如果发生闹裂,则随机kill掉一台即可。

1.在备上编写检测脚本, 测试如果能ping通主并且备节点还有VIP的话则认为产生了列脑

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@lb02 ~]# cat check_split_brain.sh
#!/bin/sh
lb01_vip=10.0.0.3
lb01_ip=10.0.0.5
while true;do
ping -c 2 -W 3 $lb01_ip &>/dev/null
if [ $? -eq 0 -a `ip add|grep "$lb01_vip"|wc -l` -eq 1 ];then
echo "ha is split brain.warning."
else
echo "ha is ok"
fi
sleep 5
done

Nginx服务死掉等
1.会导致用户无法正常的访问到网站。
2.该服务器的VIp也不会进行漂移(因为keepalived与nginx是两个不同的软件)

解决手段:
1.写个监控脚本,如果nginx停止运行,则尝试启动,如果尝试失败,则停止keepalived

编写脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@lb01 ~]# mkdir /server/scripts
[root@lb01 ~]# vim /server/scripts/check_web.sh
#!/bin/sh
nginxpid=$(ps -C nginx --no-header|wc -l)

#1.判断Nginx是否存活,如果不存活则尝试启动Nginx
if [ $nginxpid -eq 0 ];then
systemctl start nginx
sleep 3
#2.等待3秒后再次获取一次Nginx状态
nginxpid=$(ps -C nginx --no-header|wc -l)
#3.再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本
if [ $nginxpid -eq 0 ];then
systemctl stop keepalived
fi
fi

#给脚本增加执行权限
[root@lb01 ~]# chmod +x /server/scripts/check_web.sh

在Master的keepalived中调用脚本,抢占式,仅需在master配置即可。(注意,如果配置为非抢占式,那么需要两台服务器都使用该脚本)

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
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_01
}

#1.每5秒执行一次脚本, 脚本执行内容不能超过5秒,否则会被中断再次重新运行脚本
vrrp_script check_web {
script "/server/scripts/check_web.sh"
interval 5
}

vrrp_instance VI_1 {
nopreempt
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}


#2.调用并运行该脚本
track_script {
check_web
}

}

公有云不支持keepalived、银行、金融、证券、国企