mysql主从复制详解(代码片段)

author author     2022-12-08     325

关键词:

前言:

在MySQL中,主从架构应该是最基础、最常用的一种架构了。后续的读写分离、多活高可用架构等大多都依赖于主从复制。主从复制也是我们学习MySQL过程中必不可少的一部分,关于主从复制的文章有很多,笔者也来凑凑热闹,写写这方面的内容吧,同时分享下自己的经验和方法。

1.主从复制简介及原理

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

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

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

技术图片

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主从原理1.1基本介绍MySQL内建的复制功能是构建大型,高性能应用程序的基础。将MySQL的数亿分布到到多个系统上去,这种分步的机制,是通过将MySQL的某一台主机的数据复制到其它主机(Slave)上,并重新执行一遍来实现的... 查看详情

mysql主从同步详解(代码片段)

一:mysql主从原理1.1基本介绍MySQL内建的复制功能是构建大型,高性能应用程序的基础。将MySQL的数亿分布到到多个系统上去,这种分步的机制,是通过将MySQL的某一台主机的数据复制到其它主机(Slave)上,并重新执行一遍来实现的... 查看详情

详解redis主从复制(代码片段)

文章首发于公众号“蘑菇睡不着”前言Redis的主从复制和MySQL差不多,主要起着数据备份,读写分离等作用。所以说主从复制对Redis来说非常重要,而无论是面试还是工作总,了解Redis主从复制底层实现有非常有必要,那么接下来... 查看详情

mysql主从复制与读写分离!(代码片段)

mysql主从复制与读写分离一.前言二.主从复制原理1.mysql的复制类型(1)STATEMENT(基于SQL语句):(2)ROW(基于行)(3)MIXED推荐使用2.主从复制的过程详解(1)核心点(2)详细复制过程... 查看详情

mysql的主从复制读写分离详解(代码片段)

...、重启服务四、检查配置五、配置mysql从服务器六、检测主从复制配置一、授权远程访问mysql数据库新建相关数据库管理员,授权并开启远程访问权限--建议新建一个备份和主从复制的数据库管理员CREATEUSER'backup'@'l... 查看详情

详解mysql读写分离(代码片段)

主从复制的原理MySQL的主从复制和读写分离两者有着紧密的联系,首先要部署主从复制,只有主从复制完成了才能在此基础上进行数据的读写分离。读写分离的原理简单来说,读写分离就是只在主服务器上写,只在从服务器上读... 查看详情

详解mysql高可用群集,mmm搭建高可用(代码片段)

...是MySQL主主复制的管理器。之前的一篇文章讲述了MySQL的主从复制+读写分离,其中原理都相同,有兴趣的朋友可以访问:MySQL主从复制+读写分离2)还有就是,虽然是主主复制,但是在业务上的话,同一时间值额能对一个主进行写... 查看详情

mysql主从复制(代码片段)

MySQL主从复制前言:一.什么叫高可性:二.MySQL设计思路三.MySQL主从复制原理3.1MySQL的复制类型3.2MySQL主从复制默认使用的机制3.3MySQL主从复制工作过程四.主从复制配置4.1主从服务器时间同步4.2配置主从同步4.3配置规则4.4验... 查看详情

mysql主从复制(代码片段)

目录主从复制基础主从复制简介主从复制前提主从复制搭建主库配置(3307实例)从库配置(3308实例)主从复制原理主从复制相关文件主从复制相关线程主从复制图解原理主从故障监控/分析/处理IO线程故障连接主... 查看详情

mysql运维主从复制--主从复制概述主从复制原理搭建mysql主从复制(代码片段)

文章目录1.主从复制概述2.主从复制原理3.搭建3.1服务器准备3.2主库配置3.2.1修改配置文件/etc/my.cnf3.2.2重启MySQL服务器3.2.3登录mysql,创建远程连接的账号,并授予主从复制权限3.2.4通过指令,查看二进制日志坐标3.3从库... 查看详情

主从复制和读写分离(代码片段)

主从复制和读写分离一.概述二.主从复制原理1.mysql复制类型2.mysql主从复制的工作过程三.Mysql读写分离1.读写分离原理2.读写分离方案3.读写分离存在的意义4.什么时候要读写分离四.Mysql主从复制和读写分离实验案例拓扑图:思... 查看详情

mysql数据库——主从复制与读写分离(代码片段)

文章目录前言一、MySQL主从复制1.支持的复制类型2.主从复制的工作过程是基于日志3.请求方式4.主从复制的原理5.MySQL集群和主从复制分别适合在什么场景下使用6.为什么使用主从复制、读写分离7.用途及条件8.mysql主从复制存在的... 查看详情

mysql的主从复制(代码片段)

MySQL的主从复制Whyweneed主从复制?复制功能复制方式复制原理复制流程图复制过程复制中线程的作用从节点主节点从节点需要建立二进制日志文件吗?Mysql复制特点主从复制配置过程主节点从节点配置演示主机修改my.ini配置文... 查看详情

mysql主从复制的简单搭建(代码片段)

文章目录1、MySQL一主一从的简单搭建1.1、主从复制简介1.2、MySQL主从复制简介1.3、主从复制的架构1.4、前期准备1.5、主要配置实现1.5.1、测试环境1.5.2、配置my.cnf文件1.5.3、启动mysql测试1.5.4、配置主从结构1.5.4.1、主服务器配置1.5.4... 查看详情

mysql主从复制的简单搭建(代码片段)

文章目录1、MySQL一主一从的简单搭建1.1、主从复制简介1.2、MySQL主从复制简介1.3、主从复制的架构1.4、前期准备1.5、主要配置实现1.5.1、测试环境1.5.2、配置my.cnf文件1.5.3、启动mysql测试1.5.4、配置主从结构1.5.4.1、主服务器配置1.5.4... 查看详情

redis的主从复制哨兵模式以及群集模式(相关概念及实验详解)(代码片段)

目录前言一.Redis主从复制1.Redis主从复制概述2.Redis主从复制作用3.Redis主从复制流程4.搭建Redis主从复制①环境准备②安装Redis③修改Redis配置文件(Master节点操作)④修改Redis配置文件(Slave节点操作)⑤验证主从效果⑥在Master节点上验... 查看详情

《mysql系列-主从相关》docker安装mysql,实现主从复制(代码片段)

Docker安装MySQL,实现主从复制一、前言1Docker安装MySQL参考历史文章Docker安装MySQL,准备两台MySQL容器master节点容器名称MySQL01容器IDfaf2312fd62a端口33061slave节点容器名称MySQL01容器IDdfc693c2bb04端口330622MySQL主从复制配置实操参考... 查看详情

mysql主从原理及配置详解

MySQL主从配置及原理,供大家参考,具体内容如下一、环境选择:1.Centos6.52.MySQL5.7二、什么是MySQL主从复制MySQL主从复制是其最重要的功能之一。主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服... 查看详情