mysql 主从架构详解
主从复制简介
MySQL主从复制(Replication)指的是两台或以上数据库实例服务器,通过二进制日志实现数据的"同步"关系。
需要注意的是,MySQL主从复制并不是说其工作模式是同步的,实际上,MySQL主从复制(Replication)是一个异步工作模式。
主从复制的前提
- 需要2台以上数据库实例,时间同步,网络通畅,server_id不同,区分不同角色(即主库和从库);
- 主库开启binlog,建立专用复制用户;
- 从库需要提前"补课"(将之前"落下"的数据补全),如果主库也是没数据的,这一步可以省略;
- 从库需要确认主库的连接信息,复制起点等;
- 从库需要开启专用的复制线程;
主从复制架构原理
- 从库执行"CHANGE MASTER TO ..."命令,执行命令成功后会将这些主库的链接信息记录在"master.info"文件中;
- 执行"START SLAVE"命令后,从库会开启IO线程和SQL线程这两个线程,其中IO线程负责发送请求到主库,有关主库的链接信息在"master.info"文件中都有记录;
- 主库分配了一个binlog_dump线程来响应从库的IO线程,我们可以通过"SHOW PROCESSLIST"命令来查看响应的binlog_dump线程;
- 从库的IO线程会请求新日志,有关向主库请求的日志位置点信息在"master.info"文件中都有记录;
- 主库的binlog_dump线程接收从库的IO线程请求后,会截取主库的二进制日志文件,并将结果返回给从库的IO线程;
- 从库的IO线程接收到主库的binlog后,日志先发送到网卡的缓存区域中,此时由网络层返回ACK给主库,主库工作完成;
- 从库的IO线程最终会将数据从网卡的缓冲区拉取并写入中继日志文件中以落地到本地磁盘,于此同时会更新"master.info"文件中记录的位置点信息,以便于下一次从库IO线程知道从哪个位置点请求"新日志",I/O线程工作完成。
- 从库的SQL线程读取"relay-log.info"文件,获取上一次中继日志文件执行到的位置点;
- 从库的SQL线程根据上一步获得中继日志文件的位置点后,在该位置点继续向后执行新的"relay-log"日志,而后会更新"relay-log.info"文件,,以便于下一次从库SQL线程知道从哪个位置点读取"新日志",主从复制流程基本结束。
主从涉及到的文件介绍
主库:
- binlog文件:默认存储在数据目录下,用于存储用户的操作记录,我们可以基于"log_bin_basename"来制定存储的路径及文件名前缀。
SELECT @@log_bin_basename;
从库:
- relay-log文件: 默认存储在数据目录下,用于接收存储binlog,也称为"中继日志"。我们可以基于"relay_log_basename"来手动指定存储路径。
SELECT @@relay_log_basename;
- master.info文件: 默认存储在数据目录下,用于存储主库的链接信息,已经接受的binlog位置点信息等数据。我们可以基于"master_info_repository"来手动指定该文件存储位置。
SELECT @@master_info_repository;
- relay-log.info文件: 默认存储在数据目录下,从库会单独开启一个I/O线程从主库拉取二进制日志并存储中继日志(上面提到的"relay-log"文件)中,而后从库开启一个SQL线程基于中继日志进行回放,以达到和主库同样的数据。而relay-log.info文件就是用于记录从库回放到relay-log的位置点,这是为了防止从库突然宕机后,重启服务器后知道上一次回放的位置点,而后基于该记录的位置点继续往下执行SQL。我们可以基于"relay_log_info_repository"来手动指定该文件存储位置。
SELECT @@relay_log_info_repository ;
主从涉及到的线程介绍
主库:
- binlog_dump线程: 用来接收从库请求,并且投递binlog给从库。查看方式:
SHOW PROCESSLIST;
从库:
- IO线程:用于向主库请求,接收和存储binlog日志。
- SQL线程:用于回放中继日志(上面提到的"relay-log"文件),执行"relay-log"文件的SQL语句并将执行的位置点记录在"relay-log.info"文件中。查看方式:
SHOW SLAVE STATUS\G;
主从复制部署
架构
| 主机 | 角色 |
|---|---|
| 192.168.153.12 | master |
| 192.168.153.13 | slave |
两台机器安装mysql
可查看《mysql5.7版本部署》章节
时间配置
timedatectl set-timezone Asia/Shanghai
ntpdate ntp1.aliyun.com
配置主从
- 主配置文件:
cat /etc/my.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=1
log-bin=/data/mysql/logs/mysql-bin.log
log_error = /data/mysql/logs/mysql-error.log
default-time-zone='+8:00'
log_timestamps=SYSTEM
binlog_format=ROW
binlog_row_image=FULL
expire_logs_days=14
max_binlog_size=1G
sync_binlog=1
innodb_flush_log_at_trx_commit=1
innodb_buffer_pool_size=600M
innodb_log_file_size=2G
mkdir /data/mysql/logs
touch /data/mysql/logs/mysql-error.log
chown -R mysql:mysql /data/mysql/logs
systemctl restart mysqld
systemctl status mysqld
- 从配置文件:
cat /etc/my.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=2
log-bin=/data/mysql/logs/mysql-bin.log
log_error = /data/mysql/logs/mysql-error.log
default-time-zone='+8:00'
log_timestamps=SYSTEM
relay_log=/data/mysql/logs/mysql-relay-bin
relay_log_index=/data/mysql/logs/mysql-relay-bin.index
read_only=1
super_read_only=1
slave_net_timeout = 60
relay_log_recovery = ON
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1
innodb_buffer_pool_size = 600M
innodb_log_file_size=2G
mkdir /data/mysql/logs
touch /data/mysql/logs/mysql-error.log
chown -R mysql:mysql /data/mysql/logs
systemctl restart mysqld
systemctl status mysqld
- 主库建立复制用户
# MySQL 8.0之前版本创建复制用户
GRANT REPLICATION SLAVE ON *.* TO repl@'192.168.153.%' IDENTIFIED BY '1qaz@WSX';
# MySQL 8.0之后版本创建复制用户
CREATE USER repl@'192.168.153.%' IDENTIFIED BY '1qaz@WSX';
- 主库备份恢复到从库,如果建立主从之前主库里面有数据,需要做此操作。
mysqldump -uroot -p'1qaz@WSX' -A --master-data=2 --single-transaction > /tmp/all_db.sql
mysql -uroot -p'1qaz@WSX' < /tmp/all_db.sql
- 主库查看二进制日志坐标,从库建立连接
mysql> show master status ;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
# file : 从哪个日志文件开始推送日志文件
# position : 从哪个位置开始推送日志
# binlog_ignore_db : 指定不需要同步的数据库
# 此方法在如果主库里面有数据,业务停用的时候可以,没有新的数据增加,但当业务还在使用,有新的数据增加的时候需要查看从库备份过来的数据的最后一个Position为起点。
- 从库建立主库的连接信息,并确定复制的起点
CHANGE MASTER TO MASTER_HOST='192.168.153.12', MASTER_USER='repl', MASTER_PASSWORD='1qaz@WSX' , MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000002' ,MASTER_LOG_POS=154, MASTER_CONNECT_RETRY=10;
- 从库开启专用的复制线程
START SLAVE;
- 验证主从复制状态
SHOW SLAVE STATUS\G

部署成功
- 如果主从复制搭建不成功,可以重置主从配置信息,而后重做上述操作。
STOP SLAVE;
RESET SLAVE ALL;
主从复制中从库的线程管理
# 启动从库IO线程和SQL线程
START SLAVE;
# 停止从库IO线程和SQL线程
STOP SLAVE;
# 只启动从库的SQL线程
START SLAVE SQL_THREAD;
# 只启动从库的IO线程
START SLAVE IO_THREAD;
# 只停止从库的SQL线程
STOP SLAVE SQL_THREAD;
# 只停止从库的IO线程
STOP SLAVE IO_THREAD;
解除从库身份
# 在解除从库之前,需要先停止所有的线程,即IO线程和SQL线程
STOP SLAVE;
# 解除从库的所有配置
RESET SLAVE ALL;
# 解除后再次查看从库的状态
SHOW SLAVE STATUS\G
mysql 主从架构详解的更多相关文章
- MySQL主从配置详解
一.mysql主从原理 1. 基本介绍 MySQL 内建的复制功能是构建大型,高性能应用程序的基础.将 MySQL 的 数亿分布到到多个系统上去,这种分步的机制,是通过将 MySQL 的某一台主机的数 ...
- mysql主从配置详解(图文)
最近工作不是很忙,把以前整理的mysql数据库的主从配置过程记录一下,有不足之处,请各位多多纠正指教 #环境配置#master IP:192.168.46.137 slave IP:192.168.4 ...
- MySQL 主从架构配置详解
无论是哪一种数据库,数据的安全都是至关重要的,因此熟练掌握数据库的安全备份功能,是作为开发人员,特别是后端开发人员的一项必备技能.MySQL 数据库内建的复制功能,可以帮助我们对数据进行异地备份,读写 ...
- MySQL日志功能详解
MySQL日志功能详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询日志 它是用来保存所有跟查询相关的日志,这种日志类型默认是关闭状态的,因为MySQL的用户有很多,如果 ...
- mysql5.6主从参数详解
mysql5.6的主从相当的不错,增加了不少参数,提升了主从同步的安全和效率,以下是mysql5.6主从参数详解. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- Mysql加锁过程详解(5)-innodb 多版本并发控制原理详解
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- Zookeeper系列二:分布式架构详解、分布式技术详解、分布式事务
一.分布式架构详解 1.分布式发展历程 1.1 单点集中式 特点:App.DB.FileServer都部署在一台机器上.并且访问请求量较少 1.2 应用服务和数据服务拆分 特点:App.DB.Fi ...
- Hyperledger Fabric架构详解
区块链开源实现HYPERLEDGER FABRIC架构详解 区块链开源实现HYPERLEDGER FABRIC架构详解 2018年5月26日 陶辉 Comments 10 Comments hyper ...
- MySQL数据库备份详解
原文:MySQL数据库备份详解 对于任何数据库来说,备份都是非常重要的 数据库复制不能取代备份的作用 比如我们由于误操作,在主数据库上删除了一些数据,由于主从复制的时间很短,在发现时,从数据库上的数据 ...
- Mysql 三大特性详解
Mysql 三大特性详解 Mysql Innodb后台线程 工作方式 首先Mysql进程模型是单进程多线程的.所以我们通过ps查找mysqld进程是只有一个. 体系架构 InnoDB存储引擎的架构如下 ...
随机推荐
- deepseek-r1的1.5b、7b、8b、14b、32b、70b和671b有啥区别?
DeepSeek-R1系列提供了多种参数规模的模型(1.5B.7B.8B.14B.32B.70B 和 671B),它们在模型架构.性能表现.资源需求和适用场景上有显著差异.以下是对这些版本的核心区别总 ...
- C# NativeAOT生成.so 库供Linux下C++调用
html { overflow-x: initial !important } :root { --bg-color: #ffffff; --text-color: #333333; --select ...
- 开源公开课丨ChunJun数据传输模块介绍
一.直播介绍 之前的内容,我们为大家分享了ChunJun数据还原的DDL模块,以及ChunJun同步Hive事务表,本期我们为大家分享ChunJun数据传输模块介绍. 本次直播我们将从ChunJun数 ...
- Web前端入门第 69 问:JavaScript Promise 提供的方法都使用过吗?
Promise 这个 API 曾在 JS 领域掀起过血雨腥风,以前的大佬们都喜欢手搓一个自己的 Promise 用以理解 Promise 的原理. Promise 的诞生,应该多少都有受到 jQuer ...
- 安卓端-APPUI自动化实战【上】
当前UI自动化测试存在以下问题: 1.投入产出比低:在目前版本快速迭代的大背景下,app更新较快,维护脚本成本高,导致投入产出比低 2.对测试人员要求较高:必须有一定的编程能力 3.运行稳定性较差,断 ...
- Luogu P3549 [POI 2013] MUL-Multidrink 题解
P3549 [POI 2013] MUL-Multidrink 非常 tricky 的一道题,模拟赛拼尽全力无法战胜,写篇题解记录一下. 容易理解的直接构造法. 按原题限制随便跳会破坏很多性质,几乎无 ...
- CF1227G Not Same 题解
CF1227G Not Same 构造.考虑按照每个数字进行考虑,每次填充一列. 观察样例 \(1\),不难发现可以构造使每一行或列一定有一个位置为 \(0\).我们不妨对于每一列限定这个 \(0\) ...
- 安装 mathtype
简介 有些会议一定要用mathtype对公式进行编辑,其实我觉得office提供的公式编辑挺好的 参考链接 https://www.bilibili.com/video/BV14i4y1V7gt?p= ...
- Scrcpy Shortcuts
Actions can be performed on the scrcpy window using keyboard and mouse shortcuts. In the following l ...
- vue 不完美的多标签页解决方案
背景 多标签页多用在中后台管理系统,能够让用户同时打开多个标签页,而且不会丢失之前填写的内容,操作起来会比较方便.虽然部分开源项目有多标签页的功能,但就体验来看,算不上特别好. 目标 可以通过rout ...