keppalived为lvs应运而生的高可用服务。lvs的调度器无法做高可用,于是keepalived这个软件。实现的是调度器的高可用。
但是:keepalived不是专门为lvs集群服务的。也可以做其他代理服务器的高可用。
lvs的高可用集群是建立在主调度器和备调度器(可以有多个)一般是一主两备或一主一备。
主调度器能正常运行时,由主调度器进行后端真实服务器的分配处理。其余的备用调度器处在冗余状态。不参与集群的运转,主调度器出现了故障无法运行,备调度器才会承担主调度器的工作。
一旦主调度器恢复工作,继续由主调度器进行处理,备调度器又成了冗余。
VRRP:keepalived是基于vrrp协议实现lvs服务的高可用。解决了调度器单节点的故障问题。
VRRP协议:提高网络路由器的可靠性开发的一种协议。
选举出主和备,预先设定好了主和备的优先级。主的优先级较高。备的优先级低,一旦开启服务,优先级高的会自动抢占主的位置。
VRRP组播通信地址:224.0.0.18 VRRP协议当中的主备服务器通过组播地址进行通信。交换主备服务器之间的运行状态。主服务器会周期性的发送VRRP报文消息,以告知其他备服务器,主服务器现在的状态。
主备切换:主服务器发生故障或者不可达,VRRP协议会把请求转移到备服务器。通过组播地址,VRRP可以迅速的通知其他服务器发生了主备切换,确保新的服务器可以正常的处理客户端请求。
故障恢复:一旦主服务器恢复通信,由组播地址进行通信,发现恢复的主服务器的优先级更高,会抢占原主服务器的位置,成为主服务器,调度和接受请求。
主调度器 20.0.0.20
备调度器 20.0.0.30
真实服务器1 20.0.0.25
真实服务器2 20.0.0.26
vip地址 20.0.0.100
客户端 随机
关闭五台机器的防火墙和安全机制
在主备服务器上安装架构
yum -y insstall ipvsadm keepalived
在后端真实服务器25 26 都安装nginx
回到调度器主机20
给文件做备份
vim keepalived.conf
全局模块:
core模块,负责整个keepalived启动加载和维护。
VRRP模块:实现VRRP协议,包括主备切换。
check模块:负责健康检查,检查后端真实服务器的健康检查。配置真实服务器的模块当中。
回到实验
在全局模块中配置邮箱地址 127.0.0.1
router_id LVS_01
#主和备的id不能一致
注释vrrp_strict
#取消严格遵守VRRP协议功能。不取消vip无法连接
进入vrrp模块
state MASTER
#标识身份,主:MASTER 备:BACKUP
interface ens33
#指定vip地址的物理接口
virtual_router_id 51
#虚拟路由器的id号。主备必须保持一致
priority 100
#优先级
advert_int 1
#发送报文的间隔时间。工作环境中不用频繁的发送。工作中设置10秒左右或者30秒左右即可
auth_type PASS
auth_pass 1111
#可以不动如果需要改动。必须主备一致。默认即可
virtual_ipaddress {
20.0.0.100
}
#指定集群的vip地址
virtual_server 20.0.0.100 80 {
delay_loop 6
#健康检查的间隔时间。检查的是后端真实服务器
lb_algo rr
#负载均衡的调度算法
lb_kind DR
#指定LVS集群的工作方式。工作方式要大写
persistence_timeout 0
#连接保持时间50秒,方便实验所以改成0
protocol TCP
#协议端口
}
real_server 20.0.0.25 80 {
weight 1
#后端真实服务器的轮询权重
添加配置
TCP_CHECK {
#心跳线。检查后端真实服务器的心跳线
connect_port 80
#检测目标的端口号
connect_timeout 3
#检测连接超时时间。3秒
nb_get_retry 3
#重试的次数。3次
delay_before_retry 4
#重试的间隔秒数。4秒
}
}
real_server 20.0.0.26 80 {
weight 1
#后端真实服务器的轮询权重
添加配置
TCP_CHECK {
#心跳线。检查后端真实服务器的心跳线
connect_port 80
#检测目标的端口号
connect_timeout 3
#检测连接超时时间。3秒
nb_get_retry 3
#重试的次数。3次
delay_before_retry 4
#重试的间隔秒数。4秒
}
}
}
保存退出后重启服务
restart keepalived
ipvsadm -ln #查看是否成功
ipaddr不需要手动配置会自动生成
关闭调度功能
主调度器20配置完毕
到备调度器30
远程复制
更改备的id名称
更改优先级和名称
进入后端真实服务器25
cd html
vim index.html
this is test 1
配置虚拟网卡
vim ifcfg-lo:0
ifup ifcfg-lo:0
ifconfig 查看一下
curl 20.0.0.25 测试一下
进入后端26
vim ifcfg
到客户端主机 curl 20.0.0.100 测试一下
集群工作正常。开始测试keepalived
回到主调度器20
关闭主调度器20的keepalived
ip addr 查看vip地址是否还在
再到副调度器30查看是否有vip地址
再到客户端测试是否能访问
回到主调度器20
恢复keepalived
看看主调度器的vip能否回来
再回到30调度器查看vip在不在
回到客户端测试能否访问
实验结束
实验结果测试关闭主站vip转移
验证节点服务器失效和恢复
关闭和开启nginx服务测试
如果节点失效还可以加入集群
主站图:
副站图:
测试结果:
重启主站图:
副站图:
结果图:
测试轮询
轮询结果
主nginx1 20.0.0.20
备nginx2 20.0.0.30
vip地址 20.0.0.100
客户端 20.0.0.40
准备三台nginx
关闭三台机器的防火墙和安全机制
启动20和30的nginx服务不需要安装ipvs只安装keepalived
改配置文件之前先备份
先配置主20
vim keepalived
在全局配置和vrrp配置中间插入周期性执行的脚本
vrrp_script check_nginx {
script "/opt/check_nginx.sh"
interval 5
#表示每5秒检测一下nginx状态
}
在vrrp下方添加命令
track_script {
check_nginx
}
到30远程复制到备30
cd /opt
vim check_nginx.sh
/usr/bin/curl -I http://localhost &> /dev/null
if [ $? -ne 0 ]
then
systemctl stop keepalived
fi
chmod 777 check_nginx.sh
sz check_nginx.sh
从桌面拖到20主里面
chmod 777 check_nginx.sh
重启keepalived服务
在主20和30上做页面配置
html/index.html
到客户机测试
curl 20.0.0.100
是否能查看到
关闭主20的nginx的服务
ipaddr 查看是否能查看到vip
再到备30的nginx服务
ipaddr 查看
再到客户机测试
测试成功
再回到主20
先重启nginx再重启keep
ipaddr查看vip
再到备30查看用ipaddr查看vip
最后回到客户端测试能否联通
实验完成
keepalived的工作方式是基于VRRP协议:
1、 确定主备
2、 VIP地址只能有一个,会出现在主服务器上
3、 通过VRRP组播地址:224.0.0.18 发送VRRP报文,检测主的心跳。
4、 主备切换,主出现故障,vip地址会漂移到备服务器。
5、 主服务器恢复,vip地址要回到主
6、 脑裂:主备都有vip。软件层面:检查配置文件,重启。
7、 keepalived不是只能和lvs集群搭配,也可以和其他服务配合,实现高可用。
1、 什么叫脑裂?
脑裂:主和备同时拥有vip地址
在高可用系统当中,联系两个节点的心跳线,本来是一体的动作协调的高可用系统。
如果心跳线断开后,分裂成了两个独立的个体。主备之间失去了联系,都以为是对方出现了故障。
两个调度器,就像脑裂人一样开始抢占主的位置,抢占vip。主也有vip,备也有vip。导致整个集群失败。
2、 脑裂应该怎么解决?
软件层面: 1、查看配置文件是否有问题。 2、 tcpdump抓包分析。 只要配置文件没问题,两边通信正常。只需要重启keepalived服务即可,要先重启主,再重启备。再模拟一下故障恢复即可。
网络层面: 高可用服务器之间心跳线检测失败。主备之间无法进行通信。
硬件层面: 1、 连接主备之间的心跳线老化 2、 网卡或者网卡的驱动失效,ip地址配置冲突。 3、 防火墙没有配置心跳线消息的传输通道,导致检测失败 4、 后端服务器的配置问题。心跳方式不同。心跳广播冲突。软件BUG。
3、 如何解决keepalived脑裂的问题? 硬件: 1、 准备两条心跳线,这样断了一条,依然能够传送心跳消息。
2、 设置防火墙,一定要让心跳的消息通过。
3、 监控软件,实时检测(zabbix)
面试时候如何去说?
1、 先简单描述一下脑裂的现象是什么。
2、 说一下解决思路,是软件层面还是网络层面问题。
3、 硬件层面说一两个即可。
4、 最后说一下如何解决脑裂问题。软件层面如何解决,网络层面如何解决,硬件层面如何解决。
dev 开发环境:开发人员专员
sit 测试环境:测试人员使用(开发,运维都可以使用)
pre 预生产环境:一般是运维和开发(和最终的生产环境保持一致)
prd 生产环境:面向用户的环境
运维人员一般在 sit测试环境 pre预生产环境 prd生产环境
小公司:一般两种环境 开发测试混合 生产
中型公司:开发 测试 生产