项目7 部署高可用集群任务

image

项目7 部署高可用集群任务

了解Keepalived高可用技术
掌握Keepalived高可用解决方案的基本实施方法
学会基于LVS和Keepalived实现高可用负载均衡
学会基于Haproxy和Keepalived实现高可用负载均衡
学会基于Keepalived部署高可用MySQL集群

7.1 部署基本的Keepalived高可用集群

任务说明

1、了解keepalived的功能和应用场景
2、理解Keepalived的工作机制
3、了解Keepalived的配置文件
4、学会部署主备架构的高可用集群
5、学会部署双主架构的高可用集群

知识引入

7.1.1 keepalived的功能和应用场景

功能:故障切换、健康检查

应用场景:高可用负载均衡、高可用web服务、高可用数据库服务、高可用邮件服务、高可用分布式服务、高可用Kubernetes集群

image

7.1.2 Keepalived的工作机制

•通过虚拟路由器(Virtual Router)避免单点故障。

•通过优先级机制确定主备节点。

•通过心跳机制实现状态监控和检测。

•Keepalived支持健康检查机制。

image

1、VIP(虚拟路由器的IP地址)

2、主备节点:VIP总是绑定主节点的

3、心跳机制:VRRP 包

4、健康检查:VRRP检查、LVS检查

7.1.3 Keepalived的配置文件

global_defs {
    router_id node-a
}

vrrp_instance VI_1 {		
    state MASTER 			
    interface ens160
    virtual_router_id 10		
    priority 110			
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass abc123
    }
    virtual_ipaddress {
        192.168.10.10		
    }
}

virtual_server 192.168.102.80 80{
        delay_loop 6
        lb_algo rr
        lb_kind NAT
        persistence_timeout 50
        protocol TCP
        real_server 192.168.25.34 80{
            weight 1
            notify_up "/etc/keepalived/notify.sh up"
            notify_down "/etc/keepalived/notify.sh down"
            TCP_CHECK {
                connect_ip  192.168.102.80
                connect_port 80
                bindto  192 .168.102.80
                bindto_port 80
                connect_timeout 10
                nb_get_retry 3
                delay_before_retry 3
            }                      
        }
    }

•配置文件的关键组成部分

定义全局参数的global_defs块
定义VRRP实例的vrrp_instance块。
a)state
b)interface
c)virtual_router_id
d)priority
e)authentication
f)virtual_ipaddress

定义虚拟服务器的virtual_server块

任务实现

7.0.1关闭防火墙和SE Linux

可以使用下面脚本一键关闭:

#!/bin/bash

# ============================================
# 关闭防火墙、SELinux 并重启系统
# 适用:CentOS 7 / RHEL 7 / Rocky Linux / AlmaLinux
# 用法:chmod +x disable_firewall_selinux.sh && sudo ./disable_firewall_selinux.sh
# ============================================

set -e

echo "=============================="
echo "开始关闭防火墙和 SELinux..."
echo "=============================="

# ---------- 1. 停止并禁用 firewalld ----------
echo "[1/4] 停止 firewalld 服务..."
systemctl stop firewalld 2>/dev/null || echo "  → firewalld 未运行或已停止"

echo "[2/4] 禁用 firewalld 开机自启..."
systemctl disable firewalld 2>/dev/null || echo "  → firewalld 已禁用"

# ---------- 2. 临时关闭 SELinux ----------
echo "[3/4] 临时关闭 SELinux(立即生效)..."
setenforce 0 2>/dev/null || echo "  → setenforce 失败,可能 SELinux 未安装"

# ---------- 3. 永久关闭 SELinux ----------
echo "[4/4] 修改 SELinux 配置文件,永久关闭..."
if grep -q "^SELINUX=" /etc/selinux/config; then
    sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
    echo "  → 已将 /etc/selinux/config 中的 SELINUX 改为 disabled"
else
    echo "  → /etc/selinux/config 中未找到 SELINUX= 行,跳过"
fi

echo ""
echo "=============================="
echo "配置完成!"
echo "=============================="
echo ""
echo "当前状态:"
echo "  firewalld: $(systemctl is-active firewalld 2>/dev/null || echo 'stopped')"
echo "  SELinux 临时: $(getenforce 2>/dev/null || echo 'N/A')"
echo "  SELinux 永久: $(grep ^SELINUX= /etc/selinux/config | cut -d= -f2)"
echo ""

# ---------- 4. 询问是否重启 ----------
read -p "⚠  是否立即重启系统以使 SELinux 完全生效?(y/n): " answer
case "$answer" in
    [yY]|[yY][eE][sS])
        echo "正在重启系统..."
        reboot
        ;;
    *)
        echo "跳过重启。注意:永久关闭 SELinux 需要重启后才能完全生效。"
        echo "你也可以稍后手动执行: sudo reboot"
        ;;
esac

7.0.2 更改主机名为自己的姓名

更改主节点与备用节点的主机名为"自己的姓名+A/B" ,如姓名为张三(zhangsan),则输入如下

#主节点
[root@localhost ~]# hostnamectl set-hostname zhangsanA
[root@localhost ~]# bash
[root@zhangsanA ~]#

#备用节点
[root@localhost ~]# hostnamectl set-hostname zhangsanB
[root@localhost ~]# bash
[root@zhangsanB ~]#

7.1.1部署Keepalived主备架构高可用集群

•集群规划

image

•安装Keepalived

#主节点与备用节点同时使用以下命令安装keepalived
dnf install keepalived

•编写Keepalived配置文件

主机点/etc/keepalived/keepalived.conf的文件内容:

! Configuration File for keepalived
global_defs {                           
   router_id centos-a
}

vrrp_instance VI_1 {                    
    state MASTER                     
    interface ens36                     
    virtual_router_id 10                
    priority 110                        
    advert_int 1                        
    authentication {                    
        auth_type PASS                  
        auth_pass abc123                
    }
    virtual_ipaddress {
		192.168.10.10
    }
}

备用节点 /etc/keepalived/keepalived.conf的文件内容:

! Configuration File for keepalived
global_defs {                           
   router_id centos-b
}

vrrp_instance VI_1 {                    
    state BACKUP                        
    interface ens36                     
    virtual_router_id 10                
    priority 90                        
    advert_int 1                        
    authentication {                    
        auth_type PASS                  
        auth_pass abc123                
    }
    virtual_ipaddress {
		192.168.10.10
		
    }
}

•测试高可用效果

①在centos-a服务器上查看VIP绑定情况,确认其为当前主节点。

#主节点
[root@zhangsanA ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:56:af:c3 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.10.11/24 brd 192.168.10.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 192.168.10.10/32 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe56:afc3/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

#备用节点
[root@zhangsanB ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:2a:8d:d2 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.10.12/24 brd 192.168.10.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe2a:8dd2/64 scope link noprefixroute
       valid_lft forever preferred_lft forever


主节点的priority =110,备用节点priority=90•编写Keepalived配置文件

image

image

②在外部客户端持续测试VIP的连通性。

物理机上测试发现如下,证明连通性没问题。

image
③停止centos-a服务器上的Keepalived服务以模拟故障。

#1、使用如下命令在主机点停止keepalived服务
systemctl stop keepalived

#2、在主节点查看ip情况
ip a
#返回结果不会包含VIP

④分别在centos-a和centos-b服务器上查看VIP,确认VIP已转移到centos-b服务器,完成故障转移。

image

image

⑤在外部客户端查看ping命令持续测试VIP的连通性,确认业务基本保持连续性,实现高可用性。

image
⑥启动centos-a服务器上的Keepalived服务以模拟故障恢复。

systemctl start keepalived

⑦分别在centos-a和centos-b服务器上查看VIP,确认VIP的分配情况。

image

image

7.1.2部署Keepalived双主机架构高可用集群

image

(1)修改节点A的Keepalived配置文件,设置VRRP多实例,每个实例有独立的虚拟路由器和VIP,运行在不同优先级下。

主节点的配置文件/etc/keepalived/keeplived.conf内容更改如下

! Configuration File for keepalived
global_defs {                           
   router_id centos-a
}
vrrp_instance VI_1 {                    
    state MASTER                     
    interface ens160                     
    virtual_router_id 10                
    priority 110                        
    advert_int 1                        
    authentication {                    
        auth_type PASS                  
        auth_pass abc123                
    }
    virtual_ipaddress {
		192.168.10.10
    }
}

vrrp_instance VI_2 {                    
    state BACKUP                     
    interface ens160                     
    virtual_router_id 20                
    priority 90                       
    advert_int 1                        
    authentication {                    
        auth_type PASS                  
        auth_pass abc1234              
    }
    virtual_ipaddress {
		192.168.10.20
    }
}

(2)修改节点B上的Keepalived配置文件,设置VRRP多实例,每个实例有独立的虚拟路由器和VIP,运行在不同优先级下。

! Configuration File for keepalived
global_defs {                           
   router_id centos-a
}
vrrp_instance VI_1 {                    
    state BACKUP                    
    interface ens160                     
    virtual_router_id 10                
    priority 90                       
    advert_int 1                        
    authentication {                    
        auth_type PASS                  
        auth_pass abc123                
    }
    virtual_ipaddress {
		192.168.10.10
    }
}

vrrp_instance VI_2 {                    
    state MASTER                    
    interface ens160                     
    virtual_router_id 20                
    priority 110                       
    advert_int 1                        
    authentication {                    
        auth_type PASS                  
        auth_pass abc1234                
    }
    virtual_ipaddress {  
		192.168.10.20
    }
}

(3)在两个节点上分别重启Keepalived服务。

systemctl restart keepalived

(4)在两个节点上查看VIP,确认两个VIP分别绑定在不同节点上,节点A绑定192.168.10.10,节点B绑定192.168.10.20。

image

image

(5)停止节点B上的Keepalived服务以模拟故障。

image

(6)在节点A上查看VIP,确认两个VIP都绑定在节点B上,完成故障转移。.

image

(7)启动节点B上的Keepalived服务以模拟故障恢复。

image

(8)在节点A上查看VIP,确认VIP 192.168.10.20重新回到节点B上。

image

7.2 基于LVS和keepalived实现高可用负载均衡

课前提问

任务说明

了解LVS与Keepalived的组合
了解Keepalived的LVS虚拟服务器配置
了解Keepalived的健康检查
学会部署高可用LVS负载均衡集群

知识引入

7.2.1 LVS与Keepalived的组合

image

7.2.2 Keepalived的LVS虚拟服务器配置

virtual_server 192.168.163.10 80 {              #定义一个虚拟服务器,监听
    delay_loop 6                                #表示检查间隔,单位为秒,表示每隔这个时间就会检查一次后端真实服务器的状态,这里设置为6表示每6秒检查一次
    lb_algo wrr                                 #表示负载均衡算法,这里设置为wrr表示加权轮询算法,表示根据后端真实服务器的权重来分配请求
    lb_kind DR                                  #表示负载均衡类型,这里设置为DR表示直接路由模式,表示客户端请求直接发送到后端真实服务器,而不是通过负载均衡器转发
    protocol TCP                                #表示负载均衡协议,这里设置为TCP表示使用TCP协议进行负载均衡

    real_server 192.168.163.12 80 {             #定义一个后端真实服务器,IP地址为192.168.163.12
        weight 1                                #表示权重,范围1到100,数值越大表示这个服务器的处理能力越强,在负载均衡时会分配更多的请求,这里设置为1表示这个服务器的处理能力一般
        notify_down "/etc/keepalived/notify_down.sh"   #表示当这个后端真实服务器不可用时会执行这个脚本,这里假设有一个notify_down.sh脚本,这个脚本可以用来发送通知或者执行其他操作
        notify_up "/etc/keepalived/notify_up.sh"       #表示当这个后端真实服务器恢复可用时会执行这个脚本,这里假设有一个notify_up.sh脚本,这个脚本可以用来发送通知或者执行其他操作
        HTTP_GET {                              #表示使用HTTP GET方法来检查后端真实服务器的状态,这里使用HTTP GET方法来检查服务器是否可用
            url {                               #表示URL配置块,表示检查的URL路径和状态码,这里设置为根路径/,并且期望返回状态码200表示服务器可用
                path /                      
                status_code 200                   
            }
            connect_timeout 3                   #表示连接超时时间,单位为秒,表示如果在这个时间内没有建立连接就认为检查失败,这里设置为3表示如果在3秒内没有建立连接就认为检查失败
            nb_get_retry 2          #表示HTTP GET请求的重试次数,表示如果第一次请求失败就会重试这个次数,这里设置为2表示如果第一次请求失败就会重试2次   
            delay_before_retry 2    #表示重试前的延迟时间,单位为秒,表示如果第一次请求失败就会等待这个时间再进行重试,这里设置为2表示如果第一次请求失败就会等待2秒再进行重试
        }   
    }

    real_server 192.168.163.13 80 {
        weight 1
        notify_down "/etc/keepalived/notify_down.sh"
        notify_up "/etc/keepalived/notify_up.sh"
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2    
        }   
    }   
}

7.2.3 Keepalived的健康检查

基于应用层检测Web服务器

HTTP_GET
SSL_GET
SMTP_CHECK
MISC_CHECK

•基于传输层检测其他基础服务

TCP_CHECK {
  connect_ip <IPADDR >  # 要进行健康检查的目标IP地址
  connect_port <PORT>  # 要进行健康检查的目标端口
  bindto <IP ADDRESS>  # 发出健康检查请求时使用的源地址
  bind_port <PORT>      # 发出健康检查请求时使用的源端口
  connect_timeout <INTEGER>     # 连接超时时间
}

任务实现

任务7.2.0 关闭防火墙和SELinux 更改主机名

参照7.0.1与7.0.2

任务7.2.1  规划高可用LVS负载均衡集群

•针对项目4中LVS负载均衡集群单点故障问题,采用Keepalived部署主备负载均衡器,实现故障自动切换,确保服务连续性。

即保持VRRP一组,删掉之前的VRRP实例二组

•本实验采用LVS DR模式实现Web负载均衡,实验环境模拟生产环境,通过静态路由绑定、心跳线连接等提高稳定性和可靠性。(关于心跳线,书中的配置是错误的,要仿造下面的方式去配置)

global_defs {
   router_id centos-a
}

vrrp_instance VI_1 {
    state MASTER
    interface ens224
    virtual_router_id 10
    priority 110
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass abc123
    }
    virtual_ipaddress {
        192.168.10.10 dev ens160
    }
}

•增加centos-d服务器作为备用负载均衡器,主备负载均衡器配置两块网卡,运行CentOS Stream 9,真实服务器需配置VIP以直接回传数据给客户端。

image

任务7.2.2  部署高可用LVS负载均衡集群

•配置真实服务器

①给真实服务器的环回接口lo配置一个VIP,该IP与负载均衡器VIP相同,只是子网掩码不同。

[root@zhangsanB ~]# nmcli connection add con-name "lo-1" ifname lo type loopback ip4 192.168.10.10/32
连接 "lo-1" (794240d2-3498-4990-aaaa-71e565ba24d1) 已成功添加。
[root@zhangsanB ~]# nmcli connection up lo-1
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
[root@zhangsanB ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 192.168.10.10/32 scope global lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:92:13:e9 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.10.12/24 brd 192.168.10.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe92:13e9/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

②关闭ARP转发以防止发起广播,在两台真实服务器上都需要同样的操作。

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

[root@zhangsanB ~]# vim /etc/sysctl.conf
[root@zhangsanB ~]# sysctl -p
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

③部署测试用的Web网站。

[root@zhangsanB ~]# dnf install httpd
[root@zhangsanB ~]# echo "Welecome to my ZhangSanSite-B 01!" > /var/www/html/index.html
[root@zhangsanB ~]#  systemctl start httpd
[root@zhangsanB woshixuesheng]# curl localhost
Welecome to my ZhangSanSite-B 01!

•配置主负载均衡器

①配置双网卡,ens160为内网接口,ens224为心跳线专网接口。

输入nmtui命令后选择编辑连接-->添加-->以太网-->配置集名称(输入ens224)-->确认-->返回-->确认

#主负载均很节点
[root@zhangsanA ~]# nmtui
[root@zhangsanA ~]# nmcli connection show
NAME    UUID                                  TYPE      DEVICE
ens160  916ee6e0-f8af-35ae-b4b9-987c98de40a3  ethernet  ens160
ens224  76a7adfe-3c42-4a94-acce-612e3ef57616  ethernet  ens224
lo      c641d2d2-c0f8-43a8-803c-e31367c09829  loopback  lo
[root@zhangsanA ~]# nmcli connection modify ens224 ipv4.method manual ipv4.addresses 192.168.0.11/24 ipv4.gateway 192.168.0.1
[root@zhangsanA ~]# nmcli connection up ens224
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
[root@zhangsanA ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:56:af:c3 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.10.11/24 brd 192.168.10.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe56:afc3/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:56:af:cd brd ff:ff:ff:ff:ff:ff
    altname enp19s0
    inet 192.168.0.11/24 brd 192.168.0.255 scope global noprefixroute ens224
       valid_lft forever preferred_lft forever
    inet6 fe80::a4f3:6ab5:9a06:f20d/64 scope link noprefixroute
       valid_lft forever preferred_lft forever


#备用负载均很节点
[root@zhangsanD ~]# nmtui
[root@zhangsanD ~]# nmcli connection show
NAME    UUID                                  TYPE      DEVICE
ens160  916ee6e0-f8af-35ae-b4b9-987c98de40a3  ethernet  ens160
ens224  30923a64-421c-48b1-9f3e-767b8f42ba33  ethernet  ens224
lo      559a32d3-7de8-49f7-bd42-d2757aff188c  loopback  lo
[root@zhangsanD ~]#  nmcli connection modify ens224 ipv4.method manual ipv4.addresses 192.168.0.81/24 ipv4.gateway 192.168.0.1
[root@zhangsanD ~]# nmcli connection up ens224
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/5)
[root@zhangsanD ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:2a:8d:d2 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.10.81/24 brd 192.168.10.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 192.168.10.10/32 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe2a:8dd2/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:2a:8d:dc brd ff:ff:ff:ff:ff:ff
    altname enp19s0
    inet 192.168.0.81/24 brd 192.168.0.255 scope global noprefixroute ens224
       valid_lft forever preferred_lft forever
    inet6 fe80::360b:c85f:c779:17ae/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

②安装LVS管理工具ipvsadm,若之前使用过则需清空现有配置并停止服务。

dnf install ipvsadm

③安装Keepalived。

dnf install keepalived

④编写Keepalived配置文件,设置global_defs和vrrp_instance,定义虚拟服务器及其调度算法、工作模式、真实服务器等参数。(不支持行尾注释,使用时要删除)

virtual_server 192.168.10.10 80 {	# 定义虚拟服务器
    delay_loop 6
    lb_algo wrr					# LVS负载均衡算法为加权轮询
    lb_kind DR					# LVS工作模式为DR
    protocol TCP
    real_server 192.168.10.12 80 {	# 真实服务器
        weight 1
        HTTP_GET { 				# 检测真实服务器监控状态的方法
            url {					# 定义要监控的URL
              path /				# URL路径
              status_code 200		# 判断健康状态的响应码,一般为 200
            }
            connect_timeout 3		# 连接超时时长
            nb_get_retry 2		# 重试次数
            delay_before_retry 2	# 重试之前的延迟时长
        }
    }
    real_server 192.168.10.13 80 {	# 真实服务器
        weight 1 
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }
}

⑤启动Keepalived服务并设置为开机自启。

 systemctl enable --now keepalived

⑥查看分配的VIP,确认其由Keepalived动态分配。

[root@zhangsanA ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:56:af:c3 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.10.11/24 brd 192.168.10.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 192.168.10.10/32 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe56:afc3/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

⑦查看当前的LVS配置规则。

[root@zhangsanD ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.10:80 wrr
  -> 192.168.10.12:80             Route   1      0          10
  -> 192.168.10.13:80             Route   1      0          10

•配置备用负载均衡器

双网卡配置的IP地址不同。
Keepalived配置文件的内容不同之处主要是全局配置的router_id参数、VRRP配置模块中的state和priority两个参数。

! Configuration File for keepalived
global_defs {
   router_id centos-b
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens224
    virtual_router_id 10
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass abc123
    }
    virtual_ipaddress {
        192.168.10.10 dev ens160
    }
}
virtual_server 192.168.10.10 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    protocol TCP
    real_server 192.168.10.12 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }
    real_server 192.168.10.13 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }
}

任务7.2.3  测试高可用LVS负载均衡集群

•测试负载均衡效果

image

image

•测试高可用效果

①在主负载均衡器centos-a上停止Keepalived服务,模拟故障。

[root@zhangsanA ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:56:af:c3 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.10.11/24 brd 192.168.10.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 192.168.10.10/32 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe56:afc3/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:56:af:cd brd ff:ff:ff:ff:ff:ff
    altname enp19s0
    inet 192.168.0.11/24 brd 192.168.0.255 scope global noprefixroute ens224
       valid_lft forever preferred_lft forever
    inet6 fe80::a4f3:6ab5:9a06:f20d/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
[root@zhangsanA ~]# systemctl stop keepalived.service
[root@zhangsanA ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:56:af:c3 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.10.11/24 brd 192.168.10.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe56:afc3/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:56:af:cd brd ff:ff:ff:ff:ff:ff
    altname enp19s0
    inet 192.168.0.11/24 brd 192.168.0.255 scope global noprefixroute ens224
       valid_lft forever preferred_lft forever
    inet6 fe80::a4f3:6ab5:9a06:f20d/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

②在备用负载均衡器centos-d上查看VIP,确认其获得VIP并升级为主负载均衡器。

[root@zhangsanD ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:2a:8d:d2 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.10.81/24 brd 192.168.10.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe2a:8dd2/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:2a:8d:dc brd ff:ff:ff:ff:ff:ff
    altname enp19s0
    inet 192.168.0.81/24 brd 192.168.0.255 scope global noprefixroute ens224
       valid_lft forever preferred_lft forever
    inet6 fe80::360b:c85f:c779:17ae/64 scope link noprefixroute
       valid_lft forever preferred_lft forever


[root@zhangsanD ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:2a:8d:d2 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.10.81/24 brd 192.168.10.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 192.168.10.10/32 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe2a:8dd2/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:2a:8d:dc brd ff:ff:ff:ff:ff:ff
    altname enp19s0
    inet 192.168.0.81/24 brd 192.168.0.255 scope global noprefixroute ens224
       valid_lft forever preferred_lft forever
    inet6 fe80::360b:c85f:c779:17ae/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

③通过外部客户端访问VIP,测试负载均衡是否正常工作,确认请求可交替分配到后端服务器。

这里用物理机去访问

image

④在centos-d服务器上使用Shell语句访问Web服务,进一步测试负载均衡功能。

⑤在原主负载均衡器centos-a上启动Keepalived服务,模拟故障恢复,确认其重新获得VIP。

•测试真实服务器的故障转移

①在centos-b服务器上停止Web服务,模拟故障。

②查看LVS配置规则,确认centos-b服务器被动态删除。

③访问负载均衡器VIP,确认流量仅来自centos-b服务器。

④在备用负载均衡器centos-d上执行Shell语句,测试负载均衡功能。

⑤在centos-b服务器上恢复Web服务,模拟故障恢复。

⑥查看LVS配置规则,确认centos-b服务器被动态添加,负载均衡服务恢复正常。

7.3 基于HAProxy和keepalived实现高可用负载均衡

课前提问

任务说明

了解HAProxy软件
了解VRRP脚本
学会组合使用HAProxy和Keepalived实现高可用负载均衡
掌握双主架构的高可用负载均衡集群实现方法

知识引入

7.3.1 HAProxy概述

•HAProxy的主要特性

HAProxy可以在不同的网络层级工作,以满足不同的需求。
能够处理数以百万计的并发连接,同时保持低延迟和高吞吐量。
支持多种负载均衡算法。
提供主动健康检查功能。

•HAProxy的配置作为反向代理,可以隐藏后端服务器的身份和特征,为客户端提供单一入口。

image

•VRRP脚本定义

vrrp_script <脚本名> {                           # 定义一个检查脚本
     script <STRING>|<QUOTED-STRING>    # 指定要执行的Shell命令或脚本路径
     interval <INTEGER>                       # 脚本执行间隔时间,单位为秒,默认1秒
     timeout <INTEGER>                   # 脚本执行超时时间,超时后没有返回结果,会被视为脚本执行失败
     weight <INTEGER:-254..254>              # 调整权重值,默认为0
     fall <INTEGER>                             # 脚本执行连续失败指定次数后,节点状态被标记为失败
     rise <INTEGER>                            # 脚本执行连续成功指定次数后,节点状态被标记为成功
     user USERNAME [GROUPNAME]          # 执行检查脚本的用户或组
     init_fail                                     # 设置脚本的初始状态为失败,检查成功之后再转为成功状态
}

•VRRP脚本调用

track_script {
   VRRP脚本名称
}

任务实现

任务7.3.1  部署主备架构的高可用HAProxy负载均衡集群

•集群规划

image

•配置后端服务器

①将手动绑定的VIP的删除。
②取消关闭ARP转发以防止发起广播,在两台服务器上需要同样的操作。
③测试用的Web网站沿用任务7.2的网站部署。分别访问本地Web服务进行测试。

•配置主负载均衡器

①确认服务器配置有双网卡且已安装Keepalived软件。

②安装HAProxy。

③修改HAProxy配置文件/etc/haproxy/haproxy.cfg,备份后删除默认frontend和backend配置块,添加listen配置块,设置监听VIP及后端服务器健康检查。

④启动HAProxy服务。

⑤编写HAProxy服务检测Shell脚本 /etc/keepalived/check_haproxy.sh,内容为判断HAProxy服务是否运行。

⑥为检测脚本赋予执行权限。

⑦编写Keepalived配置文件,定义VRRP脚本检查HAProxy状态,配置VRRP实例绑定VIP,设置跟踪脚本。

⑧重新启动Keepalived服务。

•配置备用负载均衡器

配置步骤与主负载均衡器基本相同,仅有Keepalived配置文件不同。

global_defs {
    router_id haproxy-s
}
vrrp_instance VI_1 {
    state BACKUP
    ......
    priority 90
}

•测试负载均衡功能

①通过访问VIP来测试HAProxy负载均衡是否正常工作。

②执行Shell语句访问Web服务来进一步测试负载均衡器功能。

# for i in {1..10};do curl 192.168.10.10;done
 Welcome to real server 02!
 Welcome to real server 01!
    ......
 Welcome to real server 02!
 Welcome to real server 01!

•测试高可用效果

①在centos-a服务器上停止HAProxy服务,模拟故障。
②在centos-d服务器上查看VIP,确认其获得VIP并继续提供服务。
③在centos-a服务器上重新启动HAProxy服务,模拟故障恢复。
④查看VIP,确认其转移回centos-a服务器,继续作为主节点提供服务

任务7.3.2  部署双主架构的高可用HAProxy负载均衡集群

•集群规划

image

•配置后端服务器

①修改 Apache配置文件,添加8080端口监听和虚拟主机配置。

②创建网站目录并添加测试网页。

③重启 Apache服务。

④测试新增网站的访问。

•修改Haproxy配置

listen webserver8080
    bind *:8080
    server web1 192.168.10.12:8080 check
    server web2 192.168.10.13:8080 check 

•修改Keepalived配置

在负载均衡器A上修改Keepalived配置文件,在其中添加一个VRRP实例定义,此实例负责另一个VIP(192.168.10.20)的业务,且角色为备用节点。
在负载均衡器B上修改Keepalived配置文件,在其中添加一个VRRP实例定义,此实例负责另一个VIP(192.168.10.20)的业务,且角色为主节点。

•测试负载均衡功能

# for i in {1..10};do curl 192.168.10.10;done
 Welcome to real server 02!
 Welcome to real server 01!
    ......
 Welcome to real server 02!
 Welcome to real server 01!
# for i in {1..10};do curl 192.168.10.20;done
 Welcome to real server 02 8080!
 Welcome to real server 01 8080!
    ......
 Welcome to real server 02 8080!
 Welcome to real server 01 8080!


•测试高可用功能

①在 centos-a服务器上停止HAProxy 服务。

②切换到 centos-d服务器,查看VIP绑定情况:

ip a | grep 192.168.10.10
ip a | grep 192.168.10.20

③在 centos-a服务器上再次启动HAProxy 服务。

④在 centos-a和centos-d服务器上查看VIP分配情况:

centos-a:ip a | grep 192.168.10.10
centos-d:ip a | grep 192.168.10.20

7.4 基于keepalived部署高可用MySQL集群

课前提问

任务说明

了解Keepalived的MySQL高可用性解决方案
了解Keepalived的非抢占模式
学会部署双主架构模式的MySQL主从复制集群
学会基于Keepalived实现MySQL的高可用性

知识引入

7.4.1 MySQL高可用解决方案

•MySQL InnoDBCluster

•MySQL NDB Cluster

•MHA(Master High Availability)

•数据库中间件

•Keepalived

7.4.2 基于Keepalived的MySQL高可用解决方案

image

7.4.3 Keepalived的非抢占模式

•抢占模式(默认)

高优先级节点故障恢复后会重新抢占主节点角色,VIP迁回。
适用于节点性能相同且允许VIP频繁转移的场景,但可能造成网络抖动。

•非抢占模式(使用 nopreempt 参数)

高优先级节点恢复后不会抢占低优先级节点的主节点角色。
确保服务持续性和稳定性,避免VIP频繁切换。
配置时需将同一VRRP组内各节点的state参数均设为备用节点。

7.4.4 进一步了解双主复制架构的MySQL主从复制

•架构特点

w双主复制:两节点互为主从,数据双向同步,与普通主从模式单向同步不同。

•防冲突机制

w为防自增长字段冲突,设置不同自增步长。

w故障时部分二进制日志未复制,新写入数据自增字段会冲突。

•配置参数

wauto-increment-increment:自增步长,双主设为2。

wauto_increment_offset:自增起点,双主分别设1和2。

•数据同步

w服务器A序列:1、3、5、7、9、11.......

w服务器B序列:2、4、6、8、10、12......

任务实现

任务7.4.1  规划基于Keepalived的MySQL高可用集群

image

任务7.4.2  配置双主复制架构的MySQL主从复制

image

•将两台MySQL服务器分别配置为主服务器

①修改服务器A的MySQL配置文件。

server-id=1                      # 设置MySQL服务器实例的唯一标识符
gtid_mode=ON:启用GTID模式
enforce_gtid_consistency=ON:强制GTID一致性
auto-increment-increment=2:自增步长为2
auto-increment-offset=1:自增起点为1

②重启服务器A的MySQL服务。

③修改服务器B的MySQL配置文件。

server-id=2:设置服务器唯一标识符
gtid_mode=ON:启用GTID模式
enforce_gtid_consistency=ON:强制GTID一致性
auto-increment-increment=2:自增步长为2
auto-increment-offset=2:自增起点为2

④重启服务器B的MySQL服务。

•将两台服务器分别配置为对方的从服务器

①确认在服务器A上创建有MySQL主从复制用户账户并进行授权。

②在服务器B上使用MySQL客户端以root用户连接该服务器并执行以下操作。

mysql> STOP SLAVE;               # 停止复制进程
mysql> CHANGE MASTER TO MASTER_HOST='192.168.10.11', MASTER_USER='rep', MASTER_PASSWORD='abc123', MASTER_AUTO_POSITION=1,GET_MASTER_PUBLIC_KEY=1;# 连接主服务器的参数
mysql> START SLAVE;              # 启动复制进程

③在服务器A上使用MySQL客户端以root用户连接该服务器,然后执行基本相同的操作。

mysql> CHANGE MASTER TO MASTER_HOST='192.168.10.12', MASTER_USER='rep', MASTER_PASSWORD='abc123', MASTER_AUTO_POSITION=1,GET_MASTER_PUBLIC_KEY=1;

•测试互为主从关系的双主复制

(1)在服务器A上使用MySQL客户端以root用户连接该服务器。

mysql> CREATE TABLE test_db.test001(id INT NOT NULL AUTO_INCREMENT,name VARCHAR(100), PRIMARY KEY (id));     # 创建测试用的表,其中主键id为自增字段
mysql> INSERT INTO test_db.test001(name) VALUES ('ZHANG');  # 添加记录
mysql> INSERT INTO test_db.test001(name) VALUES ('LISI');

(2)在服务器B上使用MySQL客户端以root用户连接该服务器。

mysql> CHANGE MASTER TO MASTER_HOST='192.168.10.12', MASTER_USER='rep', MASTER_PASSWORD='abc123', MASTER_AUTO_POSITION=1,GET_MASTER_PUBLIC_KEY=1;

(3)在服务器B上继续执行以下命令增加新的记录。

mysql> INSERT INTO test_db.test001(name) VALUES ('LAOW');
mysql> INSERT INTO test_db.test001(name) VALUES ('XIAOAI');

(4)切换到服务器A上,然后执行以下命令

mysql> SELECT * FROM test_db.test001;

任务7.4.3  使用Keepalived实现MySQL双机的高可用

image

•编写检测脚本

#!/bin/bash
# 检查MySQL服务是否在运行
mysql_status=$(systemctl is-active mysqld)
if [ "$mysql_status" = "active" ]; then
    exit 0  # MySQL服务正常
else
    exit 1  # MySQL服务异常
fi

•配置Keepalived

•centos-a 服务器(节点A)配置:Keepalived配置文件

Ø全局配置:router\_id mysql-a

Ø检测脚本:vrrp\_script check\_mysql:执行/etc/keepalived/check\_mysql.sh,每1秒监控一次,其他参数默认

ØVRRP 实例:

state BACKUP:初始状态为备用节点
interface ens160:心跳接口
virtual_router_id 10:虚拟路由器 ID
priority 110:优先级
nopreempt:不抢占控制权
身份验证:auth_type PASS,密码abc123
虚拟 IP:192.168.10.10
跟踪脚本:check_mysql

•配置Keepalived

•centos-b 服务器(节点B)配置:Keepalived配置文件

Ø全局配置:​router\_id mysql-b

ØVRRP 实例:​priority 90:优先级低于节点 A

•运行机制

两节点state均设为BACKUP,正常运行时根据优先级选举主节点(初始为主节点A)。
主节点故障后,备用节点 B 升级为主节点。
节点 A 恢复正常后,因设置了nopreempt,不会抢占主节点角色,除非节点B故障。
节点 B 优先级低,故障恢复后也不会抢占主节点角色。

•测试故障转移

①查看 centos-a服务器上的VIP,确认当前主节点。
②在 centos-c服务器上使用MySQL客户端远程连接VIP,添加记录。
③停止 centos-a服务器上的Keepalived服务,模拟节点故障。
④在 MySQL客户端中尝试添加记录,观察连接情况。
⑤查看 centos-b服务器上的VIP,确认主节点已转移。
⑥启动 centos-a服务器上的Keepalived服务,模拟故障恢复。
⑦稍等后查看 centos-a服务器上的VIP,确认不抢占策略生效。
⑧停止 centos-b服务器上的MySQL服务,模拟MySQL故障。
⑨查看 centos-a服务器上的VIP,确认已转移回来。
⑩启动 centos-b服务器上的MySQL服务,模拟故障恢复。
⑪稍等后查看 centos-a服务器上的VIP,确认优先级高的节点保持主节点角色。

任务7.4.4  在高可用集群中加入MySQL从服务器

(1)确认已经安装MySQL服务器,MySQL配置文件:

server-id=3                      # 设置MySQL服务器实例的唯一标识符
read-only=ON                    # 设置只读模式
gtid_mode=ON                   # 启用GTID模式
enforce_gtid_consistency=ON     # 强制要求GTID一致性的事务提交

(2)执行systemctlrestart mysqld 命令重启MySQL服务以应用配置更改。

(3)使用MySQL客户端以root用户连接该服务器,然后依次执行以下命令。

mysql> STOP SLAVE;               # 停止复制进程
mysql> CHANGE MASTER TO MASTER_HOST='192.168.10.10', MASTER_USER='rep', MASTER_PASSWORD='abc123', MASTER_AUTO_POSITION=1,GET_MASTER_PUBLIC_KEY=1;
    # 连接主服务器的参数
mysql> START SLAVE;              # 启动复制进程

(4)测试MySQL从服务器。

项目实训

posted @ 2026-06-28 17:24  云梦花溪,王者武库  阅读(10)  评论(1)    收藏  举报