Keepalived高可用

发布于 29 天前  28 次阅读


一、Keepalived 高可用基本概述

1.什么是高可用

一般是指2台机器启动着完全相同的业务系统,当有一台机器down机了,另外一台服务器就能快速的接管,对于访问的用户是无感知的。

2.keepalived是如何实现高可用的

keepalived软件是基于VRRP协议实现的,VRRP虚拟路由冗余协议,主要用于解决单点故障问题

3.高可用keepalived核心概念

如何确定谁是主节点谁是备节点(选举投票,优先级)

如果Master故障,Backup自动接管,那么Maste恢复后会夺权吗(抢占试、非抢占式)

如果两台服务器都认为自己是Master会出现什么问题(脑裂)

二、keepalived高可用安装配置

环境准备

作用IP角色
node110.0.0.5Master
node210.0.0.6Backup
VIP10.0.0.3虚拟

安装keepalived

[root@lb01 ~]#yum -y install keepalived
[root@lb02 ~]#yum -y install keepalived

配置master

[root@lb01 ~]#cat /etc/keepalived/keepalived.conf 
global_defs {                   #全局配置
    router_id lb01              #标识身份->名称
}

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

配置backup

[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
    authentication {    
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3
    }
}

对比master与Backup的keepalived配置区别

Keepalived配置区别Master节点配置Backup节点配置
route_id(唯一标识)router_id lb01router_id lb02
state(角色状态)state MASTERstate BACKUP
priority(竞选优先级)priority 150priority 100

启动keepalived

三、高可用keepalived抢占式与非抢占式

默认两个节点的Keepalived都启动,节点1的优先级高于节点2,所以VIP在节点1上

[root@lb01 ~]#ip a |grep 10.0.0.3
    inet 10.0.0.3/32 scope global ens33

关闭节点1的keepalived

[root@lb01 ~]#systemctl stop keepalived.service 

#节点2联系不上节点1,主动接管VIP
[root@lb02 ~]#ip a |grep 10.0.0.3
    inet 10.0.0.3/32 scope global ens33

此时重新启动Master上的keepalived,会发现VIP被强行抢占

[root@lb01 ~]#systemctl start keepalived.service 
[root@lb01 ~]#ip a |grep 10.0.0.3
    inet 10.0.0.3/32 scope global ens33

四、配置非抢占式

  1. 两个节点的state都必须配置为BACKUP
  2. 两个节点都必须加上配置 nopreempt
  3. 其中一个节点的优先级必须要高于另外一个节点的优先级。

两台服务器都角色状态启用nopreempt后,必须修改角色状态统一为BACKUP,唯一的区分就是优先级。

Master配置

[root@lb01 ~]#vim /etc/keepalived/keepalived.conf 
global_defs {                   #全局配置
    router_id lb01              #标识身份->名称
}

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

Backup配置

[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
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3
    }
}

通过windows的arp去验证,是否会切换MAC地址

#查看VIP在节点1上面
[root@lb01 ~]#ip addr | grep 10.0.0.3
    inet 10.0.0.3/32 scope global ens33
#windows查看Mac地址
C:\Users\Administrator> arp -a
#将节点1的keepalived停掉
[root@lb01 ~]# systemctl stop keepalived
#节点2接管VIP
[root@lb02 ~]#ip addr | grep 10.0.0.3
    inet 10.0.0.3/32 scope global ens33
#再次查看mac地址
C:\Users\Administrator> arp -a
#将节点1的keepalived重启
[root@lb01 ~]#systemctl start keepalived
C:\Users\Administrator> arp -a
#发现MAC地址没有转换 依旧是lb02MAC地址

五、高可用keepalived故障脑裂

脑裂故障原因

  1. 服务器网线松动等网络故障
  2. 服务器硬件故障发生损坏现象而崩溃
  3. 主备都开启firewalld防火墙

脑裂故障现象

#需先配置抢占式
 
[root@lb01 ~]#ip addr | grep 10.0.0.3
    inet 10.0.0.3/32 scope global ens33
[root@lb02 ~]#ip addr | grep 10.0.0.3
    inet 10.0.0.3/32 scope global ens33
#节点1和节点2相互发送VRRP信息 相互都收不到

六高可用keepalived结合nginx

为什么域名解析到VIP就可以访问nginx?

Nginx默认监听在所有的IP地址上,VIP会飘到一台节点上,相当于那台nginx多了VIP这么一个网卡,所以可以访问到nginx所在机器

但是…..如果nginx宕机,会导致用户请求失败,但是keepalived没有挂掉不会进行切换,所以需要编写一个脚本检测Nginx的存活状态,如果不存活则kill掉keepalived

编写脚本

[root@lb01 ~]#cat  check_web.sh 
#!/bin/sh
Nginx=`netstat -lnutp |grep 80|wc -l`

if [ $Nginx -eq 0 ];then
	systemctl restart nginx
	Nginx=`netstat -lnutp |grep 80|wc -l`
if [ $Nginx -eq 0 ];then
	systemctl stop keepalived

fi
fi
#给脚本增加执行权限
[root@lb01 ~]#chmod +x check_web.sh 
[root@lb01 ~]#ll
total 4
-rwxr-xr-x 1 root root 197 Dec 18 16:10 check_web.sh

在lb01主机的keepalived配置文件中调用此脚本

[root@lb01 ~]#vim /etc/keepalived/keepalived.conf 
global_defs {                   #全局配置
    router_id lb01              #标识身份->名称
}
#每5秒执行一次脚本,脚本执行内容不能超过5秒,否则会中断再次重新执行脚本
vrrp_script check_web {
    script "/root/check_web.sh"
    interval 5
}

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

    #调用并运行脚本
    track_script {
    check_web
    }
}
重启服务
[root@lb01 ~]# systemctl restart keepalived

#在Master的keepalived中调用脚本,抢占式,仅需在master配置即可。(注意,如果配置为非抢占式,那么需要两台服务器都使用该脚本)

小棱
最后更新于 2024-12-24