集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
负载高可用概述
什么是高可用
负载均衡器作为用户体验结构中最重要的一环,负责用户请求的分发。因此一旦宕机导致的后果很严重,因此需要最高程度上保证负载均衡器的可用性。一般采用双机或者多机热备,这些机器上配置的服务完全相同,可以保证随时接管负载主机的业务。
什么场景使用
需要最大限度保证服务不宕机的场景,如:金融、支付、服务类网站。这类场景下都适用负载均衡的高可用配置。
配置高可用
本文演示环境为两台机器作为主从配置,更多数量操作步骤雷同。
环境准备
服务器 | 角色 | IP | 主机名 |
---|---|---|---|
Node 1 | MASTER | 192.168.1.5 | lb01 |
Node 2 | SLAVE | 192.168.1.6 | lb02 |
本文使用发行版为 CentOS 7
,其他系统请替换相关命令语句。
安装 Keepalived 环境
在每台机器上都进行操作
# yum install keepalived -y
配置 Keepalived 环境
配置主负载(MASTER)
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.3/24 dev eth0
}
}
小贴士: virtual_ipaddress
为虚拟 IP,是生成负载主从关系后的IP,请选择一个贴近负载并且没有被占用的地址。
配置从负载(SLAVE)
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
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 {
192.168.1.3/24 dev eth0
}
}
小贴士:state
配置了主从关系interface
配置了挂载网卡`
`
配置参数说明:
键值 | 说明 | 注意事项 |
---|---|---|
state | 主从角色 | 只能存在一主 |
interface | 挂载网卡 | 仅可使用外网网卡 |
virtual_router_id | 虚拟标识符 | 保持一致 |
priority | 优先级 | 主大于从 |
启动 Keepalived 服务
在每台机器上进行操作
# systemctl enable keepalived
# systemctl start keepalived
检查服务运行状态
测试 Keepalive 工作是否正常
检查主地址
[root@lb01 ~]# ip addr | grep 192.168.1.3
inet 192.168.1.3/24 scope global secondary eth0
提示:正常应该会有输出信息。
检查从地址
[root@lb02 ~]# ip addr | grep 192.168.1.3
提示:正常不会有输出信息。
可以看到目前主机生效,正在工作。
模拟故障
停止主机上的 keepalived
, 检查虚拟地址是否存在。
[root@lb01 ~]# systemctl stop keepalived
[root@lb01 ~]# ip addr | grep 192.168.1.3
可以看到虚拟地址已经消失,接下来检查从机。
[root@lb02 ~]# ip addr | grep 192.168.1.3
inet 192.168.1.3/24 scope global secondary eth0
高可用脑裂
“脑裂”概念
在涉及到高可用性时,经常会听到“脑裂”,到底什么是“脑裂”?
简而言之:当两(多)个节点同时认为自已是唯一处于活动状态的服务器从而出现争用资源的情况,这种争用资源的场景即是所谓的“脑裂”(split-brain
)或“区间集群”(partitioned cluster
)。
如何解决“脑裂”
可以在从机(SLAVE)上设置检测脚本,实时监测主从状态,出现脑裂立即解决。
[root@lb02 ~]# cat > check_split_brain.sh <<'EOF'
#!/bin/sh
virtual_ip=192.168.1.3
master_ip=192.168.1.5
while true;do
ping -c 2 -W 3 $master_ip &>/dev/null
if [ $? -eq 0 -a `ip a | grep "$virtual_ip" | wc -l` -eq 1 ];then
echo "Split brain"
else
echo "Nothing Happen"
fi
sleep 5
done
EOF
如果 HTTP
服务宕机, 会导致用户请求失败, 但 Keepalived
并不会进行切换, 所以需要编写一个脚本检测服务存活状态, 如果不存活则杀掉服务以进行地址漂移。
# cat > check_web.sh <<'EOF'
#!/bin/sh
while true
do
NGINX_PID=$(ps -C nginx --no-header | wc -l)
if [ $NGINX_PID -eq 0 ];then
systemctl start nginx
sleep 5
NGINX_PID=$(ps -C nginx --no-header | wc -l)
if [ $NGINX_PID -eq 0 ];then
systemctl stop keepalived
exit 1
fi
fi
sleep 5
done
脚本授权
# chmod a+x *.sh
在 keepalived 配置文件中调用此脚本,主从都需要进行操作。
# cat /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_01
}
vrrp_script check_web {
script "/server/scripts/check_web.sh"
interval 2
weight 50
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.3/24 dev eth0
}
track_script {
check_web
}
}
附录
参考链接
本文由 柒 创作,采用 知识共享署名4.0
国际许可协议进行许可。
转载本站文章前请注明出处,文章作者保留所有权限。
最后编辑时间: 2018-08-12 10:20 AM