- LVS+Keepalived群集
- 一、Keepalived工具介绍
- 1.keepalived服务重要功能
- 1.1管理LVS负载均衡软件
- 1.2支持故障自动切换
- 2.keepalived体系主要模块
- 3.keepalived的工作原理
- 4.keepalived实现原理剖析
- 二、keepalived问题故障
- 1.keepalived脑裂
- 2.脑裂的原因
- 3、解决方案
- 三、LVS+Keepalived高可用群集的搭建
- 1.配置负载调度器(主:192.168.50.128)
- 2.备服务器部署(192.168.50.158)
- 3.配置节点服务器
- 4.配置节点服务器web2(192.168.50.198)
- 5.测试验证
- 总结
引言:企业应用中,单台服务器承担应用存在单点故障的危险,单点故障一旦发生,企业服务器将发生中断,造成极大的危害和损失,Keepalived是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题 一、Keepalived工具介绍
keepalived软件专为LVS和HA设计的一款健康工具;用来管理并监控LVS集群中各个服务节点的状态。在一个LVS服务器集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但是对外表现为一个虚拟IP,主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息时,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性
1.keepalived服务重要功能 1.1管理LVS负载均衡软件Keepalived通过读取自身配置文件,备服务器检测主服务器的状态,实现通过更底层的接口直接管理LVS的配置以即控制服务的启动、停止功能
1.2支持故障自动切换Keepalived可以实现任意两台主机之间,例如Master和Backup主机之间的故障转移和自动切换,这个主机可以是普通的不能停机的业务服务器,也可以是LVS负载均衡,Nginx反向代理这样的服务器。
Keepalived高可用功能实现的简单原理为,两台主机同时安装好Keepalived软件并启动服务,开始正常工作时,由角色为Master的主机获得所有资源并对用户提供服务,角色为Backup的主机作为Master主机的热备;当角色为Master的主机失效或出现故障时,角色为Backup的主机将自动接管Master主机的所有工作,包括接管VIP资源及相应资源服务;而当角色为Master的主机故障修复后,又会自动接管回它原来处理的工作,角色为Backup的主机则同时释放Master主机失效时它接管的工作,此时,两台主机将恢复到最初启动时各自的原始角色及工作状态。
Keepalived软件的官方站点是[http://www.keepalived.org](http://www.keepalived.org
2.keepalived体系主要模块| keepalived的主要模块 | 作用 |
|---|---|
| core模块 | 为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析 |
| vrrp模块 | 是来实现VRRP协议的 |
| check模块 | 负责健康检测,常见的方式有端口检查及URL检查 |
keepalived高可用之间是通过VRRP进行通信,VRRP通过竞选机制来确定主备,也就是在keepalived的配置文件例,设置优先级,主的优先级高于备,因此工作时会优先获得所有的共享资源,而备节点处于等待监听状态,当主服务器出现故障,备节点就会接管主节点的资源,顶替主对外提供服务
在keepalived服务,只有作为主的服务器会不断给备发送VRRP广播包,告诉备节点还存活,备收到消息后不会抢占,当主不可用时,备未收到主发送的广播包,就会接管相关服务接管资源,保证业务连续性,接管速度最快可以小于1秒
Keepalived工作在TCP/IP参考模型的三层、四层、五层(物理层,链路层):
网络层(3):Keepalived通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。
传输层(4):Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。
应用层(5):,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除。
4.keepalived实现原理剖析keepalived采用VRRP热备份协议,实现Linux服务器的多机热备功能
vrrp虚拟路由冗余协议
vrrp会把多台路由组成一个虚拟路由组vrid,VRRP会生成一个虚拟路由(包含虚拟IP和虚拟MAC,局域网用户不关心哪个是主哪个是备,他们只用虚拟路由器的虚拟IP作为他们的网关),实际上虚拟IP是承载在master路由器,也就是说实际的数据通过master进行转发;backup是通过优先级来决定哪个是maste路由,优先级最大的那台就是master;backup只是用来监听master定时发来的vrrp报文,如果超时未收到master发来的vrrp报文,backup就会抢占master,虚拟IP也会一起漂移到backup上
- 由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务
- 每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态
- 若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务
在高可用(HA)系统中,当联系2个节点的"心跳线"断开时,本来为一个整体,动作协调的HA系统,就分裂称为2个独立的个体,由于相互失去了联系,都以为是对方出了故障,两个节点上的HA软件像"连体人"一样,争抢"共享资源",争起"应用服务",就会发生严重后果—或者共享资源被瓜分、主备服务同时无法启动、又或是主备服务同时启动,同时会进行读写"共享存储"导致数据损坏(常见如数据库轮询着的联机日志出错)
2.脑裂的原因①高可用服务器对之间心跳线链路发生故障,导致无法正常通信,如心跳线坏了(包括断了、老化)
②因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)
③因心跳线间连接的设备故障(网卡及交换机)
④因仲裁的集群出问题(采用仲裁的方案)
⑤高可用服务器上开启了iptables防火墙阻挡了心跳消息传输
⑥keepalived配置里同一VRRP实例如果virtual_touter_id两端参数配置不一致也会导致脑裂问题发生
⑦vrrp实例名字不一致、优先级不一致
3、解决方案①添加冗余的心跳线,例如:双线条先(心跳线也HA),尽量减少"脑裂"发生几率
②启用磁盘锁,正在服务乙方锁住共享磁盘,“脑裂"发生时,让对方完全"抢不走"共享磁盘资源,但使用磁盘锁也会有一个不小的问题,如果占用共享盘的一方不主动"解锁”,另一方就永远得不到共享磁盘,现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令,后备节点也就接管不了共享资源和应用服务,于是有人在HA中设计了"智能锁",即正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁,平时就不上锁了
③设置仲裁机制,例如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping以下参考IP,不通则表明断点就出在本端,不仅"心跳",还兼对外“服务”的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。
④利用脚本检测、报警
vim check_keepalived.sh #!/bin/bash $ip=192.168.233.9 while true do if [ `ip a show ens33 |grep $ip|wc -l` -ne 0 ] then echo "keepalived is error!" else echo "keepalived is OK !" fi done
集群要满足的三个特点
①负载均衡
②健康检查
③故障切换
对于节点服务器:健康检查,如果发现有故障的节点就会将其隔离或者剔除集群待其恢复后再重新加入到集群当中
负载均衡器:健康检查会定时检查主机状态(包括主机和服务的状态),如果出现故障就会自动切换到备主机上
待主的恢复,重新让主承载业务请求,
三、LVS+Keepalived高可用群集的搭建环境准备
主DR服务器:192.168.50.128 备DR服务器:192.168.50.158 Web服务器1:192.168.50.168 web服务器2:192.168.50.198 VIP:192.168.50.188 win10客户端:192.168.50.1501.配置负载调度器(主:192.168.50.128)
关闭防火墙,安装ipvsadm和keepalived工具 systemctl stop firewalld.service setenforce 0 yum install -y ipvsadm keepalived modprobe ip_vs cat /proc/net/ip_vs
配置keepalived文件
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf
......
global_defs { #定义全局参数
--10行--修改,邮件服务指向本地
smtp_server 127.0.0.1
--12行--修改,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
router_id LVS_01
--14行--注释掉,取消严格遵守VRRP协议功能,否则VIP无法被连接
#vrrp_strict
}
vrrp_instance VI_1 { #定义VRRP热备实例参数
--20行--修改,指定热备状态,主为MASTER,备为BACKUP
state MASTER
--21行--修改,指定承载vip地址的物理接口
interface ens33
--22行--修改,指定虚拟路由器的ID号,每个热备组保持一致
virtual_router_id 10
#nopreempt #如果设置非抢占模式,两个节点state必须为bakcup,并加上配置 nopreempt
--23行--修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90
priority 100
advert_int 1 #通告间隔秒数(心跳频率)
authentication { #定义认证信息,每个热备组保持一致
auth_type PASS #认证类型
--27行--修改,指定验证密码,主备服务器保持一致
auth_pass 123456
}
virtual_ipaddress { #指定群集vip地址
192.168.50.188
}
}
--36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
virtual_server 192.168.50.188 80 {
delay_loop 6 #健康检查的间隔时间(秒)
lb_algo rr #指定调度算法,轮询(rr)
--39行--修改,指定群集工作模式,直接路由(DR)
lb_kind DR
persistence_timeout 0 #连接保持时间(秒)
protocol TCP #应用服务采用的是 TCP协议
--43行--修改,指定第一个Web节点的地址、端口
real_server 192.168.50.168 80 {
weight 1 #节点的权重
--45行--删除,添加以下健康检查方式
TCP_CHECK {
connect_port 80 #添加检查的目标端口
connect_timeout 3 #添加连接超时(秒)
nb_get_retry 3 #添加重试次数
delay_before_retry 3 #添加重试间隔
}
}
real_server 192.168.50.198 80 { #添加第二个 Web节点的地址、端口
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
##删除后面多余的配置##
虚拟网卡配置 vim /etc/sysconfig/network-scripts/ifcfg-ens33:0 DEVICE=ens33:0 ONBOOT=yes IPADDR=192.168.50.188 NETMASK=255.255.255.255
systemctl start keepalived.service 启动keepalived服务 ip addr
启动ipvsadm服务
# ipvsadm-save > /etc/sysconfig/ipvsadm systemctl start ipvsadm ipvsadm -C ipvsadm -A -t 192.168.50.188:80 -s rr ipvsadm -a -t 192.168.50.188:80 -r 192.168.50.168:80 -g ipvsadm -a -t 192.168.50.188:80 -r 192.168.50.198:80 -g ipvsadm ipvsadm -ln
vim /etc/sysctl.conf 调整内核proc响应参数,关闭Linux内核的重定向参数响应 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.ens33.send_redirects = 0 sysctl -p
关闭防火墙,安装ipvsadm和keepalived工具 systemctl stop firewalld.service setenforce 0 yum install -y ipvsadm keepalived modprobe ip_vs cat /proc/net/ip_vs
配置keepalived文件
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf
......
global_defs { #定义全局参数
--10行--修改,邮件服务指向本地
smtp_server 127.0.0.1
--12行--修改,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
router_id LVS_02
--14行--注释掉,取消严格遵守VRRP协议功能,否则VIP无法被连接
#vrrp_strict
}
vrrp_instance VI_1 { #定义VRRP热备实例参数
--20行--修改,指定热备状态,主为MASTER,备为BACKUP
state BACKUP
--21行--修改,指定承载vip地址的物理接口
interface ens33
--22行--修改,指定虚拟路由器的ID号,每个热备组保持一致
virtual_router_id 10
#nopreempt #如果设置非抢占模式,两个节点state必须为bakcup,并加上配置 nopreempt
--23行--修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90
priority 90
advert_int 1 #通告间隔秒数(心跳频率)
authentication { #定义认证信息,每个热备组保持一致
auth_type PASS #认证类型
--27行--修改,指定验证密码,主备服务器保持一致
auth_pass 123456
}
virtual_ipaddress { #指定群集vip地址
192.168.50.188
}
}
--36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
virtual_server 192.168.50.188 80 {
delay_loop 6 #健康检查的间隔时间(秒)
lb_algo rr #指定调度算法,轮询(rr)
--39行--修改,指定群集工作模式,直接路由(DR)
lb_kind DR
persistence_timeout 0 #连接保持时间(秒)
protocol TCP #应用服务采用的是 TCP协议
--43行--修改,指定第一个Web节点的地址、端口
real_server 192.168.50.168 80 {
weight 1 #节点的权重
--45行--删除,添加以下健康检查方式
TCP_CHECK {
connect_port 80 #添加检查的目标端口
connect_timeout 3 #添加连接超时(秒)
nb_get_retry 3 #添加重试次数
delay_before_retry 3 #添加重试间隔
}
}
real_server 192.168.50.198 80 { #添加第二个 Web节点的地址、端口
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
##删除后面多余的配置##
配置网卡信息,(不需要配置,keepalived配置文件里已经有了,这里有误) vim /etc/sysconfig/network-scripts/ifcfg-ens33:0 DEVICE=ens33:0 ONBOOT=yes IPADDR=192.168.50.188 NETMASK=255.255.255.255 ~
配置分发策略,(#keepalived配置好后,可以不用再配ipvsadm 分发策略) ipvsadm-save > /etc/sysconfig/ipvsadm ipvsadm -C ipvsadm -A -t 192.168.50.188:80 -s rr ipvsadm -a -t 192.168.50.188:80 -r 192.168.50.168:80 -g ipvsadm -a -t 192.168.50.188:80 -r 192.168.50.198:80 -g ipvsadm ipvsadm -ln
vim /etc/sysctl.conf net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.ens33.send_redirects = 03.配置节点服务器
关闭防火墙,安装httpd服务 systemctl stop firewalld setenforce 0 yum install -y httpd
创建一个站点文件 vim /var/www/html/index.html this is boss
编辑一个虚拟回环网卡 vim /etc/sysconfig/network-scripts/ifcfg-lo:0 DEVICE=lo:0 ONBOOT=yes IPADDR=192.168.50.188 NETMASK=255.255.255.255
重启网卡 systemctl restart network ifup lo:0 ifconfig lo:0
添加路由条目 route add -host 192.168.59.188 dev lo:0 route -n
net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 sysctl -p
systemctl stop firewalld setenforce 0 yum -y install httpd
vim /var/www/html/index.html this is zxc w
vim /etc/sysconfig/network-scripts/ifcfg-lo:0 DEVICE=lo:0 ONBOOT=yes IPADDR=192.168.50.188 NETMASK=255.255.255.255
systemctl restart network ifup lo:0 ifconfig lo:0 route add -host 192.168.59.188 dev lo:0 route -n
vim /etc/sysctl.conf net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 25.测试验证
在客户端访问192.168.50.188,默认网关指向192.168.50.188 将主服务器keepalived服务关闭,再进行测试
先浏览器验证
断开主DR的keepalived测试
过一会刷新一下
总结上述文章对keepalived的主要功能和工作原理进行了简单的描述,需要了解keepalived主从服务器的区别,最后通过实验简单构建了一个负载均衡、高可用群集,还介绍了keepalived的故障问题脑裂,怎么出现的,该如何解决这类问题



