Mysql配置主从复制-GTID模式详解

 更新时间:2024年04月18日 09:24:38   作者:想养一只!  
这篇文章主要介绍了Mysql配置主从复制-GTID模式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

主从复制

主从复制的定义

是指把数据从一个Mysql服务器(主节点)复制到一个或多个Mysql服务器(从节点)中,会把主节点服务器中的所有数据库实例、特定数据库实例或特定表等,全部复制到从节点服务器中。

主从复制的原理

是通过基于日志的复制方式实现数据的同步。当主服务器上发生数据变更时,会将这些变更写入二进制日志(Binary Log)中。

从服务器通过连接到主服务器,请求从主服务器获取二进制日志,并将这些日志应用到自己的数据库中。

主从复制的优势

  • 提高读性能:通过设置从服务器(Slave),读操作可以被分摊到主服务器(Master)和从服务器上,从而提高整体的读取性能。主服务器负责处理写操作,从服务器负责处理读操作,从而降低主服务器的负载,提升整个系统的吞吐量。
  • 数据冗余和备份:通过主从复制,从服务器上的数据是主服务器的冗余副本。在主服务器发生故障时,从服务器仍然可以提供服务,并且可以通过将某个从服务器提升为新的主服务器来快速恢复服务。此外,从服务器也可以用于定期的备份操作,以确保数据的安全性和可恢复性。
  • 高可用性:通过主从复制,可以实现数据库的故障转移和高可用性。当主服务器发生故障时,可以手动或自动将某个从服务器提升为新的主服务器,继续提供数据库服务,从而实现快速的故障恢复。
  • 数据分析和报表生成:由于从服务器可以处理读操作,可以将其用于数据库的数据分析和报表生成等工作。这样可以避免对主服务器造成额外的负载,同时提供实时的数据分析和报表服务。
  • 数据分发和跨地域部署:主从复制可以用于将数据分发到不同的地理位置的从服务器上,从而实现跨地域的数据访问和部署。这对于全球化的应用程序和多地域灾备是非常有用的。
  • 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。

主从复制的形式

  • 一主一从;
  • 一主多从;
  • 多主一从;
  • 双主复制;
  • 级联复制。

主从复制的模式

  • 异步模式(默认);
  • 半同步模式;
  • 全同步模式。

主从复制的类型

基于二进制日志复制(有三种形式)

  • 基于SQL语句的复制;
  • 基于行的复制;
  • 混合模式复制。

基于GTID复制(Mysql版本 >= 5.7及以上推荐使用)

GTID模式

GTID的概念

  • GTID即全局事务ID:global transaction identifier;
  • GTID是一个事务一一对应,并且全局唯一ID;
  • 一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致;
  • GTID用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。 而是使用MASTER_AUTO_POSTION=1的方式开始复制;
  • MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善;
  • 在传统的slave端,binlog是不用开启的,但是在GTID中slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。

GTID的优势

  • 更简单的实现failover,不用以前那样在需要找log_file和log_pos;
  • 更简单的搭建主从复制;
  • 比传统的复制更加安全;
  • GTID是连续的没有空洞的,保证数据的一致性,零丢失。

GTID的原理

  • 当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中;
  • binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值;
  • sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID;
  • 如果有记录,说明该GTID的事务已经执行,slave会忽略;
  • 如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行;
  • 在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

GTID的配置

Mysql主服务器

1、在Mysql的my.ini配置文件中添加以下参数:

gtid_mode=ON
enforce_gtid_consistency=true
server_id=1
log-bin=mysql-bin
binlog_format=row
log-slave-updates=1

2、重启Mysql和创建复制用户

使用管理员打开cmd命令窗口,按照以下命令步骤分别执行:

#暂停服务;

net stop mysql

#开启服务;

net start mysql

#连接数据库,Password替换为自己数据库密码;

mysql -u root -pPassword

#创建一个用于复制的用户,userName和Password自行设置;

CREATE USER 'userName'@'%' IDENTIFIED BY 'Password';

#授予复制权限,userName即上步创建的用户名;

GRANT REPLICATION SLAVE ON *.* TO 'userName'@'%';

#获取状态,记住File和Position两项参数,后面需要用到;

SHOW MASTER STATUS;

Mysql从服务器

 1、在Mysql的my.ini配置文件中添加以下参数:

gtid_mode=ON
enforce_gtid_consistency=true
server_id=1
log-bin=mysql-bin
binlog_format=row
log-slave-updates=1

2、重启Mysql和创建复制用户

使用管理员打开cmd命令窗口,按照以下命令步骤分别执行:

#暂停服务;

net stop mysql

#开启服务;

net start mysql

#连接数据库,Password替换为自己数据库密码;

mysql -u root -pPassword

#配置复制,serverIP是主服务器IP地址,userName和password是刚在主服务器创建的用户,file和position是刚查看主服务器状态返回的参数;

CHANGE MASTER TO MASTER_HOST='serverIP', MASTER_USER='userName', MASTER_PASSWORD='password', MASTER_LOG_FILE='file', MASTER_LOG_POS=position;

#启动复制;

START SLAVE;

#查看复制状态,输出中的Slave_IO_Running和Slave_SQL_Running的值为Yes,表示复制正在正常运行;

SHOW SLAVE STATUS\G;

到这里就结束了,可以在Mysql主服务器中进行添加、修改、删除操作,测试从服务器中的数据是否保持一致。

注意:从服务器只允许进行查询,不可以进行添加、修改、删除等改变数据的操作,否则会导致复制状态失效。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Mysql之索引的数据结构详解

    Mysql之索引的数据结构详解

    索引是存储引擎用于快速找到数据记录的一种数据结构,类似于教科书的目录部分,在MySQL中,索引可以加速数据查找,减少磁盘I/O的次数,提高查询速率,但是,创建和维护索引需要耗费时间,并且索引需要占磁盘空间,在InnoDB中,索引的实现基于B+树结构
    2024-12-12
  • MySQL初学者可以告别分组聚合查询的困扰了

    MySQL初学者可以告别分组聚合查询的困扰了

    这篇文章主要为大家介绍了MySQL分组聚合查询的难点讲解,帮助MySQL初学着告别分组聚合查询的困扰,有需要的朋友可以借鉴参考下,希望能够有所进步
    2021-10-10
  • MySQL(community版)压缩包安装的超详细教程

    MySQL(community版)压缩包安装的超详细教程

    这篇文章详细介绍了如何在Windows系统上手动安装MySQL 8.0.26的压缩包版本,包括下载、解压、配置环境变量、初始化、启动服务、设置密码等步骤,同时,还提供了一个简单的SQL基础教程,需要的朋友可以参考下
    2025-03-03
  • MySQL的ORDER BY及优化过程详解

    MySQL的ORDER BY及优化过程详解

    在MySQL中,索引的最左匹配原则是指在使用索引进行查询时,会优先匹配索引的最左侧列,然后再匹配后续列,本文将基于InnoDB引擎,详细分析如何优化MySQL索引最左匹配下的ORDER BY语句,需要的朋友可以参考下
    2024-07-07
  • Mysql中使用Union—多表合并之行合并

    Mysql中使用Union—多表合并之行合并

    这篇文章主要介绍了Mysql中使用Union—多表合并之行合并,如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字,union(或称为联合)的作用是将多个结果合并在一起显示出来,需要的朋友可以参考下
    2023-07-07
  • MySQL explain根据查询计划去优化SQL语句

    MySQL explain根据查询计划去优化SQL语句

    MySQL是一种常见的关系型数据库管理系统,常被用于各种应用程序中存储数据,当涉及到大量的数据时,就需要MySQL的explain功能来帮助优化,本文将详细介绍MySQL的explain功能,感兴趣的朋友可以参考阅读
    2023-04-04
  • MySQL中的全表扫描和索引树扫描 的实例详解

    MySQL中的全表扫描和索引树扫描 的实例详解

    这篇文章主要介绍了MySQL中的全表扫描和索引树扫描 ,从本文的学习可以轻松的知道,全表扫描的效率相比于索引树扫描相对较低一点,但是差距不是很大,具体示例代码详解跟随小编一起看看吧
    2022-05-05
  • 获取MySQL数据表列信息的三种方法实现

    获取MySQL数据表列信息的三种方法实现

    本文介绍了获取MySQL数据表列信息的三种方法实现,包含SHOWCOLUMNS命令、DESCRIBE命令以及查询INFORMATION_SCHEMA.COLUMNS表,具有一定的参考价值,感兴趣的可以了解一下
    2024-12-12
  • MySQL截取和拆分字符串函数用法示例

    MySQL截取和拆分字符串函数用法示例

    这篇文章主要介绍了MySQL截取和拆分字符串函数用法,结合实例形式分析了mysql针对字符串的截取与拆分函数SUBSTRING及SUBSTRING_INDEX相关使用方法,需要的朋友可以参考下
    2016-09-09
  • MySQL的线程池原理学习教程

    MySQL的线程池原理学习教程

    这篇文章主要介绍了MySQL的线程池原理学习教程,包括线程池的函数调用与关键接口等重要知识,非常推荐!需要的朋友可以参考下
    2015-11-11

最新评论