0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文详解MySQL主从复制

阿铭linux 来源:阿铭linux 2023-01-17 09:13 次阅读

19.1 主从复制介绍

19.1.1 主从存在的意义

数据备份:为了避免单点故障,增加一个从服务器,用来复制主服务器上的数据。

分担负载:将写操作在主上做,查询操作在从上做。

19.1.2 主从复制原理

21297f38-95f6-11ed-bfe3-dac502259ad0.png

① 主上将所有变更事件记录到binlog里

② 从发起请求连接主

③ 主的binlog备份线程将binlog传给从

④ 从的I/O线程将binlog解析成自己的relay log

⑤ 从的SQL线程根据relay log来执行具体的SQL语句

MySQL主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。

binlog:binary log,主库中保存所有更新事件日志的二进制文件。binlog是数据库服务启动的一刻起,保存数据库所有变更记录(数据库结构和内容)的文件。在主库中,只要有更新事件出现,就会被依次地写入到binlog中,之后会推送到从库中作为从库进行复制的数据源。

binlog dump线程:每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。对于每一个即将发送给从库的sql事件,binlog dump线程会将其锁住。一旦该事件被线程读取完之后,该锁会被释放,即使在该事件完全发送到从库的时候,该锁也会被释放。

在从库中,当复制开始时,从库就会创建从库I/O线程和从库的SQL线程进行复制处理。

从库I/O线程:当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。

从库的SQL线程:从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。

19.2 搭建主从复制

19.2.1 基于二进制日志文件位置的复制

① 根据我们前面的文档,搭建两台MySQL服务,具体步骤略

192.168.222.128 主
192.168.222.132 从

② 检查并配置两台机器的server_id

vi my.cnf #搜索server_id ,如果没有则增加
主上设置为server_id=1
从上设置为 server_id = 2

③ 在主上创建用作主从复制的用户

create user 'rep'@'192.168.222.132'  identified with 'mysql_native_password' by 'AmingLinux.Com';
grant REPLICATION SLAVE  on *.* to 'rep'@'192.168.222.132';
flush privileges;

④在主上查询日志名字以及位置

show master status; ##记录下对应的日志命令以及位置
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| aminglinux.000001 |      853|              |                  |
+------------------+----------+--------------+------------------+

⑤到从上执行

change master to master_host='192.168.222.128',master_user='rep',master_password='AmingLinux.Com',master_log_file='aminglinux.000001',master_log_pos=853;
start slave;
show slave statusG

19.2.2 基于GTID的主从复制

1. 什么是GTID

GTID(Global Transaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号。GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识,保存在mysql数据目录下的auto.cnf文件里。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。下面是一个GTID的具体形式:

3E11FA47-71CA-11E1-9E33-C80AA9429562:23

2.GTID的作用

根据GTID可以知道事务最初是在哪个实例上提交的,GTID的存在方便了Replication的Failover(故障切换)

3. GTID比传统复制的优势

更简单的实现failover,不用以前那样在需要找log_file和log_Pos。更简单的搭建主从复制。比传统复制更加安全。GTID是连续没有空洞的,因此主从库出现数据冲突时,可以用添加空事物的方式进行跳过。

4. GTID的工作原理

① master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。

②slave端的i/o线程将变更的binlog,写入到本地的relay log中。

③sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。

④如果有记录,说明该GTID的事务已经执行,slave会忽略。

⑤如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。

⑥在解析过程中会判断是否有主键,如果有就用二级索引,如果没有就用全部扫描。

4. GTID复制搭建

由于之前做过主从配置,可以先取消之前的主从。

slave上执行:

stop slave;
reset slave all;

master上执行:

reset master;

① 主上修改配置文件,重启mysql服务

server_id = 1
gtid_mode = on
enforce_gtid_consistency=on
log_bin=mysql-bin
binlog_format=row
log-slave-updates=1
skip-slave-start=1

② 从上修改配置文件,重启mysql服务

server_id = 2
gtid_mode = on
enforce_gtid_consistency=on
log_bin=mysql-bin
binlog_format=row
log-slave-updates=1
skip-slave-start=1

③ 主上授权用户

create user 'rep'@'192.168.222.132'  identified with 'mysql_native_password' by 'AmingLinux.Com';
grant REPLICATION SLAVE  on *.* to 'rep'@'192.168.222.132';
flush privileges;

④ 从上配置主从

stop slave;
CHANGE MASTER TO MASTER_HOST='192.168.222.128', MASTER_USER='rep',MASTER_PASSWORD='AmingLinux.Com',MASTER_AUTO_POSITION=1,MASTER_CONNECT_RETRY=10;
start slave;

④ 查看主从状态

从上执行

show slave statusG

⑤ 测试主从

主上新建一个数据库

create database  testd;

到从上查看是否有testd数据库

show databases;

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    12

    文章

    9013

    浏览量

    85165
  • 数据备份
    +关注

    关注

    0

    文章

    57

    浏览量

    11838
  • MySQL
    +关注

    关注

    1

    文章

    801

    浏览量

    26437
  • 日志
    +关注

    关注

    0

    文章

    138

    浏览量

    10631
  • 线程
    +关注

    关注

    0

    文章

    504

    浏览量

    19647

原文标题:MySQL主从复制

文章出处:【微信号:aming_linux,微信公众号:阿铭linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于二进制安装MySQL主从复制

    二进制安装MySQL实现主从复制
    发表于 03-10 09:43

    mysql主从复制

    mysql 主从复制
    发表于 04-28 14:30

    基于mycat的Mysql主从复制读写分离全攻略

    基于mycat的Mysql主从复制读写分离全攻略
    发表于 09-08 10:10 4次下载
    基于mycat的<b class='flag-5'>Mysql</b><b class='flag-5'>主从复制</b>读写分离全攻略

    利用MySQL进行从的主从复制

    本文讲述了如何使用MyBatisPlus+ShardingSphereJDBC进行读写分离,以及利用MySQL进行从的主从复制
    的头像 发表于 07-28 09:47 1010次阅读

    MySQL主从复制原理详解

    简单讲,MySQL主从复制就是数据写入台服务器(主服务器)后,同时还会额外写入另外的服务器(从服务器)。也就是说数据会写多份,这样做的目的主要有两个:
    的头像 发表于 02-06 10:27 1061次阅读

    个操作把MySQL主从复制整崩了

    最近公司某项目上反馈mysql主从复制失败,被运维部门记了次大过,影响到了项目的验收推进,那么究竟是什么原因导致的呢?而主从复制的原理又是什么呢?本文就对排查分析的过程做
    的头像 发表于 05-11 11:14 520次阅读
    <b class='flag-5'>一</b>个操作把<b class='flag-5'>MySQL</b><b class='flag-5'>主从复制</b>整崩了

    聊聊RocketMQ的主从复制

    RocketMQ 主从复制是 RocketMQ 高可用机制之,数据可以从主节点复制个或多个从节点。
    的头像 发表于 07-04 09:42 581次阅读
    聊聊RocketMQ的<b class='flag-5'>主从复制</b>

    什么是Redis主从复制

    Redis主从复制 来自灵魂的拷问:什么是Redis主从复制? 简言之就是: 主对外从对内,主可写从不可写 主挂了,从不可为主 看下面的图加深下理解: 对,你没看错,Redis主从复制没有动态选举
    的头像 发表于 10-09 15:09 395次阅读
    什么是Redis<b class='flag-5'>主从复制</b>

    mysql主从复制三种模式

    MySQL主从复制种常见的数据同步方式,它可以实现将个数据库的更改同步到其他多个数据库的功能。主从复制可以提高数据库的可用性和性能,以
    的头像 发表于 11-16 14:04 1423次阅读

    mysql如何实现主从复制的具体流程

    主从复制MySQL数据库中常用的数据复制技术之,它的主要目的是将个数据库服务器上的数据复制
    的头像 发表于 11-16 14:10 745次阅读

    mysql主从复制主要有几种模式

    MySQL主从复制MySQL数据库中常用的种数据复制方式,用于实现数据的备份、负载均衡、故障恢复等目的。
    的头像 发表于 11-16 14:15 1135次阅读

    mysql主从复制的原理

    MySQL主从复制种数据库复制技术,它允许将MySQL数据库的更新操作自动
    的头像 发表于 11-16 14:18 459次阅读

    mysql主从复制 混合类型的复制

    MySQL主从复制种常用的数据复制技术,可以实现数据从MySQL服务器(主服务器)
    的头像 发表于 11-16 14:20 527次阅读

    mysql主从复制数据不致怎么办

    MySQL主从复制种常用的数据复制技术,用于实现数据的实时同步和分布式部署。然而,在实际应用中,主从复制过程中出现数据不
    的头像 发表于 11-16 14:35 2287次阅读

    配置MySQL主从复制和读写分离

    配置MySQL主从复制和读写分离
    的头像 发表于 10-23 11:44 322次阅读
    配置<b class='flag-5'>MySQL</b><b class='flag-5'>主从复制</b>和读写分离