MySQL主从复制详解

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 在MySQL中,主从架构应该是最基础、最常用的一种架构了。后续的读写分离、多活高可用架构等大多都依赖于主从复制。主从复制也是我们学习MySQL过程中必不可少的一部分,关于主从复制的文章有很多,笔者也来凑凑热闹,写写这方面的内容吧,同时分享下自己的经验和方法。

1.主从复制简介及原理



主从复制(也称 AB 复制)是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。对于多级复制,数据库服务器既可充当主机,也可充当从机。MySQL默认采用异步复制方式。

主从复制的过程及原理可以总结如下:


  1. master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中。
  2. slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件。
  3. 同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致。


image.png

master-slave.png


2.基于二进制文件位置配置主从复制



基于二进制文件位置的主从复制又可以称为传统复制,即从服务器依赖于主服务器的binlog文件位置,当主库发生数据变更时,binlog pos位点会增长,从库会感应到变化来完成同步。


配置主从复制,我们首先要准备至少两台MySQL实例,一台充当主服务器、一台充当从服务器。由于主从复制依赖于binlog,所以主库必须开启binlog,且主从要配置不同的server_id,下面具体展示下配置过程:


2.1 确认主从库配置参数


MySQL主从服务器建议有如下配置,可以先确认下,如果未配置,则需要修改配置文件然后重启。

# 主库参数配置 要有以下参数
vim /etc/my.cnf 
[mysqld] 
log-bin = binlog  //启用二进制日志
server-id = 137  //服务器唯一ID,默认值是1,一般设置为IP地址的最后一段数字
binlog_format = row //bilog设置为row模式 防止复制出错
# 从库建议配置以下参数
vim /etc/my.cnf 
[mysqld] 
relay-log = relay-bin
server-id = 138


2.2 确定主库二进制位置,创建同步账号


若主从库都是刚刚初始化完成,且主库无操作时,从库可不用同步主库的数据,直接确定主库的binlog位置即可。

# 查看主库binlog文件位置
show master status;
# 主库创建同步账号
create user 'repl'@'%' identified by '123456';
grant replication slave on *.* to 'repl'@'%';

若主库已经运行了一段时间,有业务数据在,而从库刚刚初始化完成,此时则需要备份主库的数据,然后导入从库,使得主从数据一致。

# 主库创建同步账号
create user 'repl'@'%' identified by '123456';
grant replication slave on *.* to 'repl'@'%';
# 全备主库数据
mysqldump -uroot -pxxxx -A -R -E --single-transaction --master-data=2 > all_db.sql
# 从库端恢复
mysql -uroot -pxxxx < all_db.sql
# 从备份文件中可以找到主库的binlog位置


2.3 进入从库,开启主从复制


找到主库二进制文件位置且完成主从数据一致后,我们就可以正式开启主从复制了。

# 进入从库MySQL命令行 执行change master语句连接主库
# 二进制文件名及pos位置由上面步骤获得
CHANGE MASTER TO MASTER_HOST='MySQL主服务器IP地址',
    MASTER_PORT=3306,
    MASTER_USER='repl',
    MASTER_PASSWORD='123456',
    MASTER_LOG_FILE='binlog.000002',
    MASTER_LOG_POS=154;
# 开启主从复制 并坚持状态
start slave;
show slave status \G //查看slave状态 确保Slave_IO_Running: Yes Slave_SQL_Running: Yes


3.基于GTID的主从复制



GTID是MySQL 5.6的新特性,其全称是Global Transaction Identifier,可简化MySQL的主从切换以及Failover。GTID用于在binlog中唯一标识一个事务。当事务提交时,MySQL Server在写binlog的时候,会先写一个特殊的Binlog Event,类型为GTID_Event,指定下一个事务的GTID,然后再写事务的Binlog。

在基于GTID的复制中,首先从服务器会告诉主服务器已经在从服务器执行完了哪些事务的GTID值,然后主库会有把所有没有在从库上执行的事务,发送到从库上进行执行,并且使用GTID的复制可以保证同一个事务只在指定的从库上执行一次,这样可以避免由于偏移量的问题造成数据不一致。也就是说,无论是级联情况,还是一主多从的情况,都可以通过GTID自动找位置,而无需像之前那样通过File_name和File_position找主库binlog位置了。

基于GTID的主从复制与上面基于二进制文件位置的主从复制搭建步骤类似,同样简单展示下搭建过程:


3.1 确认主从库配置,开启GTID

# 主库参数配置 要有以下参数
vim /etc/my.cnf 
[mysqld] 
server-id = 137
log-bin = binlog  
binlog_format = row 
gtid-mode = ON //开启gtid模式
enforce-gtid-consistency = ON   //强制gtid一致性,用于保证启动gitd后事务的安全 
# 从库建议配置以下参数
vim /etc/my.cnf 
[mysqld] 
server-id = 138
log-bin = binlog  
binlog_format = row 
gtid-mode = ON 
enforce-gtid-consistency = ON 
relay-log = relay-bin


3.2 创建同步账号,保持主从库数据一致


若主库刚初始化完成或者主库端保留有全部二进制文件,则从库无需手动同步数据。否则需要手动同步数据使得主从一致。

# 主库创建同步账号
create user 'repl'@'%' identified by '123456';
grant replication slave on *.* to 'repl'@'%';
# 若主库刚初始化或保留有完整二进制文件 则无需执行下面步骤
# 全备主库数据
mysqldump -uroot -pxxxx -A -R -E --single-transaction  > all_db.sql
# 从库端恢复
mysql -uroot -pxxxx < all_db.sql


3.3 进入从库,开启主从复制

# 进入从库MySQL命令行 执行change master语句连接主库
CHANGE MASTER TO MASTER_HOST='MySQL主服务器IP地址',
    MASTER_PORT=3306,
    MASTER_USER='repl',
    MASTER_PASSWORD='123456',
    MASTER_AUTO_POSITION = 1;
# 开启主从复制 并坚持状态
start slave;
show slave status \G


4.一些经验及建议



在日常学习及工作过程中,主从复制方面也积累了一些经验,下面简单分享几点,希望各位少踩坑。


  • 主从两端数据库版本尽量保持一致。
  • 主从库参数建议相同,比如字符集、sql_mode这类参数要设置一样。
  • 从库服务器性能不能过于落后主库,以免因服务器性能产生主从延迟。
  • 所有表强制拥有主键,因为无主键表同步到从库极易产生主从延迟。
  • 建议从库设为read only,以防人为误操作从库数据。
  • 监控主从延迟及状态,及时解决同步中断或延迟问题。


总结:


本文介绍了主从复制的原理及搭建过程,其实关于主从复制的内容还有很多,需要不断的学习。这里推荐大家使用GTID模式来搭建主从复制,关于后面分享的几点经验,也是自己日常积累的,希望对你有所帮助。写作不易,觉得还不错的话,请顺手转发分享下哦。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
SQL 运维 关系型数据库
MySQL数据库运维第一篇(日志与主从复制)
MySQL数据库运维第一篇(日志与主从复制)
|
2月前
|
SQL 负载均衡 关系型数据库
mysql主从复制,从搭建到使用
mysql主从复制,从搭建到使用
50 1
|
3月前
|
SQL 关系型数据库 MySQL
mysql 主从复制与读写分离
mysql 主从复制与读写分离
|
2月前
|
SQL 监控 关系型数据库
探秘MySQL主从复制的多种实现方式
探秘MySQL主从复制的多种实现方式
30 0
|
14天前
|
SQL 关系型数据库 MySQL
配置MySQL主从复制(一主一从)
配置MySQL主从复制(一主一从)
|
1月前
|
关系型数据库 MySQL 网络安全
Mysql 数据库主从复制
在MySQL主从复制环境中,配置了两台虚拟机:主VM拥有IP1,从VM有IP2。主VM的`my.cnf`设置server-id为1,启用二进制日志;从VM设置server-id为2,开启GTID模式。通过`find`命令查找配置文件,编辑`my.cnf`,在主服务器上创建复制用户,记录二进制日志信息,然后锁定表并备份数据。备份文件通过SCP传输到从服务器,恢复数据并配置复制源,启动复制。检查复制状态确认运行正常。最后解锁表,完成主从同步,新用户在从库中自动更新。
1026 7
Mysql 数据库主从复制
|
20天前
|
关系型数据库 MySQL PHP
开发者必看:MySQL主从复制与Laravel读写分离的完美搭配
开发者必看:MySQL主从复制与Laravel读写分离的完美搭配
37 2
|
20天前
|
SQL canal 关系型数据库
(二十四)全解MySQL之主从篇:死磕主从复制中数据同步原理与优化
兜兜转转,经过《全解MySQL专栏》前面二十多篇的内容讲解后,基本对MySQL单机模式下的各方面进阶知识做了详细阐述,同时在前面的《分库分表概念篇》、《分库分表隐患篇》两章中也首次提到了数据库的一些高可用方案,但前两章大多属于方法论,并未涵盖真正的实操过程。接下来的内容,会以目前这章作为分割点,开启MySQL高可用方案的落地实践分享的新章程!
141 1
|
27天前
|
SQL 监控 关系型数据库
面试题MySQL问题之主从复制的数据一致性问题如何解决
面试题MySQL问题之主从复制的数据一致性问题如何解决
21 1
|
2月前
|
存储 关系型数据库 MySQL
Java大佬必知必会——MySQL主从复制
如果你现在有两台MySQL,一台版本是03年的MySQL5.0,另一台是18年的MySQL8.0.11。新版本可以作为老版本的从服务器,但反过来是不可行的。如果二进制文件包含了已存在的数据,就会造成数据重复了。如果从服务器复制该二进制文件后的数据库状态是混乱无序的,那整个复制的过程就没有意义了。如果主、从服务器存储数据的顺序不一样,就会导致每次执行删除的数据都是不同的。,老版本可能无法解析新版本的新特性,甚至复制的文件格式都差异太大。MySQL从库只会复制它本身缺失的最新数据,利用二进制文件里的。
Java大佬必知必会——MySQL主从复制