MySQL 高可用

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

目录

一、概述MySQL高可用

1. 什么是高可用性(High Availability, HA)?

2. MySQL 高可用常见方案

3. 高可用核心机制

4. 选型建议

注意事项

二、案例环境组成

MySQL 主主复制 + keepalived + HAProxy 的高可用负载均衡架构

三、案例架构实施搭建

1.  案例需求

2. 案例实现思路

 3. 搭建架构

(1)安装 MySQL 数据库;

(2)配置主主复制,MySQL互为主从

(3)部署haproxy (2台)

(4)在haproxy代理上安装keepalived(用来检测haproxy的状态)

(5)模拟故障并验证架构效果


一、概述MySQL高可用

1. 什么是高可用性(High Availability, HA)?

定义:高可用性指系统在面临硬件故障、软件错误或维护时,仍能持续提供服务的能力,目标是尽量减少停机时间(如达到 99.99% 的可用性,即全年停机时间不超过 52.6 分钟)。
核心目标

  • 故障自动恢复:快速检测故障并自动切换至备用节点。

  • 数据零丢失:确保故障切换时数据完整性。

  • 服务连续性:用户无感知的故障转移。

2. MySQL 高可用常见方案

以下是 MySQL 实现高可用的主流方案及其特点:

方案 原理 优点 缺点
主从复制 + MHA 基于异步/半同步主从复制,通过 MHA(Master High Availability)监控主库故障并自动切换从库为新主库。 简单易用,适合异步复制环境。 依赖脚本和外部工具,半同步可能延迟。
Galera Cluster 基于同步多主复制(Synchronous Multi-Master),所有节点数据实时同步。 强一致性,读写分离灵活。 网络延迟敏感,写入性能受节点数影响。
MySQL Group Replication MySQL 官方方案,基于 Paxos 协议实现多主集群,支持单主或多主模式。 原生支持,自动化故障转移。 配置复杂,对网络稳定性要求高。
InnoDB Cluster 基于 MySQL Group Replication + MySQL Shell + MySQL Router 的完整高可用套件。 官方集成,管理便捷。 依赖 MySQL 8.0+,资源消耗较高。
Proxy-based HA 通过中间件(如 ProxySQL、HAProxy)实现读写分离和故障转移。 对应用透明,灵活扩展。 中间件可能成为性能瓶颈。
云服务高可用 使用云厂商方案(如 AWS RDS Multi-AZ、阿里云高可用版)。 全托管,自动备份与恢复。
 
成本较高,依赖云平台。
 

3. 高可用核心机制

  1. 数据冗余

    • 主从复制(异步/半同步)保障数据多副本存储。

    • 同步复制(如 Galera)确保所有节点数据强一致。

  2. 故障检测与切换

    • 心跳机制:通过定期心跳包检测节点存活状态。

    • VIP/DNS 漂移:故障时虚拟 IP 或 DNS 指向新主库。

  3. 脑裂(Split-Brain)处理

    • 使用仲裁节点(如 MHA 的 Manager)或多数派投票(Paxos 协议)避免多主同时写入。

  4. 数据一致性保障

    • 半同步复制:主库提交事务前需至少一个从库确认接收。

    • 并行复制:解决单线程复制延迟问题(MySQL 5.7+)

4. 选型建议

  • 强一致性场景:选择 Galera Cluster 或 MySQL Group Replication。

  • 简单主从架构:主从复制 + MHA 或 Keepalived。

  • 云环境:优先使用云厂商托管方案(如 AWS RDS)。

  • 大规模集群:结合中间件(ProxySQL)与 Group Replication。

注意事项

  • 数据同步延迟:异步复制可能导致切换时数据丢失,需结合业务容忍度选择复制模式。

  • 监控与告警:实时监控节点状态、复制延迟、集群健康度。

  • 定期演练:模拟故障切换,验证高可用流程的有效性。

二、案例环境组成

MySQL 主主复制 + keepalived + HAProxy 的高可用负载均衡架构
  • MySQL 主主复制:两台 MySQL 实例互为主从,双向同步数据,均支持读写操作,提供冗余和扩展能力。

  • Keepalived:通过 VRRP 协议管理虚拟 IP(VIP),监控 MySQL 状态,故障时自动将 VIP 漂移至存活节点,确保服务地址不变。在这里用来检测HAPProxy的状态。

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

优势

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

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

  • 灵活扩展:可横向扩展 HAPProxy 或 MySQL 节点,支持动态调整负载均衡策略(如轮询、权重)。

  • 运维友好:基于开源工具,无厂商锁定,社区支持丰富,适合自建数据库集群。

三、案例架构实施搭建

1.  案例需求

本案例要求通过 MHA 监控 MySQL 数据库,在故障时进行自动切换,不影响业务。

2. 案例实现思路

(1)安装 MySQL 数据库;
(2)配置 MySQL 互为主从;
(3)安装 haproxy 软件并配置复制均衡;
(4)安装 keepalived 软件并配置故障转移;
(5)模拟 master 故障切换。

 3. 搭建架构

(1)安装 MySQL 数据库;

主页有关于MySQL的详细安装步骤

(2)配置主主复制,MySQL互为主从
#master1、2互为主从(操作一样)
vim /etc/my.cnf 
	log-bin=/usr/local/mysql/data/mysql-bin
	binlog-format=MIXED
	server-id=1/2
--重启MySQL	
systemctl restart mysqld

#创建用户,为从授权
create user 'myslave'@'%' identified by '123456';
grant replication slave on *.* to 'myslave'@'%';
alter user 'myslave'@'%' identified with mysql_native_password by '123456';

注意:identified with mysql_native_password   加密模块,保护密码

#刷新并查看主的状态信息
flush privileges;
show master status;  //看File和Position 

#两个主机互相连接主 (注意好不要填错IP和pos偏移量)
change master to master_host='192.168.10.101',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=1149;

#开启从同步
start slave; 
#查看从状态信息
show slave status\G

验证主主复制的同步:创建库
(3)部署haproxy (2台)
#关闭selinux和防火墙
sed -i 's/SELINUX=enforcing/SELINUX=disabled/'  /etc/selinux/config
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
#安装haproxy
dnf -y install haproxy
#编辑配置文件
vim /etc/haproxy/haproxy.cfg
global
    log             127.0.0.1 local2
    chroot          /var/lib/haproxy
    pidfile         /var/run/haproxy.pid
    user            haproxy
    group           haproxy
    daemon
    maxconn         4000

defaults
    mode            tcp      #改
    log             global
    option          tcplog	#改
    option          dontlognull
    retries         3
    timeout http-request 5s
    timeout queue   1m
    timeout connect 5s
    timeout client  1m
    timeout server  1m
    timeout http-keep-alive 5s
    timeout check   5s
    maxconn         3000

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 

#重启服务并检测文件配置
haproxy -c -f /etc/haproxy/haproxy.cfg
systemctl restart haproxy
(4)在haproxy代理上安装keepalived(用来检测haproxy的状态)
#关闭selinux和防火墙(做过不用)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/'  /etc/selinux/config
setenforce 0
systemctl stop firewalld
systemctl disable firewalld

#安装
dnf install -y keepalived

#编辑配置文件
注意:原本的那个是模板文件,需要拷贝一下
	cp /etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf

vim /etc/keepalived/keepalived.conf
	router_id  r1/r2
vrrp_instance  VI_1 {
		state BACKUP
		nopreempt     //优先级高的主机设置
		interface ens33
		priority 100   //优先级
	}
	注释掉vrrp_strict,删除virtual_ipaddress:区域配置完后面的内容

##2台配置不同,要注意router_id 设置不同,
vrrp_instance 实例(管理VIP的):
要注意两台都为备BACKUP(通过优先级自动选主);优先级修改成不同;优先高一台设置nopreempt(不抢占模式),防止优先级高的故障后还抢占另一台的主身份。
interface 网卡对应本机的网卡名;
virtual_ipaddress: 改成同网段的
注释掉vrrp_strict :严格模式,它会阻止VIP单播通信  #####

#添加监控脚本(测试haproxy的状态,故障后关闭haproxy,keepalived就把VIP漂到另一台)
vim /etc/keepalived/chk.sh
#!/bin/bash
#
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; 
then
	/etc/init.d/keepalived stop 或 systemctl stop keepalived 
fi
#重启keepalived
systemctl restart keepalived
#查看VIP(必须是一台有,一台没有)
ip add


#自动跑监控脚本
方一:创建计划任务,定期自动执行
方二:添加到keepalived的配置文件里(keepalived允许添加外部脚本到配置里)
添到示例上方:vrrp_script chk_haproxy {
		script "/etc/keepalived/chk.sh"
		interval 2
	}
添加到示例里面:
	track_script {
		chk_haproxy
	}
chmod +x  /etc/keepalived/chk.sh   //给脚本执行权限
systemctl restart keepalived


#客户端验证
用Vip连接MySQL
mysql -utest -p123456 -h192.168.10.100

#注意:客户端没有mysql的命令,可以用“yum -y install mysql”下载
(5)模拟故障并验证架构效果
#在服务器上创建测试账户test(只需创一次,另一台主会同步)
create user testt@'%' identified by '123456';
grant all on *.* to testt@'%';
alter user 'testt'@'%' identified with mysql_native_password by '123456';
flush privileges;

模拟故障:
1.关闭master1,测试HAProxy的效果,它具备健康检测功能,会自动切换
ping master1IP  //发现已离线
mysql -utest -p123456 -h192.168.10.100   //客户端验证是否能正常登录,正常登为正确
2.关闭keepalived,查看VIP漂移的效果
ip a    // mysql还是可以访问的

网站公告

今日签到

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