keepalived为Ivs应运而生的高可用服务。Ivs的调度器无法做高可用,于是keepalived这个软件。 实现的是调度器的高可用。
但是: keepalived不是专为Ivs集群服务的,也可以做其他代理服务器的高可用。
lvs的高可用集群:主调度器和备调度器(可以有多个)一主两备 一主一备
主调度器能够正常运行时,有主调度器进行真实后端服务器的分配处理,其余的备用调度器处于冗余状态
不参与集群的运转,主调度器出现了故障无法运行,备调度器才会承担主调度器的工作
一旦主调度器恢复工作,继续由主调度器进行处理,备调度器又成冗余
VRRP:Keeplived是基于vrrp协议实现lvs服务的高可用。解决了调度器单节点的故障问题
VRRP协议 :提高网络路由器可靠性开发的一种协议
主备切换的解释
选举出主和备:预先设定好主和备的优先级,主的优先级高,备的优先级低 一旦开启服务
vrrp组播通信:224.0.0.18vrrp协议当中的主备服务器通过组播地址进行通信,交换服务器之间的运行状态,主服务器会周期性的发送vrrp的报文消息,以通知其他备服务器的主服务器的现在状态。
主备切换:主服务器发生故障或者不可达,vrrp协议会把请求转发到备服务器,通过组播地址,vrrp可以迅速的通知其他服务器发生了住别切换,确保新的主服务器可以正常的处理客户端的请求
故障恢复:一旦主服务器恢复通信,有组播地址进行通信, 发现在恢复的主服务器的优先级会比较高,会抢占原主服务器的位置,成为主服务器,调度和接收请求
keepalived的体系模块:
全局模块: core模块,负载整个keepalived启动加载和维护。
VRRP模块:实现vrrp协议,主备切换。
check:负责健康检查,检查后端真实服务器的健康健康。配置真实服务器的模块当中。
脑裂
脑裂:主备同时拥有vip地址 在高可用系统中,联系两个节点的心跳线,本来是一体的,动作协调的高可用系统,心跳线断开后,分裂成了两个独立的个体,主备之间取了联系,都以为对方出现了故障,两个调度器,就像脑裂人一样,开始抢主的位置,抢占vip,主有vip 备也有vip 导致整个集群失败
脑裂分析判断原因::
软件层面:配置文件错误,tcpdump抓包分析好配置 改文件重启即可
网络层面:高可用服务器之间心跳线检测失败,主备之间无法通信
硬件层面:连接主备之间的心跳线老化,网卡或者网卡的驱动失败,IP地址配置冲突防火墙没有配置心跳线的传输通道
如何解决keepalive脑裂的问题
1 硬件:准备2条心跳线,断了一条,依然能够传送心跳线
2 设置防火墙一定让心跳信息通过
3 监控软件,实时检测
环境介绍:
dev开发环境开发人员专用
sit测试环境测试人员使用(开发,运维)
pre预生产环境运维和开发(和最终的生产 环境保持一致)
prd生产环境(面向用户的环境。)
实验前准备:
Test1主调度器 20.0.0.10
Test2 备调度器 20.0.0.20
后端真实服务器 20.0.0.30 nginx
后端真实服务器 20.0.0。40 nginnx
vip地址:20.0.0.100 nginx
客户端 61
工作方式基于vrrp协议:
1 确定主备
2 vip地址只能有一个,出现在主服务器上
2 vrrp224.0.0.0.18 组播地址,发送vrrp报文,
4、主备切换,主出现故障, vip地址会飘移到备服务器。
5.主服务器恢复,VIP地址要回到主
6、脑裂主备都有vip软件层面q检查配置文件,重启。
- keepalived不是只能和IVs搭配,也可以和其他服务配合,实现高可用。
Lvs Keepalived 实验步骤:
Test1 20.0.0.10 主调度器
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install ipvsadm keepalived
[root@localhost ~]# cd /etc/keepalived/
[root@localhost keepalived]# ls
keepalived.conf
[root@localhost keepalived]# vim keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_01
#主备服务器的id,不能一致
vrrp_skip_check_adv_addr
#vrrp_strict
#取消严格遵守vrrp协议功能,不取消无法连接
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
#表示身份,主备MASTER BACKUP
interface ens33
#绑定vip地址的物理接口
virtual_router_id 10
#虚拟路由器的id
priority 100
advert_int 1
#发送报文的间隔时间
authentication {
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
#连接保持时间
protocol TCP
real_server 20.0.0.30 80 {
weight 1
#后端服务器的轮询权重
TCP_CHECK {
connect_port 80
#检测目标的端口号
connect_timeout 3
#连接超时时间
nb_get_retry 3
#重试的次数
delay_before_retry 4
#重试的间隔描述
}
}
[root@localhost keepalived]# systemctl restart keepalived.service
[root@localhost keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 20.0.0.100:80 rr
-> 20.0.0.30:80 Route 1 0 0
-> 20.0.0.40:80 Route 1 0 0
[root@localhost keepalived]# ip addr
[root@localhost keepalived]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@localhost keepalived]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
备调度器test2 20.0.20
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install ipvsadm keepalived
#复制test1的配置前 先备份下
[root@localhost ~]# cd /etc/keepalived/
[root@localhost keepalived]# ls
keepalived.conf
[root@localhost keepalived]# cp keepalived.conf keepalived.conf.bak
[root@localhost keepalived]# ls
keepalived.conf keepalived.conf.bak
#远程复制
[root@localhost keepalived]# scp root@20.0.0.10:/etc/keepalived/keepalived.conf /etc/keepalived/
[root@localhost keepalived]# ls
keepalived.conf keepalived.conf.bak
[root@localhost keepalived]# vim keepalived.conf
#在再修改下几个
[root@localhost keepalived]# systemctl restart keepalived.service
[root@localhost keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 20.0.0.100:80 rr
-> 20.0.0.30:80 Route 1 0 0
-> 20.0.0.40:80 Route 1 0 0
[root@localhost keepalived]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
#没有vip 地址
后端真实服务器test3 20.0.0.30
#配置页面内容 vip地址 再添加选址标识
[root@localhost ~]# systemctl restart nginx.service
[root@localhost ~]# systemctl restart nginx.service
[root@localhost ~]# cd /usr/local/nginx/html/
[root@localhost html]# ls
50x.html bbs index.html index.php
[root@localhost html]# vim index.html
随便写入内容
[root@localhost html]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=20.0.0.100
NETMASK=255.255.255.255
[root@localhost html]# ifup ifcfg-lo
[root@localhost html]# route add -host 20.0.0.100 dev lo:0
#配置内核文件
[root@localhost html]# vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@localhost html]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
后端真实服务器test4
同上配置
Last login: Mon Oct 16 22:39:57 2023 from 20.0.0.99
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# cd /usr/share/nginx/html/
[root@localhost html]#
[root@localhost html]# ls
50x.html index.html
[root@localhost html]# vim index.html
[root@localhost html]# vim /etc/sysconfig/network
network network-scripts/
[root@localhost html]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
[root@localhost html]# ifup ifcfg-lo:0
[root@localhost html]# route add -host 20.0.0.100 dev lo:0
[root@localhost html]# vim /etc/sysctl.conf
[root@localhost html]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
验证测试
Test1
[root@localhost keepalived]# systemctl stop keepalived.service
Test2
Ip addr
VIP地址飘到备用调度器上
</html>
[root@www ~]# curl 20.0.0.100
this is 33
[root@www ~]# curl 20.0.0.100