MySQL高可用

1.什么是mysql高可用

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

2.方案组成:MySQL主主复制+Keepalived+HAProxy

**MySQL主主复制:**两台MySQL实例互为主从,双向同步数据,均支持读写操作。提供冗余和扩展能力

**Keepalived:**通过VRRP协议管理虚拟IP(VIP),监控MySQL状态,故障时自动将VIP漂移至存活节点,确保服务地址不变

**HAProxy:**作为反向代理和负载均衡器,将流量分发至MySQL节点,支持健康检查、读写分离(可选)和故障节点自动剔除

3.优势

**高可用性:**Keepalived实现秒级故障切换,HAProxy健康检查确保流量仅路由到正常节点,避免单点故障

**读写扩展:**主主架构支持双节点并发写入,提升写入性能;HAProxy可配置读写分离,利用备节点分担读压力灵活

**灵活扩展:**可横向扩展HAProxy或MySQL节点,支持动态调整负载均衡策略(如轮询、权重)运维友好基于开源工具,无厂商锁定,社区支持丰富,适合自建数据库集群

实验过程

1.安装MySQL数据库

数据库创建完成后登录上,创建测试用户,后续用来验证实验(master1、master2)

mysql -uroot -ppwd123

create user 'test'@'192.168.10.%' identified by '123456';

grant all on *.* to 'test'@'192.168.10.%';

alter user 'test'@'192.168.10.%' identified with mysql_native_password by '123456';

flush privileges;

2.配置mysql主主复制

(1)master1中:

vim /etc/my.cnf

log-bin=/usr/local/mysql/data/mysql-bin

binlog_format=MIXED

server-id=1

log-slave-updates=1

(2)master2中:

vim /etc/my.cnf

log-bin=/usr/local/mysql/data/mysql-bin

binlog_format=MIXED

server-id=2

log-slave-updates=1

(3)重启mysql服务,两台都执行

systemctl restart mysqld

(4)登录mysql程序,给从服务器授权,两台都执行

mysql -u root -ppwd123

create user 'myslave'@'192.168.10.%' identified by '123456';

grant replication slave on *.* to 'myslave'@'192.168.10.%';

alter user 'myslave'@'192.168.10.%' identified with mysql_native_password by '123456';

flush privileges;

(5)登录mysql,配置同步,两台都执行

master1:

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

start slave;

master2:

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

start slave;

3.安装haproxy

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

以下,两台keepalived都要执行

(1)关闭SELinux和防火墙

sed -i 's/SELINUX=enforcing/SELINUX=disabled/ /etc/selinux/config'

setenforce 0

systemctl disable firewalld

systemcrl stop firewalld

(2)安装haproxy

dnf install haproxy

(3)编辑haproxy配置文件

更改部分红色标注,两台配置相同

defaults tcp

option tcplog

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.101:3306 check port 3306 maxconn 30

注释:

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

(5)测试

使用测试用户test,访问haproxy的代理端口登录mysql

mysql -utest -p123456 -h192.168.10.103 -p3306

4.安装keepalived

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

以下过程两台keepalived都要执行

(1)关闭SELinux和防火墙

sed -i 's/SELINUX=enforcing/SELINUX=disabled' / root/selinux/config

setenforce 0

systemctl disable firewalld

systemctl stop firewalld

(2)安装keepalived

dnf install keepalived

(3)编辑haproxy配置文件

第一台keepalived1配置,红色标注为两台不同之处

cp /etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf

vim /etc/keepalived/keepalived.conf

global_defs {

router_id r1

}

vrrp_instance VI_1 {

state BACKUP

nopreempt

interface ens33

priority 100

启用nopreempt作用:

节点A(优先级100,配置nopreempt)故障,节点B成为Master

节点A恢复,不触发抢占,节点B继续作为Master,VIP不切换

仅当节点B故障时,节点A才会重新成为Master

添加监控脚本并启动keepalived

vim /etc/keepalived/chk.sh

#!/bin/bash

if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then

/etc/init.d/keepalived stop

fi

chmod +x /etc/keepalived/chk.sh

systemctl start keepalived

配置keepalived2,红色标注为两台不同之处

cp /etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf

vim /etc/keepalived/keepalived.conf

global_defs {

router_id r2

}

vrrp_instance VI_1 {

state BACKUP

interface ens33

priority 99

添加监控脚本并启动keepalived

vim /etc/keepalived/chk.sh

#!/bin/bash

if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then

/etc/init.d/keepalived stop

fi

chmod +x /etc/keepalived/chk.sh

systemctl start keepalived

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

在keepalived测试查看VIP(查看VIP只能使用ip命令,ifconfig不显示)

命令:ip -a

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

mysql -utest -p123456 -h192.168.10.100

5.测试故障转移

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

ping 192.168.10.101 #ping masterl 发现已离线

mysql -utest -p123456 -h192.168.10.100

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

ip a #vip 192.168.10.100 漂移至 keepalived

mysql -utest -p123456 -h192.168.10.100

相关推荐
20242817李臻1 小时前
20242817李臻-安全文件传输系统-项目验收
数据库·安全
行思理1 小时前
MongoDB慢查询临时开启方法讲解
数据库·mongodb
bbsh20992 小时前
WebFuture 升级提示“不能同时包含聚集KEY和大字段””的处理办法
数据库·sql·mysql·webfuture
霖檬ing2 小时前
Python——MySQL远程控制
开发语言·python·mysql
Zfox_6 小时前
Redis:Hash数据类型
服务器·数据库·redis·缓存·微服务·哈希算法
陈丹阳(滁州学院)8 小时前
若依添加添加监听容器配置(删除键,键过期)
数据库·oracle
远方16099 小时前
14-Oracle 23ai Vector Search 向量索引和混合索引-实操
数据库·ai·oracle
GUIQU.10 小时前
【Oracle】数据仓库
数据库·oracle
恰薯条的屑海鸥10 小时前
零基础在实践中学习网络安全-皮卡丘靶场(第十六期-SSRF模块)
数据库·学习·安全·web安全·渗透测试·网络安全学习
咖啡啡不加糖10 小时前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存