企业应用中,单台服务器承担应用存在单点故障的危险
单点故障一旦发生,企业服务将发生中断,造成极大的危害

专为LVS和HA设计的一款健康检查工具
判断LVS负载调度器、节点服务器的可用性,当master主机出现故障及时切换到backup节点保证业务正常,当master故障主机恢复后将其从新加入群集并且业务重新切换回master节点
负载均衡 用于提高群集的性能 LVS Nginx HAProxy SLB F5
健康检查(探针) 针对于调度器和节点服务器 Keepalived Heartbeat
故障转移 通过VIP漂移实现主备切换 VRRP 脚本
发送心跳消息 vrrp报文 ping/pong
TCP端口检查 向目标主机的 IP:PORT 发起TCP连接请求,如果TCP连接三次握手成功则认为健康检查正常,否则认为健康检查异常
HTTP URL检查 向目标主机的URL路径(比如http://IP:PORT/URI路径)发起 HTTP GET请求方法,如果响应消息的状态码为 2XX 或 3XX,则认为健康检查正常;如果响应消息的状态码为 4XX 或 5XX,则认为健康检查异常
在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但是对外表现为一个虚拟IP(VIP),主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性
由多台路由器组成一个热备组,通过共用的虚拟IP对外提供服务
每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态
若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务

漂移地址:192.168.10.72
主、备服务器:192.168.10.73、192.168.10.74
提供的应用服务:Web

下载程序包
- tar -zxf keepalived-2.2.8.tar.gz #解压缩
-
- yum -y install openssl-devel
- yum install libnl-devel #安装模块
-
- ./configure -prefix=/opt/keepalived #编译
- make && make install #安装
实验前准备2台服务器
- systemctl disable --now firewalld
- setenforce 0
-
-
- vim /etc/selinux/config
-
- SELINUX=disable


yum install -y keepalived

vim /etc/keepalived/keepalived.conf

- cd /etc/keepalived
- ls
- cp keepalived.conf keepalived.bak #配置文件进行备份
- ls

修改配置文件

操作相同,配置文件修改稍作更改如下

- systemctl start keepalived.service
- systemctl enable keepalived.service

主服务器

备服务器

Keepalived首先做初始化先检查state状态,master为主服务器,backup为备服务器。
然后再对比所有服务器的priority,谁的优先级高谁是最终的主服务器。
优先级高的服务器会通过ip命令为自己的电脑配置一个提前定义好的浮动IP地址。
抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP
非抢占式俩节点state必须为bakcup,且必须配置nopreempt。
这样配置后,我们要注意启动服务的顺序,优先启动的获取master权限,与优先级没有关系了。

准备5台服务器
nfs服务器与节点服务器配置见案例:LVS DR模式-CSDN博客
yum install -y ipvsadm

- modprobe ip_vs #加载模块
- lsmod | grep ip_vs

- touch /etc/sysconfig/ipvsadm
- systemctl start ipvsadm
- systemctl enable ipvsadm
- systemctl status ipvsadm

vim /etc/keepalived/keepalived.conf
TCP端口检查方式

- systemctl start keepalived.service
- ip a
主服务器

备服务器

ipvsadm -ln #规则已自动生成



刷新

将主服务器宕机后,备服务器启用,结果与以上情况相同
- #服务器1的配置keepalived.conf
- ! Configuration File for keepalived
-
- global_defs {
- router_id lb01 # 路由器标识,一般不用改,也可以写成每个主机自己的主机名
- }
-
- vrrp_instance VI_1 {
- state MASTER # 在另一个主机上为BACKUP
- interface ens33
- virtual_router_id 51 # 每个vrrp_instance唯一
- priority 100 # 在另一个主机上为50,保证能选出主
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 10.0.0.10 dev ens33 label ens33:0 # 指定vrrp_instance的VIP和label
- }
- }
-
- vrrp_instance VI_2 { # 再定义一个虚拟路由器VI_2实例
- state BACKUP # 在另一个主机上为MASTER
- interface ens33
- virtual_router_id 61 # 每个vrrp_instance唯一
- priority 50 # 在另一个主机上为100,保证能选出主
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 10.0.0.50 dev ens33 label ens33:1 # 指定vrrp_instance的VIP和label
- }
- }
- #服务器2的配置 keepalived.conf
- ! Configuration File for keepalived
-
- global_defs {
- router_id lb02 # 路由器标识,一般不用改,也可以写成每个主机自己的主机名
- }
-
- vrrp_instance VI_1 {
- state BACKUP # 此行修改为BACKUP
- interface ens33
- virtual_router_id 51
- priority 50 # 此行修改为50
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 10.0.0.10 dev ens33 label ens33:0
- }
- }
-
- vrrp_instance VI_2 {
- state MASTER # 此行修改为MASTER
- interface ens33
- virtual_router_id 61
- priority 100 # 此行修改为100
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 10.0.0.50 dev ens33 label ens33:1
- }
- }
- # 重启keepalived服务:在两台设备上都执行:
- systemctl restart keepalived
-
- # 查看两个节点各自的VIP
- [root@lb01 keepalived]# ip a | egrep "10.0.0.10|0.50"
- inet 10.0.0.10/32 scope global ens33:0
- [root@lb02 keepalived]# ip a | egrep "10.0.0.10|0.50"
- inet 10.0.0.50/32 scope global ens33:1
- #主服务器配置
- vi keepalived.conf
- keepalived.conf:
- #检测脚本
- vrrp_script chk_http_port {
- script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动
- interval 2 #(检测脚本执行的间隔,单位是秒)
- weight 2 #权重
- }
- #vrrp 实例定义部分
- vrrp_instance VI_1 {
- state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备
- interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
- virtual_router_id 66 # 虚拟路由编号,主从要一直
- priority 100 # 优先级,数值越大,获取处理请求的优先级越高
- advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
- #授权访问
- authentication {
- auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
- auth_pass 1111
- }
- track_script {
- chk_http_port #(调用检测脚本)
- }
- virtual_ipaddress {
- 192.168.16.130 # 定义虚拟ip(VIP),可多设,每行一个
- }
- }
- #备服务器配置
- #检测脚本
- vrrp_script chk_http_port {
- script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动
- interval 2 #(检测脚本执行的间隔)
- weight 2 #权重
- }
- #vrrp 实例定义部分
- vrrp_instance VI_1 {
- state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备
- interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
- virtual_router_id 66 # 虚拟路由编号,主从要一直
- priority 99 # 优先级,数值越大,获取处理请求的优先级越高
- advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
- #授权访问
- authentication {
- auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
- auth_pass 1111
- }
- track_script {
- chk_http_port #(调用检测脚本)
- }
- virtual_ipaddress {
- 192.168.16.130 # 定义虚拟ip(VIP),可多设,每行一个
- }
- }
- #!/bin/bash
- #检测nginx是否启动了
- A=`ps -C nginx --no-header |wc -l`
- if [ $A -eq 0 ];then #如果nginx没有启动就启动nginx
- systemctl start nginx #重启nginx
- if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重启失败,则停掉keepalived服务,进行VIP转移
- killall keepalived
- fi
- fi
实验环境同LVS+Keepalived高可用负载均衡,负载调度器配置不同
nginx -V

- cd /etc/nginx
- vim nginx.conf

- nginx -t
- systemctl enable --now nginx


刷新

另一台配置同上测试结果相同
yum install -y keepalived

- cd /etc/keepalived
- touch check_nginx.sh
- vim check_nginx.sh
-
-
- #!/bin/bash
-
- if !killall -0 nginx &> /dev/null
- then
- systemctl stop keepalived
- fi
-
-
- chmod +x check_nginx.sh

- vim keepalived.conf
- systemctl start keepalived
- systemctl enable keepalived
- ip a
主服务器


备服务器




刷新

尝试故障转移测试(关闭主服务器nginx后keepalived也停止运行)

VIP转移到备服务器,且测试结果同上
若需要还原,则因为脚本的缘故,应先启动主服务器nginx服务再启动keepalived


主服务器和备服务器都同时拥有相同的VIP
因为主服务器和备服务器的通信中断,导致备服务器无法收到主服务器发送的VRRP报文,备服务器误认为主服务器已经故障了并通过ip命令生成VIP
关闭主服务器或备服务器其中一个的keepalived服务
如果是系统防火墙导致,则关闭防火墙或添加防火墙规则放通VRRP组播地址(224.0.0.18)的传输
如果是主备服务器之间的通信链路中断导致,则可以在主备服务器之间添加双链路通信
在主服务器使用脚本定时判断与备服务器通信链路是否中断,如果判断是主备服务器之间的链接中断则自行关闭主服务器上的keepalived服务
- #主服务器脚本
-
- #!/bin/bash
- while true
- do
- ping -c4 -i 0.5 -W 2 备服务器IP
- if 「 $? -ne 0 ]
- then ssh 另一台主机IP ping -c 4 -i 0.5 -W2 -I 另一台主机IP 备服务器IP
- if [ $? -eg 0 ]
- then systemctl stop keepalived
- fi
- fi
- sleep 20
- done
利用第三方应用或监控系统检测是否发生了脑裂故障现象,如果确认发生了脑裂故障则通过第三方应用或监控系统来关闭主服务器或备服务器其中一个的keepalived服务