首页 > 数据库 >mysql运维------主从复制

mysql运维------主从复制

时间:2023-04-07 14:22:21浏览次数:39  
标签:主库 主从复制 thread 运维 xxx MASTER ------ 日志 从库

1.概述

主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。

MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制。
image

MySQL复制的有点主要包含以下三个方面:

  1. 主库出现问题,可以快速切换到从库提供服务。
  2. 实现读写分离,降低主库的访问压力。
  3. 可以在从库中执行备份,以避免备份期间影响主库服务。

2.原理

MySQL的主从复制原理如下。
在多个源的复制中,每一个复制源都会打开一个复制通道,这是一个长链接。并且每个复制源都有自己的 IO线程、一个或者多个点 SQL 线程以及 realy log。复制源接收到事务时会将其添加到relay log 中,然后通过SQL thread执行。相关官方文档如下:

In MySQL multi-source replication, a replica opens multiple replication channels,
one for each replication source server. The replication channels represent the 
path of transactions flowing from a source to the replica. Each replication 
channel has its own receiver (I/O) thread, one or more applier (SQL) threads, and
relay log. When transactions from a source are received by a channel's receiver 
thread, they are added to the channel's relay log file and passed through to the 
channel's applier threads. This enables each channel to function independently.

image
从上图来看,复制分为三步:

  1. Master主库在事务提交时,会把数据变更记录在二进制日志文件Binlog中。
  2. 从库读取主库的二进制日志文件Binlog,写入到从库的中继日志Relay Log。
  3. slave重做中继日志中的事件,将改变反映它自己的数据。

主从复制应该是分为第一次建立连接增量数据同步过程。

第一次建立连接

备库 B 跟主库 A 之间维持了一个长连接。主库 A 内部有一个io_thread线程,专门用于服务备库 B 的这个长连接。一个事务日志同步的完整过程是这样的:

1.在备库 B 上通过 change master 命令,设置主库 A 的 IP、端口、用户名、密码,以及要从哪个位置开始请求 binlog,这个位置包含文件名和日志偏移量。

CHANGE MASTER TO 
MASTER_HOST='192.168.56.104',
MASTER_USER='root',
MASTER_PASSWORD='qwer_123',
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;

2.在备库 B 上执行start slave命令,这时候备库会启动两个线程,就是图中的 io_thread 和 sql_thread。其中 io_thread 负责与主库建立连接。

3.主库 A 校验完用户名、密码后,开始按照备库 B 传过来的位置,从本地读取 binlog,发给备库 B。

4.备库 B 拿到 binlog 后,写到relay log(中继日志)中。

5.备库的 sql_thread 读取 relay log,解析出日志里的命令,并且回放执行。

增量同步详细流程

详细过程如下:
image
1.客户端发起 update 请求,MySQL server 端收到请求。

2.生成被修改数据行对应的 undolog。

3.执行update成功写入内存。

4.InnboDB 生成 redo log ,此时处于 prepare阶段。

5.server 层生成binlog,事务提交时binlog做持久化,此时binlog便可以开始被同步到从库了。

6.redo log 做磁盘持久化,同时向客户端返回update的执行新结果(默认异步复制)。

7.主库发送生成的 binlog 数据。

8.从库的io_thread处理Maste传输过来的数据,保存为relay log。从库服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件

9.SQL thread 读取relay log,解析并且在从库中重放执行,数据同步完成。最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。

3.搭建

服务器准备
image

  1. 两台服务器防火墙放开端口3306或者关闭防火墙
  2. 准备好服务器后,在两台服务器中分别安装好MySQL,完成基础的初始化准备工作。
  3. 主库配置
  • 修改配置文件 /etc/my.cnf
#mysql服务ID,保证整个集群环境中唯一,取值范围:1-2^32 -1,默认为1
server-id=1
#是否只读,1代表只读,0代表读写
read-only=0
#忽略的数据,指不需要同步的数据库
#binlog-ignore-db=mysql
#指定同步的数据库
#binlog-do-db=db01

字段含义说明:
file:从哪个日志文件开始推送日志文件
position:从哪个位置开始推送日志
binlog_ignore_db:指定不需要同步的数据库

  • 重启MySQL服务器
systemctl restart mysqld
  • 登录mysql,创建远程连接的账号,并授予主从复制权限
#创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务
CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456';
#为'itcast'@'%'用户分配主从复制权限
GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';
  • 通过指令,查看二进制日志坐标
show master status;
  1. 从库配置
  • 修改配置文件 /etc/my.cnf
#mysql服务ID,保证整个集群环境中唯一,取值范围:1-2^32-1,和主库不一样即可
server-id=2
#是否只读,1代表只读,0代表读写
read-only=1
#super-read-only=1
  • 重启MySQL服务器
systemctl restart mysqld
  • 登录mysql,设置主库配置
CHANGE REPLICATION SOURCE TO SOURCE_HOST='xxx.xxx',SOURCE_USER='XXX',SOURCE_LOG_FILE='xxx',SOURCE_LOG_POS=xxx;

上述时8.0.23中的语法,如是时mysql8.0.23之前的版本,执行如下SQL:

CHANGE MASTER TO MASTER_HOST='xxx.xxx.xxx.xxx',MASTER_USER='xxx',MASTER_PASSWORD='xxx',MASTER_LOG_FILE='xxx',MASTER_LOG_POS=xxx;

image
5. 开启同步操作
8.0.22之后
start replica;
8.0.22之前
start slave;
6. 查看主从同步状态
8.0.22之后
show replica status;
8.0.22之前
show slave status;
7. 测试
1.在主库上创建数据库、表,并插入数据
2.在从库中查询数据,验证主从是否同步

标签:主库,主从复制,thread,运维,xxx,MASTER,------,日志,从库
From: https://www.cnblogs.com/qds1401744017/p/17296006.html

相关文章

  • 老机专用超流畅win7在哪下载
    如果我们使用的电脑是比较有年代的老电脑且配置不高,那么在系统出现问题的时候相信很多小伙伴都想安装一个更加合适的操作系统。那么对于老机专用超流畅win7在哪下载,小编觉得我们可以在系统家园网站中进行下载即可。系统家园网站资源免费,安装方便,绿色稳定。详细内容就来看下小编是......
  • C#添加log4日志
    第一步导入log4net在vs的程序包管理器控制台中执行命令NuGet\Install-Packagelog4net-Version2.0.0第二步加帮助类HttpHelperusingSystem;usingSystem.Reflection;usinglog4net;usinglog4net.Config;namespacePuYangHiqs{publicclassLogger{......
  • MFC-只运行一个实例
           ......
  • 显示器不亮主机正常怎么回事详情
    有不少的用户在开机电脑之后听到主机正常的启动了,但是显示器没反应,也并不清楚显示器不亮主机正常怎么回事,因此给大家带来了详细的分析,帮助大家来解决显示器问题。显示器不亮主机正常怎么回事:1、主机能够正常的进入的话,说明电脑没有问题,所以先检查一下数据连接线,如果觉得线路松......
  • python+playwright 学习-50 pytest-playwright 多账号操作解决方案
    前言pytest-playwright插件可以让我们快速编写pytest格式的测试用例,它提供了一个内置的page对象,可以直接打开页面操作。但是有时候我们需要2个账号是操作业务流程,比如A账号创建了一个任务,需要用到B账号去操作审批动作等。如果需要2个账号同时登录,可以使用context上下文,它可......
  • Python源码笔记——Python中的列表对象
    1.列表结构体#definePyObject_VAR_HEADPyVarObjectob_base;typedefstruct{PyObjectob_base;Py_ssize_tob_size;/*Numberofitemsinvariablepart*/}PyVarObject;typedefstruct{PyObject_VAR_HEAD/*Vectorofpointerstolistel......
  • ABC212G
    ABC212G直接做不好做,考虑将\(x,y\)替换成某个幂的形式来试图去掉底数。记\(g\)为\(P\)的原根,那么\(x,y\)一定可以表示成\(g\)的某个在模意义下的幂,不妨设\(x\equivg^{i}(\bmodP),y\equivx^{j}(\bmodP)\)。那么原限制就变为了\(g^{i\timesn}\equivg^{j......
  • 免费分享前端面试题,vue面试题,TypeScript基础知识点 PDF格式
    免费分享前端资料,面试题,电子书接前端开发,带徒弟,一对一教学,远程协助,bug修改微信:......
  • 安装wsl的必备操作——开启CPU虚拟化——WslRegisterDistribution failed with error_
    参考:https://www.cnblogs.com/smdtxz/p/16837946.htmlhttps://www.cnblogs.com/wenonly/p/17206040.htmlhttps://blog.csdn.net/qq_41460654/article/details/118026986  ======================================================  因为实验室需要炼丹,而炼丹要用ubun......
  • 全文索引:Apache Lucene(一)
    做网站门户,全文检索功能必不可少。如何快速、准确的罗列出用户想要的查询结果,是查询的主要目标。模糊查询是最常见的查询,在做单一模块时,我们通常用Like来检索。【like'%张%'】即检索含有'张'字符的项,是从头开始-->的全文匹配。Like的查询原理就是使用索引和匹配算法,如果该......