高可用—keepalived
什么是高可用?
简单的来讲,高可用就是通过设计减少系统不能提供服务的时间。
Keepalived软件主要是通过VRRP协议实现高可用功能的。(提供故障切换和健康检查)
Keepalived 是一种基于 VRRP 协议的热备方式,能很好的完成服务器之间的故障切换,解决了单点故障的问题,每台热备组可以有多台服务器,最常用的还是双机热备(根据虚拟 IP 的漂移来实现),可适用于各种应用服务.
VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。
高可用部署服务过程
准备环境:
Web01:yum install –y nginx 10.0.0.7
Web02:yum install –y nginx 10.0.0.8
Web03: yum install –y nginx 10.0.0.9
Lb01:yum install –y nginx ,yum install –y keepalived 10.0.0.5
Lb02: yum install –y nginx ,yum install –y keepalived 10.0.0.6
第一个里程:确认后端节点是否可以正常访问
web01 web02 web03
curl -H host:www.goodboy.com 10.0.0.7
curl -H host:www. goodboy.com 10.0.0.8
curl -H host:www. goodboy.com 10.0.0.9
第二个里程:确认负载均衡服务配置
curl -H hosts:www. goodboy.com 10.0.0.5
curl -H hosts:www. goodboy.com 10.0.0.6
第三个里程:需要负载均衡服务器部署安装keepalived
yum install -y keepalived
PS:确认系统epel源是否更新成功
第四个里程:编写高可用配置文件
Lb01配置
global_defs { --- 全局配置信息
router_id lb01 --- 标记主机身份信息 lb01
}
vrrp_instance test { --- vrrp冗余功能配置
state MASTER --- 规划确认主机角色身份
interface eth0 --- 虚拟IP地址在哪个网卡上生成
virtual_router_id 51 --- 定义路由组播标号
priority 100 --- 定义网站服务优先级
advert_int 1 --- 组播发送间隔时间
authentication { --- 开启网站认证功能
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { --- 定义虚拟IP地址
10.0.0.3
}
}
Lb02上配置
global_defs { --- 全局配置信息
router_id lb02 --- 标记主机身份信息 lb02
}
vrrp_instance test { --- vrrp冗余功能配置
state BACKUP --- 规划确认主机角色身份
interface eth0 --- 虚拟IP地址在哪个网卡上生成
virtual_router_id 51 --- 定义路由组播标号
priority 50 --- 定义网站服务优先级
advert_int 1 --- 组播发送间隔时间
authentication { --- 开启网站认证功能
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { --- 定义虚拟IP地址
10.0.0.3
}
}
PS:确认vip地址是否和域名建立解析
www.goodboy.com ~ 10.0.0.3
强调:主和备keepalived配置主要有3个地方不一致
① router_id xxx
② state BACKUP/MASTER
③ priority xxx
什么是脑裂?
在HA集群系统中,节点a和节点b是通过心跳线来感知对方的存活状态,当节点a出现异常时,节点b就会接管a的资源,以此类推,当节点b出现异常时,节点a就会接管b的资源。但是,当网络出现故障时,导致2个节点都出现了故障,那么双方就会认为对方都出现了异常开始互相接管对方的资源,那么脑裂的问题就出现了。
如何解决脑裂?
参考网址:https://www.cnblogs.com/fatzi/p/13358993.html
解决方案:
利用监控软件进行监控管理 zabbix
利用编写监控脚本文件 shell -- 实现监控监本编写/实现自动化管理服务/实现服务菜单管理
编写脚本:
当监控备服务器上出现vip地址报警
#!/bin/bash
ip a s eth0|grep "10.0.0.3" &>/dev/null
if [ $? -eq 0 ]
then
echo "出现脑裂问题,请及时排查";
fi
监控服务状态信息
nginx负载均衡服务活着,keepalived服务存活就有意义
nginx负载均衡服务死去,keepalived服务就没有存在意义
如何释放主服务器上流量资源:
1) 当nginx服务出现问题,直接关闭keepalived服务
#!/bin/bash
Netstat –lntup |grep 80 &> /dev/null
if [ $? -ne 0 ]
then
systemctl stop keepalived
fi
第二个里程:可以将脚本信息加载到高可用配置文件中
global_defs {
router_id lb01
}
vrrp_script check_web {
script "/server/scripts/web_check.sh"
interval 1
weight 10
}
vrrp_instance test {
state MASTER
interface eth0
virtual_router_id 51
priority 60
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
track_script {
check_web
}
}
第三个里程:设置脚本权限并重启keepalived服务进行测试
chmod +x /server/scripts/web_check.sh
systemctl restart keepalived
2)当nginx服务出现问题,将keepalived资源进行转移 利用weight参数功能
nginx 自动恢复机制 + keepalived自动恢复机制
lb01 主服务器
nginx服务活着时候,keepalived优先级高于备服务器
nginx服务宕掉时候,keepalived优先级降低
weight 值为正数:
条件:
监控脚本执行成功=返回值为0 优先级+weight
监控脚本执行失败=返回值非0 默认优先级
weight 值为负数:
条件:
监控脚本执行成功=返回值为0 默认优先级
监控脚本执行失败=返回值非0 优先级+weight
主服务器上:
当nginx服务停止时,脚本执行失败 weight设置为负数 优先级+weight < 备服务优先级
当nginx服务恢复时,脚本执行成功 weight设置为负数 默认优先级 > 备服务优先级
#!/bin/bash
netstat -lntup|grep 80 &>/dev/null
if [ $? -ne 0 ]
then
exit 1
else
exit 0
fi
global_defs {
router_id lb01
}
vrrp_script check_web {
script "/server/scripts/web_check.sh"
interval 1
weight -20
}
vrrp_instance test {
state MASTER
interface eth0
virtual_router_id 51
priority 60
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
track_script {
check_web
}
}
负载均衡双主配置过程
出现双主配置,主要是缓解主服务压力(负载均衡服务器lb01)
双主==实现互为主备
实现过程:
规划:
www.goodboy.com --- lb01 10.0.0.5(vip10.0.0.3) --- web01/02/03
bbs.goodboy.com --- lb02 10.0.0.6(vip10.0.0.4) --- web01/02/03
第一个里程:配置集群节点信息并测试
lb01 -- web01-03 www网站/bbs网站
[root@lb01 scripts]# curl -H host:www. goodboy.com 10.0.0.7
www 10.0.0.7
[root@lb01 scripts]# curl -H host: www. goodboy.com 10.0.0.8
www 10.0.0.8
[root@lb01 scripts]# curl -H host: www. goodboy.com 10.0.0.9
www 10.0.0.9
[root@lb01 scripts]# curl -H host:bbs.goodboy.com 10.0.0.7
bbs 10.0.0.7
[root@lb01 scripts]# curl -H host: bbs.goodboy.com 10.0.0.8
bbs 10.0.0.8
[root@lb01 scripts]# curl -H host: bbs.goodboy.com 10.0.0.9
bbs 10.0.0.9
lb02 -- web01-03 bbs网站/www网站
[root@lb02 scripts]# curl -H host: www. goodboy.com 10.0.0.7
www 10.0.0.7
[root@lb02 scripts]# curl -H host: www. goodboy.com 10.0.0.8
www 10.0.0.8
[root@lb02 scripts]# curl -H host: www. goodboy.com 10.0.0.9
www 10.0.0.9
[root@lb02 scripts]# curl -H host: bbs.goodboy.com 10.0.0.7
bbs 10.0.0.7
[root@lb02 scripts]# curl -H host: bbs.goodboy.com 10.0.0.8
bbs 10.0.0.8
[root@lb02 scripts]# curl -H host: bbs.goodboy.com 10.0.0.9
bbs 10.0.0.9
第二个里程:确认负载均衡服务负载情况
[root@web01 ~]# curl -H host: www. goodboy.com 10.0.0.5
www 10.0.0.7
[root@web01 ~]# curl -H host: www. goodboy.com 10.0.0.5
www 10.0.0.8
[root@web01 ~]# curl -H host: www. goodboy.com 10.0.0.5
www 10.0.0.9
[root@web01 ~]# curl -H host: bbs.goodboy.com 10.0.0.5
bbs 10.0.0.7
[root@web01 ~]# curl -H host: bbs.goodboy.com 10.0.0.5
bbs 10.0.0.8
[root@web01 ~]# curl -H host: bbs.goodboy.com 10.0.0.5
bbs 10.0.0.9
[root@web01 ~]# curl -H host: bbs.goodboy.com 10.0.0.6
bbs 10.0.0.7
[root@web01 ~]# curl -H host: bbs.goodboy.com 10.0.0.6
bbs 10.0.0.8
[root@web01 ~]# curl -H host: bbs.goodboy.com 10.0.0.6
bbs 10.0.0.9
[root@web01 ~]# curl -H host: www. goodboy.com 10.0.0.6
www 10.0.0.7
[root@web01 ~]# curl -H host: www. goodboy.com 10.0.0.6
www 10.0.0.8
[root@web01 ~]# curl -H host: www. goodboy.com 10.0.0.6
www 10.0.0.9
第三个里程:编写keepalived配置文件
lb01 www主 bbs备
global_defs {
router_id lb01
}
vrrp_instance www {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
vrrp_instance bbs {
state BACKUP
interface eth0
virtual_router_id 52
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.4
}
}
lb02 www备 bbs主
global_defs {
router_id lb02
}
vrrp_instance www {
state BACKUP
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
vrrp_instance bbs {
state MASTER
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.4
}
}第四个里程:配置dns解析与测试