kylin-Nginx高可用--keepalived

keepalived高可用

一、基本概述

  • 什么是高可用?

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

  • keepalived是如何实现高可用的?

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

二、环境准备

两台负载均衡机器:lb01	lb02-backup
两台负载均衡的配置一模一样,地址池指向两台已经部署了WordPress业务的web服务器

三、部署keepalived(默认为抢占式)

作用 IP 角色
node1 10.0.0.5 Master
node2 10.0.0.6 Backup
VIP 10.0.0.3 虚拟IP

lb01(主)部署

第一步:下载keepalived服务
[root@lb01 ~]# yum install -y keepalived

第二步:编辑配置文件
[root@lb01 ~]# vim /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地址
    }
}

第三步:启动服务
[root@lb01 ~]# systemctl restart keepalived.service 
[root@lb01 ~]# systemctl enable keepalived.service

lb02(备)部署

第一步:下载keepalived服务
[root@lb02 ~]# yum install -y keepalived

第二步:编辑配置文件
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
global_defs {                   #全局配置
    router_id lb02              #标识身份->名称
}

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

第三步:启动服务
[root@lb02 ~]# systemctl restart keepalived.service 
[root@lb02 ~]# systemctl enable keepalived.service

对比master与Backup的keepalived配置区别

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

测试

1.在上述配置中由于lb1的优先级高于lb2,所以VIP在节点1上面

[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
[root@lb02 ~]# 

2.测试lb1的keepalived服务down掉,lb02会自动接管

[root@lb01 ~]# systemctl stop keepalived.service 
[root@lb01 ~]# ip addr | grep 10.0.0.3
[root@lb01 ~]# 

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

3.重新启动lb1的keepalived服务,VIP会被抢占

[root@lb01 ~]# systemctl restart keepalived.service 
[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
[root@lb02 ~]# 

四、keepalived非抢占式配置

Keepalived配置 Master节点配置 Backup节点配置
route_id(唯一标识) lb01 lb02
state(角色状态) BACKUP BACKUP
priority(竞选优先级) 150 100
nopreempt vrrp_instance VI_1中配置 vrrp_instance VI_1中配置

lb01配置文件

#其余配置不变
#修改、添加一下内容
    vrrp_instance VI_1 {
        state BACKUP
        priority 150
        nopreempt
    }

lb02配置文件

#其余配置不变
#修改、添加一下内容
    vrrp_instance VI_1 {
        state BACKUP
        priority 100
        nopreempt
    }

测试

1.Linux中查看VIP Windows中查看arp表10.0.0.3的mac地址

#Linux:
[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
[root@lb02 ~]# 

#Windows(此处mac地址与应与lb01的ens33网卡的mac地址相同)
接口: 10.0.0.1 --- 0x6
  Internet 地址         物理地址              类型
  10.0.0.3              00-0c-29-db-90-e8     动态

2.停用lb1的keepalived服务,继续查看

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

#Linux:
[root@lb01 ~]# ip addr | grep 10.0.0.3
[root@lb01 ~]# 
[root@lb02 ~]# ip addr | grep 10.0.0.3
    inet 10.0.0.3/32 scope global ens33
    
#Windows(此处mac地址与应与lb02的ens33网卡的mac地址相同)
接口: 10.0.0.1 --- 0x6
  Internet 地址         物理地址              类型
  10.0.0.3              00-0c-29-e0-dd-99     动态

五、keepalived故障:脑裂

脑裂故障原因

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

解决脑裂故障方案

  • 如果发生闹裂,则随机kill掉一台即可
  • 在备上编写检测脚本, 测试如果能ping通主并且备节点还有VIP的话则认为产生了列脑
[root@lb02 ~]# cat check_split_brain.sh
#!/bin/sh
vip=10.0.0.3
lb01_ip=10.0.0.5
while true;do
    ping -c 2 $lb01_ip &>/dev/null
    if [ $? -eq 0 -a `ip add|grep "$vip"|wc -l` -eq 1 ];then
        echo "ha is split brain.warning."
    else
        echo "ha is ok"
    fi
sleep 5
done

六、Keepalived结合Nginx

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

	Nginx默认监听在所有的IP地址上,VIP会飘到一台节点上,相当于那台nginx多了VIP这么一个网卡,所以可以访问到nginx所在机器
	但是…..如果nginx宕机,会导致用户请求失败,但是keepalived没有挂掉不会进行切换,所以需要编写一个脚本检测Nginx的存活状态,如果不存活则kill掉keepalive

如何配置?

抢占式:仅需在master配置即可

非抢占式:两台服务器都要配置

第一步:编写脚本
[root@lb01 ~]# cat check_web.sh 
#!/bin/bash
Nginx=`netstat -tanulp|grep 80|wc -l`

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

第二步:执行权限给脚本
[root@lb01 ~]# chmod +x check_web.sh

第三步:将脚本写入到角色为MASTER的keepalived配置文件中
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
global_defs {                   #全局配置
    router_id lb01              #标识身份->名称
}
vrrp_script check_web {			#配置脚本
    script "/root/check_web.sh"	
    interval 5
}
vrrp_instance VI_1 {
……
    track_script {
        check_web
    }
}

第四步:重启服务
[root@lb01 ~]# systemctl restart keepalived

七、实现keepalived双主架构

1.规划

假设我们有两套业务(WordPress和phpmyadmin),配置完keepalived后,我们发现,如果主lb01一直没有down机,那么另一台备lb02一直处于闲置状态,浪费资源;

为了节省合理运用资源,我们将做出如下规划

主机名 WordPress phpmyadmin
lb01 MASTER BACKUP
lb02 BACKUP MASTER

2.具体配置

具体配置如下:

#lb01配置
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
global_defs {                   #全局配置
    router_id lb01              #标识身份->名称
}
vrrp_script check_web {			#配置脚本
    script "/root/check_web.sh"	
    interval 5
}
vrrp_instance VI_1 {
    state MASTER                #标识角色状态
    interface ens33             #网卡绑定接口
    virtual_router_id 50        #虚拟路由id,每个实例定义块id不能相同!
    priority 150                #优先级
    advert_int 1                #监测间隔时间
    authentication {            #认证
        auth_type PASS          #认证方式
        auth_pass 1111          #认证密码
    }
    virtual_ipaddress {
        10.0.0.3/24 dev ens33 label ens33:1
    }
        track_script {			#引用脚本
        check_web
    }
}


vrrp_instance VI_2 {
    state BACKUP                #标识角色状态
    interface ens33             #网卡绑定接口
    virtual_router_id 51        #虚拟路由id,每个实例定义块id不能相同!
    priority 150                #优先级
    advert_int 1                #监测间隔时间
    authentication {            #认证
        auth_type PASS          #认证方式
        auth_pass 1111          #认证密码
    }
    virtual_ipaddress {
        10.0.0.2/24 dev ens33 label ens33:2
    }
}

------------------------------------------------------------
#lb02配置
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
global_defs {                   #全局配置
    router_id lb02              #标识身份->名称
}
vrrp_script check_web {			#配置脚本
    script "/root/check_web.sh"	
    interval 5
}
vrrp_instance VI_1 {
    state BACKUP                #标识角色状态
    interface ens33                 #网卡绑定接口
    virtual_router_id 50        #虚拟路由id
    priority 100                #优先级
    advert_int 1                #监测间隔时间
    authentication {            #认证
        auth_type PASS          #认证方式
        auth_pass 1111          #认证密码
    }
    virtual_ipaddress {
        10.0.0.3/24 dev ens33 label ens33:1
    }
}


vrrp_instance VI_2 {
    state MASTER                #标识角色状态
    interface ens33             #网卡绑定接口
    virtual_router_id 51        #虚拟路由id
    priority 150                #优先级
    advert_int 1                #监测间隔时间
    authentication {            #认证
        auth_type PASS          #认证方式
        auth_pass 1111          #认证密码
    }
    virtual_ipaddress {
        10.0.0.2/24 dev ens33 label ens33:2
    }
        track_script {			#引用脚本
        check_web
    }
}

3.配置区别

主机名 实例定义块 对应业务 角色状态 虚拟路由id virtual_ipaddress
lb01 vrrp_instance VI_1 WordPress主 MASTER 50 10.0.0.3/24 dev ens33 label ens33:1
lb01 vrrp_instance VI_2 phpmyadmin备 BACKUP 51 10.0.0.2/24 dev ens33 label ens33:2
lb02 vrrp_instance VI_1 WordPress备 MASTER 50 10.0.0.3/24 dev ens33 label ens33:1
lb02 vrrp_instance VI_2 phpmyadmin主 BACKUP 51 10.0.0.2/24 dev ens33 label ens33:2

4.检查

[root@lb01 ~]# ifconfig | grep -A 2 ens33:1:
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.3  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:0c:29:db:90:e8  txqueuelen 1000  (Ethernet)
[root@lb01 ~]# ifconfig | grep -A 2 ens33:2:
-----------------------------------------------------------------
[root@lb02 ~]# ifconfig | grep -A 2 ens33:1:
[root@lb02 ~]# ifconfig | grep -A 2 ens33:2:
ens33:2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.2  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:0c:29:e0:dd:99  txqueuelen 1000  (Ethernet)

5.Windows做本地解析模拟

10.0.0.2	php.dezyan.com
10.0.0.3	wp.dezyan.com

6.浏览器访问测试

访问php.dezyan.com---> F12查看来源应是10.0.0.2
访问wp.dezyan.com----> F12查看来源应是10.0.0.3
posted @ 2025-03-21 08:54  丁志岩  阅读(48)  评论(0)    收藏  举报