【MYSQL】主从复制原理及主从复制环境搭建

一、主从复制原理

  • 原理图
    在这里插入图片描述
  • 原理说明
  1. 主节点 dump 线程
    当从节点连接主节点时,主节点会创建一个log dump 线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对主节点上的bin-log加锁,
    当读取完成,甚至在发动给从节点之前,锁会被释放。
  2. 从节点I/O线程
    当从节点上执行start slave命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。I/O线程接收到主节点binlog dump
    进程发来的更新之后,保存在本地relay-log中。
  3. 从节点SQL线程
    SQL线程负责读取relay log中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。
    对于每一个主从连接,都需要三个进程来完成。当主节点有多个从节点时,主节点会为每一个当前连接的从节点建一个binary log dump 进程,而每个从节点都
    有自己的I/O进程,SQL进程。从节点用两个线程将从主库拉取更新和执 行分成独立的任务,这样在执行同步数据任务的时候,不会降低读操作的性能。比如,
    如果从节点没有运行,此时I/O进程可以很快从主节点获取更新,尽管SQL进程还没有执行。如果在SQL进程执行之前从节点服务停止,至少I/O进 程已经从主节
    点拉取到了最新的变更并且保存在本地relay日志中,当服务再次起来之后,就可以完成数据的同步。
  • 复制步骤
  1. 主库将所有的写操作记录在binlog日志中,并生成log dump线程,将binlog日志传给从库的I/O线程
  2. 从库生成两个线程,一个是I/O线程,另一个是SQL线程
  3. I/O线程去请求主库的binlog日志,并将binlog日志中的文件写入relay log(中继日志)中
  4. SQL线程会读取relay loy中的内容,并解析成具体的操作,来实现主从的操作一致,达到最终数据一致的目的

二、环境搭建

本次环境采用docker部署 简单方便,随用随拉,用完即扔,内心无忧虑,机器无压力。

  • 创建主数据库环境
###拉取镜像稍微等等  可能有点慢
docker pull royeecai/mysql
### 镜像获取完成后创建容器
docker run -itd --name  mysql_master_11 \
--net mynetwork  \
--ip 192.168.77.11 \
-p 3311:3306 \
-v /data/docker/mysql/MAS_mysqlmaster_11:/mysql/dd \
--privileged=true \
royeecai/mysql

###创建完成后即可进入查看下了
docker exec -it mysql_master_11 /bin/bash
### 进入后首先做乳腺操作
#1.启动mysql 服务
 service mysql start
#2.刷新系统环境变量
source /etc/profile
#3获取mysql密码
grep 'password' /mysql/mysqlpassword.log 
#看不懂的小伙伴请结合下图

在这里插入图片描述

  • 创建从数据库环境
###创建从服务器容器 `mysql_slave_12`
docker run -itd --name  mysql_slave_12 \
--net mynetwork  \
--ip 192.168.77.12 \
-p 3312:3306 \
-v /data/docker/mysql/MAS_mysqlslave_01:/mysql/dd \
--privileged=true \
royeecai/mysql
###创建完成后即可进入查看下了
docker exec -it mysql_slave_12 /bin/bash
### 进入后首先做乳腺操作
#1.启动mysql 服务
 service mysql start
#2.刷新系统环境变量
source /etc/profile
#3获取mysql密码
grep 'password' /mysql/mysqlpassword.log 
  • 配置主服务器

修改基础配置

 mysql -uroot -p'3r(Q?Wk8SB0J'
 alter user 'root'@'localhost' identified by 'Cmm@111111';
 ALTER USER 'root'@'localhost' IDENTIFIED BY 'Cmm@111111' PASSWORD EXPIRE NEVER;
 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Cmm@111111';
 FLUSH PRIVILEGES; 

在这里插入图片描述

修改主服务配置文件

在这里插入图片描述

在主库创建复制账户

CREATE USER 'slave'@'192.168.77.%' IDENTIFIED WITH mysql_native_password BY 'slave';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.77.%';
  • 配置从服务器

用户权限配置

 mysql -uroot -p'3r(Q?Wk8SB0J'
 alter user 'root'@'localhost' identified by 'Cmm@111111';
 ALTER USER 'root'@'localhost' IDENTIFIED BY 'Cmm@111111' PASSWORD EXPIRE NEVER;
 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Cmm@111111';
 FLUSH PRIVILEGES; 

配置从库配置文件

vi /etc/my.cnf
在这里插入图片描述

配置从库节点

change master to master_host='192.168.77.11',master_port=3306,\
master_user='slave',master_password='slave',\
master_log_file='mysql-bin.000001',master_log_pos=156;
start slave;

###查看具体节点位置可在主数据库中 执行show master status \G;查看bin-log位置
在这里插入图片描述

特别注意

Slave_IO_Running: No 从库执行start slave 后查看IO进程并未启动。
有可能是bin-log文件指定错误
还有可以是主从mysql 的 uuid重复了
修改uuid

[root@bf529efb00b7 data]# find / -name 'auto.cnf'
/mysql/data/auto.cnf
[root@bf529efb00b7 data]# vi /mysql/data/auto.cnf 

在这里插入图片描述

成功后的状态是这样的

在这里插入图片描述

三、测试效果

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Qcg0223/article/details/108180325