keepalived——解决服务器单点故障或者keepalied单点(实现高可用)

一、keepelived如何实现高可用?
keepalived软件是基于VRRP协议实现的,VRRP虚拟路由冗余协议,主要用于解决单点故障问题
原理:主备服务器都属于一个小组,主服务器会持续向组内成员发送心跳信息,告诉备用服务存活,如果备用服务器接收不到心跳信息,则自动接管自动接管VIP虚拟ip地址和虚拟MAC地址,备用服务器接管虚拟ip地址后,会发送通告信息,告诉网络中的所有设备MAC地址变更
二、主服务器恢复后的方式
抢占式:恢复就抢回去继续当主(主服务器配置高于备服务器)
非抢占式:恢复就变成备用服务器(主备服务器配置相同)
三、keepailved配置非抢占式,默认抢占式(负载均衡单点,通过心跳信息探测keepalived是否存在)
1.再创建一台负载均衡并hosts解析
【位置: 10.0.0.12 主机名为LB02】
2.配置10.0.0.11为主服务器
【位置:10.0.0.11 主机名为LB】
[root@LB ~]# yum -y install keepalived #安装服务
[root@LB ~]# vim /etc/keepalived/keepalived.conf #配置文件配置

点击查看代码
global_defs {                   #全局配置
    router_id LB              #标识身份->名称
}

vrrp_instance VI_1 {
    state MASTER                #标识角色状态
    interface ens33              #网卡绑定接口
    virtual_router_id 50        #虚拟路由id
    nopreempt                    #非抢占式
    priority 150                #优先级  150票
    advert_int 1                #监测间隔时间 秒
    authentication {            #认证
        auth_type PASS          #认证方式
        auth_pass 1111          #认证密码
    }
    virtual_ipaddress {         
        10.0.0.3                #虚拟的VIP地址
    }
}

[root@LB ~]# systemctl start keepalived
[root@LB ~]# systemctl enable keepalived
3.配置10.0.0.12为备服务器(与主服务器操作相同、配置文件的优先级票数不同)
[root@LB02 ~]# vim /etc/keepalived/keepalived.conf

点击查看代码
global_defs {                  
    router_id LB02
}

vrrp_instance VI_1 {
    state BACKUP               
    interface ens33            
    virtual_router_id 50       
    priority 100    #优先级票数减少           
    advert_int 1
    nopreempt               
    authentication {           
        auth_type PASS         
        auth_pass 1111         
    }
    virtual_ipaddress {        
        10.0.0.3               
    }
}

四、可能出现脑裂的问题(都探测不到心跳,都想接管服务器)
1.问题排查:
1)双方开启了防火墙
2)网络设备问题
3)网线问题
4)网卡问题
2.如何解决脑裂:
(通过脚本探测主服务器是否有相同的10.0.0.3虚拟ip地址,有则杀死自己的keepalived的服务)
第一步:10.0.0.12备用服务器生成密钥对
[root@LB02 ~]# ssh-keygen
第二步:将密钥对推送到主服务器
[root@LB02 ~]# ssh-copy-id 10.0.0.11
[root@LB ~]# > /etc/issue.net # 清空登录前的提示信息
第三步:写脚本探测是否同时存在10.0.0.3相同的虚拟IP地址
[root@LB02 ~]# vim check_vip.sh

点击查看代码
LB=`ssh 10.0.0.11 ip a|grep 10.0.0.3|wc -l`
LB02=`ip a|grep 10.0.0.3|wc -l`
[ $LB -eq $LB02 ] && systemctl stop keepalived    #当LB和LB02相等时则关闭自己的keepalived

3.为什么 netstat 看不到 10.0.0.3?
原因分析:
Nginx 监听的是 0.0.0.0:443,不是特定 IP
VIP 10.0.0.3 是网卡上的别名 IP
netstat 默认显示监听绑定的 IP,不是所有可访问的 IP

4.当自身的负载均衡down后,自动杀死自己的keepalived避免僵尸服务
1)写脚本
[root@LB ~]# vim cjeck_web.sh

点击查看代码
#!/bin/sh
NG=`ps -C nginx --no-header|wc -l`
if [ $NG -eq 0 ]
then
	#如果nginx不存在则尝试重启nginx
	systemctl restart nginx
	#等待1秒
	sleep 1
	#在重新检查nginx是否存在
	  NG=`ps -C nginx --no-header|wc -l`  #判断nginx是否存在
	  if [ $NG -eq 0 ]
	  then
	  #如果$NG变量为0说明nginx还是没有启动、只能杀死keepalived
	  systemctl stop keepalived
	  fi
fi

2)集成到配置文件中自动执行
[root@LB ~]# vim /etc/keepalived/keepalived.conf

点击查看代码
    router_id LB              #标识身份->名称
}
vrrp_script cjeck_web {
    script "/root/cjeck_web.sh"		# 脚本的位置
    interval 5				#5秒检测一次
}

vrrp_instance VI_1 {
    state MASTER                #标识角色状态
    interface ens33              #网卡绑定接口
    virtual_router_id 50        #虚拟路由id
    priority 150                #优先级  150票
    advert_int 1                #监测间隔时间 秒
    authentication {            #认证
        auth_type PASS          #认证方式
        auth_pass 1111          #认证密码
    }
    virtual_ipaddress {         
        10.0.0.3                #虚拟的VIP地址
    }
    track_script {
       cjeck_web			#调用cjeck_web模块并执行
     }
}

3)给脚本X执行权限
[root@LB ~]# chmod +x cjeck_web.sh

posted on 2025-12-15 10:52    阅读(3)  评论(0)    收藏  举报