怎么掌握MySQL复制架构

怎么掌握mysql复制架构

一主多从复制架构

在实际应用中,MySQL复制的架构模式大多数都是将一个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的传统复制是异步的,级联复制场景下主库的数据是经历两次复制才到达其他从库中,期间的延迟要比一主多从复制场景下只经历一次复制的还大。

通过在二级从库上选择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复制架构

多主复制架构的搭建

主机规划:

即构数智人 即构数智人

即构数智人是由即构科技推出的AI虚拟数字人视频创作平台,支持数字人形象定制、短视频创作、数字人直播等。

即构数智人 36 查看详情 即构数智人

master1:docker,端口3314

master2:docker,端口3315

master1的配置

配置文件my.cnf:

$ cat /home/mysql/docker-data/3315/conf/my.cnf[mysqld]character_set_server=utf8init_connect='SET NAMES utf8'symbolic-links=0lower_case_table_names=1server-id=1403314log-bin=mysql-binbinlog-format=ROWauto_increment_increment=2 # 几个主库,这里就配几auto_increment_offset=1 # 每个主库的偏移量需要不一致gtid_mode=ONenforce-gtid-consistency=truebinlog-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

以上就是怎么掌握MySQL复制架构的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/266381.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
剑侠情缘零休闲玩法怎么样  剑侠情缘零休闲玩法介绍
上一篇 2026年10月13日 02:44:44
composer的”package-events”(如pre-package-install)和”command-events”有什么区别?
下一篇 2025年11月28日 03:57:36

相关推荐

  • docker mysql容器怎么开启慢查询日志

    docker mysql容器怎么开启慢查询日志docker mysql容器怎么开启慢查询日志docker mysql容器怎么开启慢查询日志docker mysql容器怎么开启慢查询日志

    1、进入容器 登陆账号 docker 查看 运行的容器 docker ps 进入容器: docker exec -it dc8880c13fef /bin/bash 输入用户名密码登陆mysql mysql -u root -p 然后输入密码登陆进去 2、查看慢日志相关信息 默认慢日志是关闭的。sh…

    2026年10月13日 • 用户投稿
    000
  • 怎么安装php和配置mysql数据库服务器

    安装 PHP PHP(Hypertext Preprocessor)是一种广泛使用的脚本语言,主要用于 Web 开发。下面介绍在 Ubuntu 操作系统上安装 PHP 的步骤: 步骤一:更新软件源列表 为确保安装 PHP 前所需的软件均为最新版本,您可以更新软件源列表实现此目的。在终端窗口中输入以下…

    2026年10月13日
    300
  • java成品网站源码大全2025 最新java成品网站在线观看汇总

    java成品网站源码大全2025 最新java成品网站在线观看汇总java成品网站源码大全2025 最新java成品网站在线观看汇总java成品网站源码大全2025 最新java成品网站在线观看汇总java成品网站源码大全2025 最新java成品网站在线观看汇总

    在当今的互联网时代,网站的开发和部署变得越来越重要。Java作为一种广泛使用的编程语言,因其稳定性和可扩展性而备受开发者青睐。2025年,Java成品网站源码的需求持续增长,许多开发者和企业希望能够快速获取并部署这些源码,以满足其业务需求。本文将详细介绍如何获取Java成品网站源码入口,并提供在线观…

    2026年10月13日 • 用户投稿
    100
  • CentOS上如何安装搭建PHP+Apache+Mysql的服务器环境

    CentOS上如何安装搭建PHP+Apache+Mysql的服务器环境CentOS上如何安装搭建PHP+Apache+Mysql的服务器环境CentOS上如何安装搭建PHP+Apache+Mysql的服务器环境CentOS上如何安装搭建PHP+Apache+Mysql的服务器环境

    一:安装mysql 1.安装 yum install mysql mysql-server mysql-devel 2.启动 mysql /etc/init.d/mysqld start 3.设置mysql初始密码(mysql安装完成后默认为无密码,未设置密码之前启动mysql会出现警告信息) 密码…

    2026年10月13日 • 用户投稿
    100
  • 怎么利用Xtrabackup进行mysql增量备份

    利用Xtrabackup进行mysql增量备份 现在xtrabackup版本升级到了8.0,但是只对mysql8.0才有支持, 我们这还是使用2.4, 但是2.4相比之前的2.1有了比较大的变化:innobackupex 功能全部集成到 xtrabackup 里面,只有一个 binary,另外为了使…

    2026年10月13日
    200
  • mysql中join和where有什么区别

    1、join将符合on条件的数据连接到一个新的表中。 2、where首先通过笛卡尔积将两个表连接到一个新的表中,然后判断条件,并将符合条件的数据行成一个表。 实例 有道小P 有道小P,新一代AI全科学习助手,在学习中遇到任何问题都可以问我。 64 查看详情 select m.menu_id,m.so…

    2026年10月13日
    200
  • java中dao包是干什么的 DAO设计模式的作用解析

    java中dao包是干什么的 DAO设计模式的作用解析java中dao包是干什么的 DAO设计模式的作用解析java中dao包是干什么的 DAO设计模式的作用解析java中dao包是干什么的 DAO设计模式的作用解析

    dao包在java开发中用于封装数据访问逻辑,将数据操作与业务逻辑分离,提高代码的可维护性和复用性。dao设计模式提供一个抽象层,隔离数据存储技术和业务逻辑,使系统更易扩展和维护。在项目中,dao模式通过统一管理不同数据库操作,提升代码结构清晰度和团队协作效率。 在Java开发中,DAO(Data …

    2026年10月12日 • 用户投稿
    100
  • MySQL中如何使用开窗函数

    MySQL中如何使用开窗函数MySQL中如何使用开窗函数MySQL中如何使用开窗函数MySQL中如何使用开窗函数

    (1)开窗函数的定义 开窗函数也叫olap函数(online analytical processing,联机分析处理),主要用来实时分析处理数据。在mysql的8.0版本之前,开窗函数是不被支持的,但从该版本开始就提供了对开窗函数的支持。 # 开窗函数语法 func_name() OVER([PA…

    2026年10月12日 • 用户投稿
    100
  • Composer如何处理PHP扩展依赖_声明项目所需的PHP-ext模块

    Composer如何处理PHP扩展依赖_声明项目所需的PHP-ext模块Composer如何处理PHP扩展依赖_声明项目所需的PHP-ext模块Composer如何处理PHP扩展依赖_声明项目所需的PHP-ext模块Composer如何处理PHP扩展依赖_声明项目所需的PHP-ext模块

    Composer通过声明PHP扩展依赖确保环境一致性,其在安装或更新时检查扩展是否启用,避免部署问题。 Composer本身并不直接安装PHP扩展,它主要扮演的是一个“环境守卫者”的角色。当你声明了项目所需的PHP扩展模块时,Composer会在你运行 composer install 或 comp…

    2026年10月12日 • 用户投稿
    100
  • MySQL性能监控指标中文乱码处理方法

    mysql性能监控中出现中文乱码问题,主要由字符集设置不一致引起,解决方法包括以下步骤:1. 检查并统一mysql的字符集参数(character_set_server、collation_server、character_set_database和character_set_client)为utf…

    2026年10月12日
    200
  • MySQL中sql语句有哪些

    MySQL中sql语句有哪些MySQL中sql语句有哪些MySQL中sql语句有哪些MySQL中sql语句有哪些

    以下两个表格做讲解 SELECT SELECT “字段” FROM “表名”;SELECT Store_Name FROM Store_Info;显示表格中的一个或数个字段的所有数据记录 DISTINCT SELECT DISTINCT “字段” FROM “表名”;select distinct …

    2026年10月12日 • 用户投稿
    200
  • mysql表的四种分区方式是什么

    mysql表的四种分区方式是什么mysql表的四种分区方式是什么mysql表的四种分区方式是什么mysql表的四种分区方式是什么

    1、什么是表分区? mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表结构的,一个是myd存放表数据的,一个是myi存表索引的。如果一张表的数据量太大的话,那么myd,m…

    2026年10月12日 • 用户投稿
    100
  • Pycharm怎么远程调试和MySQL数据库授权问题

    Pycharm怎么远程调试和MySQL数据库授权问题Pycharm怎么远程调试和MySQL数据库授权问题Pycharm怎么远程调试和MySQL数据库授权问题Pycharm怎么远程调试和MySQL数据库授权问题

    一、pycharm配置 1、部署配置 工具==》部署==》配置 2、python解释器 文件==》设置==》项目:xx==》python解释器 3、运行/调试配置 运行==》编辑配置==》新增python配置 注:此处特别要注意如果要在pycharm中调试django需要将形参设置成:runserv…

    2026年10月12日 • 用户投稿
    200
  • 如何在mysql中排查连接失败问题

    连接失败主因是服务未运行、网络不通、权限不足或配置错误。先检查MySQL服务状态并启动,确认3306端口监听及防火墙放行,确保bind-address允许外部访问,验证用户权限与登录凭证正确,必要时授权远程访问,最后查看错误日志定位具体问题。 MySQL连接失败是常见问题,通常涉及网络、权限、服务状…

    2026年10月12日
    100
  • 怎么用mysql union实现全外连接查询

    1、union不是多表连接查询的一种方式,将多个查询句子的查询结果合并成一个结果,去除重复数据。 2、全外连接查询左表和右表的数据,然后根据连接条件连接。 实例 蓝心千询 蓝心千询是vivo推出的一个多功能AI智能助手 34 查看详情 # 用左外的A union 右外的BSELECT * FROM …

    2026年10月12日
    300
  • MySQL中LAG()函数和LEAD()函数如何使用

    MySQL中LAG()函数和LEAD()函数如何使用MySQL中LAG()函数和LEAD()函数如何使用MySQL中LAG()函数和LEAD()函数如何使用MySQL中LAG()函数和LEAD()函数如何使用

    一、窗口函数的基本用法 从mysql8之后才开始支持窗口函数 OVER ([PARTITION BY ] ORDER BY ) 二、LAG()和LEAD()函数介绍 lag和lead分别是向前向后的意思 参数有三个。expression:列名;offset:偏移量;default_value:超出记…

    2026年10月12日 • 用户投稿
    300
  • MySQL中如何使用YEARWEEK函数

    YEARWEEK(date):获取日期的年和周 如知AI笔记 如知笔记——支持markdown的在线笔记,支持ai智能写作、AI搜索,支持DeepseekR1满血大模型 27 查看详情 SELECT YEARWEEK(SYSDATE()) SELECT YEARWEEK(‘2015-01-10′) …

    2026年10月12日
    100
  • MySQL数据以全量和增量方式,向ES搜索引擎同步流程

    MySQL数据以全量和增量方式,向ES搜索引擎同步流程MySQL数据以全量和增量方式,向ES搜索引擎同步流程MySQL数据以全量和增量方式,向ES搜索引擎同步流程MySQL数据以全量和增量方式,向ES搜索引擎同步流程

    一、配置详解 1、下载内容 Elasticsearch 版本:6.3.2Logstash 版本:6.3.2MySQL Connector:mysql-connector-java-5.1.13.jar 2、核心配置路径 路径:/usr/local/logstash新建配置目录:sync-config…

    2026年10月12日 • 用户投稿
    200
  • node+mysql数据库连接池连接的方法是什么

    mysql有两种连接方式:一种是直接连接 另一种是池化连接,我们这篇讲的是池化连接。 为了让解惑,我简答的写份直接连接的代码,如下: var mysql = require(‘mysql’);var connection = mysql.createConnection({ host : ‘loca…

    2026年10月12日
    000
  • 怎么使用MySQL进行JDBC编程与增删改查

    怎么使用MySQL进行JDBC编程与增删改查怎么使用MySQL进行JDBC编程与增删改查怎么使用MySQL进行JDBC编程与增删改查怎么使用MySQL进行JDBC编程与增删改查

    Java的数据库编程JDBC 概念 jdbc是一种用于执行sql语句的java api,他是java中的数据库连接规范,这个api由一些接口和类组成。它提供了一个标准的api,使得java开发人员可以统一访问多种关系数据库 本质是通过代码自己实现一个MySQL客户端,通过网络和服务器进行数据的交互,…

    2026年10月12日 • 用户投稿
    600

发表回复

登录后才能评论
关注微信