keepalived介绍
keepalived为LVS应运而生的高可用服务。LVS的调度器无法做高可用,于是keepalived这个软件。实现的是调度器的高可用。
但是keepalived不是专门为LVS集群服务的,也可以做其他代理服务器的高可用。
LVS高可用集群的组成
主调度器+备调度器(一般是一主二备)
主调度器能够正常运行时,由主调度器进行后端真实服务器的分配处理。其余的备用调度器都处于冗余状态。备用调度器是不参与集群的运转,只有主调度器出现了故障,无法运行,此时备调度器才会承担主调度器的工作
一旦主调度器恢复工作,继续由主调度器进行处理,备调度器又成为冗余(基于VRRP)
- 主服务器作用:转发数据;发送报文告诉备服务器自己在线。
- 备服务器作用:监听主服务器发来的数据;收不到消息的时候就接替主服务器。
VRRP:keepalived是基于VRRP协议,实现LVS的高可用。解决了调度器和单节点的故障问题。
VRRP协议:提高网络路由器的可靠性开发的一种协议。
选举出主和备,预先设定好了主和备的优先级,备的优先级低。一旦开启服务,优先级高的会自动抢占主的位置
vrrp的组播通信:224.0.0.18 vrrp协议当中的主备服务器通过这个组播地址进行通信,交换主备服务器之间的运行状态。主服务器会周期性的发送VRRP报文消息,以告知其他服务器,主服务器现在的状态。
主备切换:主服务器发生故障或者不可达,VRRP协议会把请求转义到备服务器。通过组播地址,VRRP可以迅速的通知其他服务器发送了主备切换,确保新的主服务器可以正常的处理客户端的请求。
故障恢复:一旦主服务器恢复通信,由组播地址进行通信,发现在恢复的主服务器优先级更高,会抢占原主服务器的位置,成为主服务器,调度和接受请求。
高可用集群的脑裂现象以及预防措施
高可用集群的脑裂现象及其诱发原因
脑裂现象: 主和备同时拥有vrrp地址。在高可用系统当中,联系两个节点的心跳线,本来是一体的。动作协调的高可用系统。心跳线断开之后,分裂了两个独立的个体。主备之间失去了联系,都以为是对方出现了故障。两个调度器就像脑裂人一样抢占VIP。导致主有VIP,备也有VIP,因此整个集群失败。
解决方法
软件层面:
1.配置文件有问题
2.通过tcpdump抓包分析
3.重启两边服务
网络层面:
1.高可用服务器之间心跳线检测失败。主备之间无法进行通信。
2.硬件层面:
2.1连接主备之间的心跳线老化
2.2网卡或者网卡驱动失效,IP地址配置冲突
2.3 防火墙没有配置心跳线消息的传输通道
2.4后端服务器的配置问题,心跳方式不同,心跳广播冲突,软件BUG
脑裂预防预防措施
针对脑裂现象的产生,运维人员第一时间要做的不是处理发生故障的调度器或则故障线路,而是首先确保业务不会因此中断,进行脑裂的预防尤为重要。出现问题,先保证业务的进行,再进行排障。
keepalived的体系和模块
全局模块:core模块,负责整个keepalived的启动加载和维护
VRRP模块,实现VRRP协议,主备切换
check:负责健康检查,检查后端真实服务器的健康情况,配置在真实服务器的模块当中。
LVS+keepalived的实时和部署
test1 主调度器 20.0.0.10
test2 备调度器 20.0.0.20
后端真实服务器1 : 20.0.0.50
后端真实服务器2 : 20.0.0.90
vip地址:20.0.0.100
客户端:20.0.0.60
test1
//关闭防火墙
systemctl stop firewalld
setenforce 0
yum -y install ipvsadm keepalived
//安装所需工具
cd /etc/keepalived.conf
cp keepalives.conf keepalives.conf.bak
//对重要文件进行备份
vim keepalived.conf
smtp_server 127.0.0.1 //line 10
route_id LVs_01 // line 12
//主备服务器名称id不能一致
#vrrp_strict //line 15
//取消严格遵守vrrp协议功能,注释该行
state MASTER //LINE 22
//表示身份,主备 备:BACKUP
interface ens33 //line 24
//指定vip的物理接口
virtual_router_id 10 //26
//虚拟路由的id号
priority 100
//优先级
advert-int 1
//发送报文的间隔时间(工作中一般为30)
authenication {
auth_type PASS
auth_pass 1111
}
virtuak_ipaddress {
192.168.233.100
//指定集群的真实地址
}
virtual-server 20.0.0.100 80 {
delay_loop 6
//健康检查的间隔时间
lb_algo rr
//负载均衡的调度算法
lb_kind DR //46
//指定整个LVS的工作方式,要大写
persistence_timeout 0 //48
//连接保持时间
protocol TCP
//
}
real_server 20.0.0.30 80 { //52
weight 1
//后端真实服务器的轮询权重
TCP_CHECK {
//对真实服务器的检查
connect_port 80
//检测目标的端口号(此处检测是30)
connect_timeout 3
//检测连接超时时间
nb_get_retry 3
//重试次数
delay_before_retry 4
//重试的间隔秒数
}
}
real_server 20.0.0.40 80 { //52
weight 1
//后端真实服务器的轮询权重
TCP_CHECK {
//对真实服务器的检查
connect_port 80
//检测目标的端口号(此处检测是30)
connect_timeout 3
//检测连接超时时间
nb_get_retry 3
//重试次数
delay_before_retry 4
//重试的间隔秒数
}
}
}
wq!
systemctl restart keepalived.service
ipvsadm -ln
//重启服务并查看
test2
//关闭防火墙
systemctl stop firewalld
setenforce 0
yum -y install ipvsadm keepalived
cd /etc/keepalived.conf
cp keepalives.conf keepalives.conf.bak
scp root@192.168.233.10:/etc/keepalived/keepalived.conf /etc/keepalived
//远程复制到test2本机
//此处得修改route_id号等
安装nginx
systemctl restrat nginx
cd /usr/local/nginx/html
vim index.html
//制作访问页面
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
ifup ifcfg-lo:0
route add -host 20.0.0.100 dev lo:0
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore=1
//设置lo接口忽略任何接口的ARP请求
net.ipv4.conf.lo.arp_announce=2
//设置lo接口仅会相应本地的IP地址,其他的接口ARP请求全部忽略
net.ipv4.conf.all.arp_ignore=1
//所有接口忽略来自任务接口的ARP请求
net.ipv4.conf.all.arp_announce=2
//所有接口仅会响应本地的IP地址的ARP请求,其他的接口的ARP请求全部忽略
sysctl -p
//刷新
创建页面内容
修改内核
添加虚拟网卡
test3 test4 操作相同
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=20.0.0.100
NETMASK=255.255.255.255
wq
ifup ifcfg-lo:0
route add -host 20.0.0.100 dev lo:0
测试
本机访问
curl 本机ip
'
客户端访问
curl 20.0.0.100
下面关闭其中一个keepalived
关闭主站
观察备站
curl 20.0.0.100依然可以负载均衡访问成功
测试轮询
查看端口加权成功
结果
keepalived+nginx实验
nginx1 20.0.0.10 主
nginx2 20.0.0.20 备
实验开始前先备份以防报错而无法修改
主站
systemctl restart nginx
yum -y install keepalived
cd /etc/keeplived
cp keepalived.conf keepalived.conf.bak
smtp_server 127.0.0.1
#vrrp_strict
virtual_route_id 51
vrrp_script check_nginx {
script "/opt/check_nginx.sh"
interval 5
}
//添加脚本
vrrp_intance VI_1 {
}
virtual_ipaddress {
192.168.233.100
}
track_script {
check_nginx
}
scp root@192.168.233.61:/etc/keepalived/keepalived.conf /etc/keepalives/
nginx2
/opt
vim check_nginx.sh
/usr/bin/curl -I http://localhost &> /dev/null
if [ $? -ne 0 ]
then
systemctl stop keepalived
fi
wq
chmod 777 check_nginx.sh
nginx1
拖入脚本
chmod 777 check_nginx.sh
systemctl restart keepalived.service
ip addr
nginx2
设置访问页面
总结
keepalived的工作方式基于VRRP协议
1.确定主备
2.vrrp只能有一个,出现在主服务器上。
3.通过vrrp 组播地址 224.0.0.18 发送vrrp报文,检测主的心跳
4.主备切换,主出现故障,vip地址会漂移到备服务器。
5.主恢复了,vrrp地址还会回到主
6.脑裂 主备都有VIP
(硬件层面,软件层面)
脑裂解决(软件层面):
1.检查配置文件,重启
7.keepalive不是只能和lvs搭配,也可以和其他服务配合,实现高可用
如何解决keepalived脑裂问题
1.硬件:准备两条心跳线,这样短一条依然能够传送心跳消息
2.设置防火墙一定要让心跳消息通过。
3.依靠监控软件实时检测来实现(zabbix)
脑裂如何解决
软件层面:
1.配置文件有问题
2.通过tcpdump抓包分析
3.重启两边服务
网络层面:
1.高可用服务器之间心跳线检测失败。主备之间无法进行通信。
2.硬件层面:
2.1连接主备之间的心跳线老化
2.2网卡或者网卡驱动失效,IP地址配置冲突
2.3 防火墙没有配置心跳线消息的传输通道
2.4后端服务器的配置问题,心跳方式不同,心跳广播冲突,软件BUG
了解即可
dev 开发环境 开发人员专用
sit 测试环境 测试人员使用(开发,运维)
pre:预生产环境 开发和运维(和最终生产环境保持一致)
prd:生产环境(面向用户的环境)