当前位置:

首页 > 编程开发 > 怎么掌握MySQL复制架构

怎么掌握MySQL复制架构

一主多从复制架构在实际应用场景中,MySQL复制90%以上都是一个Master复制到一个或者多个Slave的架构模式。在主库读取请求压力非常大的场景下,可以通过配置一主多从复制架构实现读写分离,把大量的对实时性要求不是特别高的读请求通过负载均衡分部到多个从库上(对于实时性要求很高的读请求可以让从主库去读),降低主库的读取压力,如下图所示。缺点:master不能停机,停机就不能接收写请求slave过多会出现延迟由于master需要进行常规维护停机了,那么必须要把一个slave提成master,选哪一个是一个

本文目录

    怎么掌握MySQL复制架构

    一主多从复制架构

    在实际应用场景中,MySQL复制90%以上都是一个Master复制到一个或者多个Slave的架构模式。

    在主库读取请求压力非常大的场景下,可以通过配置一主多从复制架构实现读写分离,把大量的对实时性要求不是特别高的读请求通过负载均衡分部到多个从库上(对于实时性要求很高的读请求可以让从主库去读),降低主库的读取压力,如下图所示。

    怎么掌握MySQL复制架构

    缺点:

    • master不能停机,停机就不能接收写请求

    • slave过多会出现延迟

    由于master需要进行常规维护停机了,那么必须要把一个slave提成master,选哪一个是一个问题?

    某一个slave提成master了,就存在当前master和之前的master数据不一致的情况,并且之前master并没有保存当前master节点的binlog文件和pos位置。

    多主复制架构

    多主复制架构解决了一主多从复制架构中master的单点故障问题。

    怎么掌握MySQL复制架构

    可以配合一个第三方的工具,比如keepalived轻松做到IP的漂移,这样master停机维护也不会影响写操作。

    级联复制架构

    一主多从中如果slave过多,会导致主库的I/O压力和网络压力会随着从库的增加而增长,因为每个从库都会在主库上有一个独立的BINLOG Dump线程来发送事件,而级联复制架构解决了一主多从场景下的,主库额外的I/O和网络压力。

    如下图所示。

    怎么掌握MySQL复制架构

    对比一主多从的架构,级联复制仅仅是从主库Master复制到少量的从库,其他从库再从这少量的从库中复制数据,这样就减轻了主库Master的压力。

    当然也有缺点:MySQL的传统复制是异步的,级联复制场景下主库的数据是经历两次复制才到达其他从库中,期间的延迟要比一主多从复制场景下只经历一次复制的还大。

    可以通过在二级slave上选择表引擎为BLACKHOLE来降低级联复制的延迟。顾名思义,BLACKHOLE引擎是一个“黑洞”引擎,写入BLACKHOLE表的数据并不会写会到磁盘上,BLACKHOLE表永远都是空表,INSERT、UPDATE、DELETE操作仅仅在BINLOG中记录事件。

    下面演示下BLACKHOLE引擎:

    mysql> CREATE TABLE `user` (
        -> `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
        -> `name` varchar(255) NOT NULL DEFAULT '',
        -> `age` tinyint unsigned NOT NULL DEFAULT 0
        -> )ENGINE=BLACKHOLE charset=utf8mb4;Query OK, 0 rows affected (0.00 sec)mysql> INSERT INTO `user` (`name`,`age`) values("itbsl", "26");Query OK, 1 row affected (0.00 sec)mysql> select * from user;Empty set (0.00 sec)

    可以看到,存储引擎为BLACKHOLE的user表里没有数据。

    多主与级联复制结合架构

    结合多主与级联复制架构,这样解决了单点master的问题,解决了slave级联延迟的问题。

    怎么掌握MySQL复制架构

    多主复制架构的搭建

    主机规划:

    • master1:docker,端口3314

    • master2:docker,端口3315

    master1的配置

    配置文件my.cnf:

    $ cat /home/mysql/docker-data/3315/conf/my.cnf
    [mysqld]
    character_set_server=utf8
    init_connect='SET NAMES utf8'
    
    symbolic-links=0
    
    lower_case_table_names=1
    server-id=1403314
    log-bin=mysql-bin
    binlog-format=ROW
    auto_increment_increment=2 # 几个主库,这里就配几
    auto_increment_offset=1 # 每个主库的偏移量需要不一致
    gtid_mode=ON
    enforce-gtid-consistency=true
    binlog-do-db=order      # 要同步的数据库

    启动docker:

    $ docker run --name mysql3314 -p 3314:3306 --privileged=true -ti -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=order -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/3314/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/3314/data/:/var/lib/mysql -v /home/mysql/docker-data/3314/logs/:/var/log/mysql -d mysql:5.7

    添加用于复制的用户并授权:

    mysql> GRANT REPLICATION SLAVE,FILE,REPLICATION CLIENT ON *.* TO 'repluser'@'%' IDENTIFIED BY '123456';
    Query OK, 0 rows affected, 1 warning (0.01 sec)
    
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.01 sec)

    开启同步master1(这里的user来自master2):

    mysql> change master to master_host='172.23.252.98',master_port=3315,master_user='repluser',master_password='123456',master_auto_position=1;
    Query OK, 0 rows affected, 2 warnings (0.03 sec)
    
    mysql> start slave;
    Query OK, 0 rows affected (0.00 sec)

    master2的配置

    master2的配置与master1类似。

    主要区别在于my.cnf中有一个属性需要不一致:

    auto_increment_offset=2 # 每个主库的偏移量需要不一致

    测试:

    在master2创建表,并添加数据:

    mysql> create table t_order(id int primary key auto_increment, name varchar(20));
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> insert into t_order(name) values("A");
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into t_order(name) values("B");
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from t_order;
    +----+------+
    | id | name |
    +----+------+
    |  2 | A    |
    |  4 | B    |
    +----+------+
    2 rows in set (0.00 sec)

    可以发现master2中id的步长为2,且从2开始自增。

    然后在master1查询数据,并添加:

    mysql> select * from t_order;
    +----+------+
    | id | name |
    +----+------+
    |  2 | A    |
    |  4 | B    |
    +----+------+
    2 rows in set (0.00 sec)
    
    mysql> insert into t_order(name) values("E");
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from t_order;
    +----+------+
    | id | name |
    +----+------+
    |  2 | A    |
    |  4 | B    |
    |  5 | E    |
    +----+------+
    3 rows in set (0.00 sec)

    可以发现master1中id的步长为2,且从1开始自增,再去master2中查询能发现id为5的数据,说明主主复制配置没有问题。

    为什么两个主中id自增的偏移量要不一致呢?当两个主同时接受到插入请求时就能保证id不冲突,其实这样只能保证插入数据不冲突,无法保证删除和修改导致的数据不一致。

    所以在实际的应用场景中,只能暴露一个主给客户端才能保证数据的一致性。

    MySQL高可用的搭建

    怎么掌握MySQL复制架构

    这里借助keepalived来对上面的多主复制架构改造来实现MySQL的高可用。

    keepalived的安装:

    $ sudo apt-get install -y keepalived

    keepalived.conf

    $ cat /etc/keepalived/keepalived3314.conf! Configuration File for keepalived#简单的头部,这里主要可以做邮件通知报警等的设置,此处就暂不配置了;global_defs {
            #notificationd LVS_DEVEL}#预先定义一个脚本,方便后面调用,也可以定义多个,方便选择;vrrp_script chk_haproxy {
        script "/etc/keepalived/chkmysql.sh"  #具体脚本路径
        interval 2  #脚本循环运行间隔}#VRRP虚拟路由冗余协议配置vrrp_instance VI_1 {   #VI_1 是自定义的名称;
        state BACKUP    #MASTER表示是一台主设备,BACKUP表示为备用设备【我们这里因为设置为开启不抢占,所以都设置为备用】
        nopreempt      #开启不抢占
        interface eth0   #指定VIP需要绑定的物理网卡
        virtual_router_id 11   #VRID虚拟路由标识,也叫做分组名称,该组内的设备需要相同
        priority 130   #定义这台设备的优先级 1-254;开启了不抢占,所以此处优先级必须高于另一台
    
        advert_int 1   #生存检测时的组播信息发送间隔,组内一致
        authentication {    #设置验证信息,组内一致
            auth_type PASS   #有PASS 和 AH 两种,常用 PASS
            auth_pass asd    #密码
        }
        virtual_ipaddress {
            172.23.252.200    #指定VIP地址,组内一致,可以设置多个IP
        }
        track_script {    #使用在这个域中使用预先定义的脚本,上面定义的
            chk_haproxy    }
    
        #notify_backup "/etc/init.d/haproxy restart"   #表示当切换到backup状态时,要执行的脚本
        #notify_fault "/etc/init.d/haproxy stop"     #故障时执行的脚本}

    /etc/keepalived/chkmysql.sh

    $ cat /etc/keepalived/chkmysql.s.sh#!/bin/bashmysql -uroot -proot -P 3314 -e "show status;" > /dev/null 2>&1if [ $? == 0 ];then
            echo "$host mysql login successfully"
            exit 0else
            echo "$host login failed"
            killall keepalived        exit 2fi
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 MySQL
    相关文章 更多
    navicat导入数据库步骤详解及常见问题处理教程
    navicat导入数据库步骤详解及常见问题处理教程

    详解Navicat导入数据库的标准步骤,涵盖SQL脚本执行与CSV数据导入两种核心场景。针对导入过程中常见的字符集乱码、主键冲突及外键约束错误,提供具体的设置方法与修复建议,确保数据迁移准确无误。

    SQL主键约束和唯一约束有什么区别
    SQL主键约束和唯一约束有什么区别

    深入理解SQL PRIMARY KEY与UNIQUE约束的区别。文章从行标识与重复限制的目标出发,详解主键的非空特性、外键引用角色以及多数据库对NULL值的处理差异。结合users表实战示例,指导开发者如何根据字段稳定性与业务语义合理选择约束类型,避免设计误区。

    SQL约束有哪些类型及作用
    SQL约束有哪些类型及作用

    刚开始设计关系型数据库?了解PRIMARY KEY、FOREIGN KEY、UNIQUE、NOT NULL、CHECK、DEFAULT等约束的作用、语法和排错方法。本文以PostgreSQL语法为主,结合用户订单场景,清晰展示如何防止脏数据并处理常见约束冲突。

    SQL游标常见错误排查:死锁与资源未释放问题
    SQL游标常见错误排查:死锁与资源未释放问题

    深入解析SQL游标导致的死锁与资源未释放问题。通过PostgreSQL与MySQL语法对比,展示如何识别长事务持锁、分析锁等待链,并提供短事务提交、异常清理及批量处理的最佳实践,确保数据库连接与锁资源及时释放。

    SQL中怎么创建和删除约束
    SQL中怎么创建和删除约束

    后端开发者在维护数据库时,常需对现有表添加主键、唯一或外键约束。若直接执行ADD CONSTRAINT,往往因存量数据不合规导致报错。本文详解操作前的数据清洗步骤、标准SQL语法及MySQL等特殊写法,帮助你在生产环境安全完成结构变更。

    SQL分组统计查询:GROUP BY与HAVING子句用法示例
    SQL分组统计查询:GROUP BY与HAVING子句用法示例

    针对 SQL 初学者的分组统计实战指南。深入解析 GROUP BY 分组机制、WHERE 与 HAVING 的执行时机差异,以及 COUNT 函数对 NULL 值的处理逻辑。通过具体代码示例演示如何正确筛选聚合结果,并排查因 JOIN 连接导致的统计数据异常,提升报表准确性。

    SQL Server与MySQL游标基本语法及完整代码示例
    SQL Server与MySQL游标基本语法及完整代码示例

    本文详细对比SQL Server和MySQL中游标的基本用法。从DECLARE声明到FETCH遍历,再到CLOSE关闭与DEALLOCATE/Handler清理,解析两者在语法结构、变量接收及异常处理上的核心差异。通过标准代码示例展示如何安全使用游标,避免资源泄漏,适用于需要进行数据库存储过程开发或跨平台迁移的开发者。

    SQL多表连接区别:INNER JOIN与LEFT JOIN的使用场景
    SQL多表连接区别:INNER JOIN与LEFT JOIN的使用场景

    深入解析SQL中INNER JOIN与LEFT JOIN的核心区别。通过users和orders表实例,展示匹配行保留与NULL补位机制,重点讲解ON与WHERE子句中放置右表过滤条件的不同后果,提供防止LEFT JOIN退化的实战技巧及行数异常排查步骤。

    SQL CHECK约束的用法与取值范围限制
    SQL CHECK约束的用法与取值范围限制

    深入理解 SQL CHECK 约束在 PostgreSQL、MySQL 等数据库中的实现差异。文章通过订单业务场景,讲解如何定义单列范围与多列逻辑约束,分析 NULL 值对布尔条件的影响,并提供修改已有表结构时的安全操作建议,帮助开发者构建更健壮的数据完整性防线。

    SQL外键约束怎么用及级联操作说明
    SQL外键约束怎么用及级联操作说明

    后端开发中,如何正确使用 SQL 外键约束来维护订单与明细表的关系?本文通过 PostgreSQL 示例,深入讲解外键的创建语法、插入顺序要求,以及 ON DELETE CASCADE、RESTRICT、SET NULL 等策略的实际影响与风险控制,助你构建健壮的数据库结构。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。