MySQL 高可用

发布于:2025-05-20 ⋅ 阅读:(17) ⋅ 点赞:(0)

目录

一、案例概述

1、案例前置知识点

(1)什么是MySQL 高可用

(2)方案组成

(3)优势

2、案例环境

二、案例实施

1、配置mysql 双主复制

(1)在/etc/my.cnf中添加下面内容(01、02)

(2)重启(01、02)

(3)登录MySQL程序,给从服务器授权(01、02)

(4)登录MySQL,配置同步

2、安装haproxy

(1)关闭SElinux和防火墙

(2)安装haproxy

(3)编辑haproxy 配置文件

(4)检测配置文件,并启动服务

(5)测试

3、安装keepalived

(1)安装keepalived(03、04)

(2)编辑haproxy配置文件

(3)编测试使用VIP 连接mysql

4、测试


一、案例概述

1、案例前置知识点

(1)什么是MySQL 高可用

MySQL 高可用(High Availability)是指通过冗余设计,确保数据库服务在单节点故障、网络中断或硬件损坏等异常情况下,仍能持续对外提供服务,同时保证数据一致性。其核心目标是实现“零停机、零数据丢失”的业务连续性。

(2)方案组成

MySQL 主主复制 +Keepalived + HAProxy 的高可用方案由三部分组成:

  • MySQL 主主复制:两台 MySQL 实例互为主从,双向同步数据,均支持读写操作,提供几余和扩展能力。
  • Keepalived:通过 VRRP 协议管理虚拟 IP(VIP),监控 MySQL 状态,故障时自动将 VIP 漂移至存活节点,确保服务地址不变。
  • HAProxy:作为反向代理和负载均衡器,将流量分发至MySQL节点,支持健康检查、读写分离(可选)和故障节点自动剔除。

(3)优势

  • 高可用性:Keepalived 实现秒级故障切换,HAProxy健康检查确保流量仅路由到正常节点,避免单点故障。
  • 读写扩展:主主架构支持双节点并发写入,提升写入性能;HAProxy可配置读写分离,利用备节点分担读压力。
  • 灵活扩展:可横向扩展HAProxy或MySQL 节点,支持动态调整负载均衡策略(如轮询、权重)。
  • 运维友好基于开源工具,无厂商锁定,社区支持丰富,适合自建数据库集群。

2、案例环境

主机

操作系统

IP

应用

Master1(01)

openEuler 24.03

192.168.10.101

Mysql8

Master2(02)

openEuler 24.03

192.168.10.102

Mysql8

Keepalived1(03)

openEuler 24.03

192.168.10.103

Keepalived、haproxy

Keepalived2(04)

openEuler 24.03

192.168.10.104

Keepalived、haproxy

客户端(05)

openEuler 24.03

192.168.10.105

mariadb

安装MySQL环境本文不再赘述

二、案例实施

1、配置mysql 双主复制

对于 MySQL 的主主架构,其实原理就是两台服务器01、02互为主从,双向复制

(1)在/etc/my.cnf中添加下面内容(01、02)

log-bin=/usr/local/mysql/data/mysql-bin
binlog-format=MIXED
server-id=1    #为mysq实例分配一个唯一的服务器标识符,01上是1,02上写2

(2)重启(01、02)

systemctl restart mysqld

(3)登录MySQL程序,给从服务器授权(01、02)

mysql -uroot -ppwd123

create user 'myslave'@'%' identified by '123456';
grant replication slave on *.* to 'myslave'@'%';
alter user 'myslave'@'%' identified with mysql_native_password by '123456';
flush privileges;

show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     1147 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

注意01、02的position值不一定一样 

(4)登录MySQL,配置同步

01

按02结果更改下面命令中 master_log_file 和 master_log_pos 参数。

mysql -uroot -ppwd123
change master to master_host='192.168.10.102',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=1147;

启动同步

start slave;
show slave status\G
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

确保这两行一定是两个yes

02

与在01上的操作一样,只有master_host和master_log_pos参数需要改动,根据01生成的Position值改动

change master to master_host='192.168.10.102',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=1148;

2、安装haproxy

HAProxy 是一个开源的高性能负载均衡器和代理工具,支持 TCP/HTTP 应用的流量分发,具备健康检查、SSL 终止、会话保持等功能,广泛应用于Web服务器集群、数据库读写分离及 API网关场景,以高效稳定的特性提升系统可用性和扩展能力。

该阶段操作在03、04上都是一样的操作

(1)关闭SElinux和防火墙

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

(2)安装haproxy

dnf install -y haproxy

(3)编辑haproxy 配置文件

vim /etc/haproxy/haprox.cfg
    mode                    tcp		#19
    option                  tcplog	#21
#33行以后的全部删除,然后添加以下内容
listen mysql
    bind 0.0.0.0:3306
    balance leastconn
    server mysql1 192.168.10.101:3306 check port 3306 maxconn 300
    server mysql2 192.168.10.102:3306 check port 3306 maxconn 300
  • mode tcp:表示tcp 代理
  • listen mysql 0.0.0.0:3306:表示创建一个名为 mysql 的监听服务
  • bind 0.0.0.0:3306:绑定到所有网卡的 3306 端口(MySQL 默认端口),作为流量入口。
  • balance leastconn:指定使用 最少连接数算法 分配请求,将新连接导向当前活跃连接最少的后端服务器,避免单点过载
  • Server声明两个MySQL服务器节点mysql1和mysql2,分别指向 192.168.10.101:3306和192.168.10.102:3306。
  • check port 3306表示通过检查节点的 3306端口是否响应,判其存活状态
  • maxconn 300:限制每个后端节点的最大并发连接数为300,防止节点被压垮

(4)检测配置文件,并启动服务

haproxy -c -f /etc/haproxy/haproxy.cfg
systemctl restart haproxy
netstat -anpt | grep haproxy

(5)测试

在01上创建test用户

mysql -uroot -ppwd123
create user test@'%' identified by '123456';
grant all on *.* to test@'%';
alter user 'test'@'%' identified with mysql_native_password by '123456';
flush privileges;

在客户机05上安装mariadb,访问haproxy的代理端口,用test用户登录mysql

dnf -y install mariadb
mysql -utest -p123456 -h192.168.10.103 -P3306

3、安装keepalived

Keepalived 是一个用于实现系统高可用性和负载均衡的工具,通过 VRRP(Virtual Router Redundancy Protocol)等协议管理虚拟 IP 地址,持续监测服务器健康状态,当主节点故障时自动将流量切换至备用节点,确保服务不中断,常用于数据库、Web 服务等集群环境,提升系统可靠性并简化故障恢复流程。

(1)安装keepalived(03、04)

dnf -y install keepalived

(2)编辑haproxy配置文件

03

cp /etc/keepalived//keepalived.conf.sample /etc/keepalived/keepalived.conf
vim /etc/keepalived/keepalived.conf
global_defs {
   router_id LVS_01

   #vrrp_strict
}

vrrp_scrip chk_haproxy {
    script "/root/chk.sh"
    interval 2
}

vrrp_instance VI_1 {
    state BACKUP
    nopreempt
    interface ens160
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.100
    }

    track_script {
	chk_haproxy 
    }

}

再往下的尽量全部删除

启用 nopreempt 的作用:
节点 A(优先级 100,配置 nopreempt)故障节点B成为 Master。
节点 A 恢复→ 不触发抢占,节点B继续作为 Master,VIP 不切换。
仅当节点 B 故障时,节点 A 才会重新成为 Master。

添加监控脚本并启动 keepalived

vim chk.sh
#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]
then 
        systemctl stop keepalived
fi
chmod +x chk.sh 
systemctl restart keepalived

04

cp /etc/keepalived//keepalived.conf.sample /etc/keepalived/keepalived.conf
vim /etc/keepalived/keepalived.conf
global_defs {
   router_id LVS_02
   #vrrp_strict
}

vrrp_scrip chk_haproxy {
    script "/root/chk.sh"
    interval 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens160
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.100
    }
    
    track_script {
	chk_haproxy
    }
}

与01差不多,下面多余的删除

vim chk.sh
#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]
then 
        systemctl stop keepalived
fi
chmod +x chk.sh 
systemctl restart keepalived

此处两台主机均配置为 BACKUP,因此哪台先运行 keepalived,VIP 就在哪台上。

本案例刚开始 VIP 运行在 keepalived1(03) 上

在 keepalived1 测试査看 VIP(注意査看 VIP 只能用 ip 命令,ifconfig 不显示VIP)

[root@localhost ~]# ip a

    inet 192.168.10.100/32 scope global ens160
       valid_lft forever preferred_lft forever

(3)编测试使用VIP 连接mysql

[root@localhost ~]# mysql -utest -p123456 -h192.168.10.100

4、测试

1.关闭 master1(01) 主机,测试使用 vip 能否正常访问 mysq1 数据库关闭 master1后,因为master1、master2 通过 haproxy 负载均衡,master1关闭后,haproxy 检测其状态异常,会从负载中移除,不进行流量转发,依然可以通过 vip 访问 mysql,实现 mysql 的高可用

2.接着关闭 keepalived1(03),测试使用 vip 能否正常访问 mysql 数据库关闭 keepalived1 后,keepalived 检测到主节点离线,VIP 192.168.10.100会漂移至 keepalived2 节点,在客户机(05)上mysql 依然可以访问


网站公告

今日签到

点亮在社区的每一天
去签到