MySQL 高可用

06-01 1238阅读

目录

一、概述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 ReplicationMySQL 官方方案,基于 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)确保所有节点数据强一致。

      • 故障检测与切换:

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

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

        • 脑裂(Split-Brain)处理:

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

          • 数据一致性保障:

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

            • 并行复制:解决单线程复制延迟问题(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 节点,支持动态调整负载均衡策略(如轮询、权重)。

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

            三、案例架构实施搭建

            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还是可以访问的
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码