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
- 设置访问页面
1.确定主备
2.vrrp只能有一个,出现在主服务器上。
3.通过vrrp 组播地址 224.0.0.18 发送vrrp报文,检测主的心跳
4.主备切换,主出现故障,vip地址会漂移到备服务器。
5.主恢复了,vrrp地址还会回到主
6.脑裂 主备都有VIP
(硬件层面,软件层面)
脑裂解决(软件层面):
1.检查配置文件,重启
7.keepalive不是只能和lvs搭配,也可以和其他服务配合,实现高可用
1.硬件:准备两条心跳线,这样短一条依然能够传送心跳消息
2.设置防火墙一定要让心跳消息通过。
3.依靠监控软件实时检测来实现(zabbix)
1.配置文件有问题
2.通过tcpdump抓包分析
3.重启两边服务
1.高可用服务器之间心跳线检测失败。主备之间无法进行通信。
2.硬件层面:
2.1连接主备之间的心跳线老化
2.2网卡或者网卡驱动失效,IP地址配置冲突
2.3 防火墙没有配置心跳线消息的传输通道
2.4后端服务器的配置问题,心跳方式不同,心跳广播冲突,软件BUG
了解即可
dev 开发环境 开发人员专用
sit 测试环境 测试人员使用(开发,运维)
pre:预生产环境 开发和运维(和最终生产环境保持一致)
prd:生产环境(面向用户的环境)