MySQL主从复制搭建

MySQL主从复制简介

1. 主从复制

1.1 准备多实例环境

MySQL多实例环境准备(复制粘贴)

1.2 检查主库binlog,不同server_id,server_uuid;

[root@db01 ~]$ mysql -S /data/3307/mysql.sock -e "select @@log_bin;select @@server_id"
[root@db01 ~]$ mysql -S /data/3308/mysql.sock -e "select @@log_bin;select @@server_id"

1.3 主库创建复制用户

[root@db01 ~]# mysql -S /data/3307/mysql.sock -e "grant replication slave on *.* to repl@'10.0.0.%' identified by '123';"
[root@db01 ~]# mysql -S /data/3307/mysql.sock -e "select user,host from mysql.user where user='repl';"

1.4 主库备份全库数据,从库导入数据

[root@db01 ~]$ mysqldump -S /data/3307/mysql.sock -A -R -E --triggers --master-data=2 --single-transaction --max-allowed-packet=128M >/tmp/full.sql
[root@db01 ~]$ mysql -S /data/3308/mysql.sock 

1.5 告知从库,用户名,密码,ip,port,自动复制的起点

>> help获取帮助,截取命令并且修改执行
mysql[(none)]>help change master to;
CHANGE MASTER TO
  MASTER_HOST='10.0.0.51',
  MASTER_USER='repl',
  MASTER_PASSWORD='123',
  MASTER_PORT=3307,
  MASTER_LOG_FILE='mysql-bin.000006',
  MASTER_LOG_POS=444,
  MASTER_CONNECT_RETRY=10;

>> 查看备份文件的内容找到需要的内容
[root@db01 ~]$ vim /tmp/full.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=444;

1.6 启动复制线程

>> 在从库执行
[root@db01 ~]$ mysql -S /data/3308/mysql.sock
mysql[(none)]>start slave;

1.7 检测主从状态(两个Yes)

[root@db01 ~]$ mysql -S /data/3308/mysql.sock -e "show slave status\G" | grep Running:
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

命令简单补充

stop slave;                    关闭主从复制
reset slave all;               清理从库信息
start slave;                   开启主从复制
stop slave IO_thread;          关闭io线程
stop slave sql_thread;         关闭sql线程
故障解决

问题一:

image.png
>> 停止从库
stop slave;                              停止复制
reset slave all;                         重新加载复制
CHANGE MASTER TO
  MASTER_HOST='10.0.0.51',
  MASTER_USER='repl',
  MASTER_PASSWORD='123',
  MASTER_PORT=3307,
  MASTER_LOG_FILE='mysql-bin.000006',
  MASTER_LOG_POS=444,
  MASTER_CONNECT_RETRY=10;

问题二:

RK${4S9]$YOB6_~T8%LZU)U.png

数据库无法连接,检查用户端口ip
解决方法如问题一

2. 主从复制原理

2.1 主从复制过程中涉及到的文件

主库:
binlog日志

cd /data/3307/
-rw-r----- 1 mysql mysql   177 Aug  6 20:18 mysql-bin.000001
-rw-r----- 1 mysql mysql   177 Aug 14 09:58 mysql-bin.000002
-rw-r----- 1 mysql mysql   177 Aug 16 17:27 mysql-bin.000003
-rw-r----- 1 mysql mysql   177 Aug 16 17:28 mysql-bin.000004
-rw-r----- 1 mysql mysql   177 Aug 16 17:29 mysql-bin.000005
-rw-r----- 1 mysql mysql   444 Aug 16 17:37 mysql-bin.000006
-rw-r----- 1 mysql mysql   168 Aug 16 17:29 mysql-bin.index

从库:
relaylog日志,中继

cd /data/3308/data
-rw-r----- 1 mysql mysql      206 Aug 16 17:50 db01-relay-bin.000001
-rw-r----- 1 mysql mysql      320 Aug 16 17:50 db01-relay-bin.000002
-rw-r----- 1 mysql mysql       48 Aug 16 17:50 db01-relay-bin.index

master.info 主库信息文件(连接信息)

cd /data/3308/data
-rw-r----- 1 mysql mysql      119 Aug 16 18:30 master.info

relay-log.info 中继日志信息文件

-rw-r----- 1 mysql mysql       58 Aug 16 17:50 relay-log.info

2.2 主从复制中涉及到的线程

主库:
Binlog_dump_Thread(二进制日志投递线程)

>> 查看方法
[root@db01 ~]$ mysql -S /data/3307/mysql.sock -e "show processlist;"

从库:
Slave_IO_Thread
Slave_SQL_Thread

2.3 原理

image.png

image.png
1.change master to 时,ip pot user password binlog position写入到master.info进行记录
2. start slave 时,从库会启动IO线程和SQL线程
3.IO_T,读取master.info信息,获取主库信息连接主库
4. 主库会生成一个准备binlog DUMP线程,来响应从库
5. IO_T根据master.info记录的binlog文件名和position号,请求主库DUMP最新日志
6. DUMP线程检查主库的binlog日志,如果有新的,TP(传送)给从从库的IO_T
7. IO_T将收到的日志存储到了TCP/IP 缓存,立即返回ACK给主库 ,主库工作完成
8.IO_T将缓存中的数据,存储到relay-log日志文件,更新master.info文件binlog 文件名和postion,IO_T工作完成
9.SQL_T读取relay-log.info文件,获取到上次执行到的relay-log的位置,作为起点,回放relay-log
10.SQL_T回放完成之后,会更新relay-log.info文件。
11. relay-log会有自动清理的功能。
细节:
1.主库一旦有新的日志生成,会发送“信号”给binlog dump ,IO线程再请求

猜猜我是谁

>> 1. 主从复制前提 
(1) 两台节点
(2) 二进制日志
(3) server_id不同,uuid
(4) 复制用户
(5) 备份恢复数据到从
(6) 复制信息提供(change master to)
(7) 开线程(start slave)


>> 2. 主从复制的原理
(1) 从库,change master to(ip port user password binlog pos),存master.info
(2) 从库,start slave,开启 IO和SQL 
(3) 从库IO,读master.info,连接主库,主库开启binlog_dump_T
(4) 从库IO,读master.info,根据记录的位置号,请求最新的.
(5) 主库dump进行TP,最新的binlog,给从库IO 
(6) 从库IO接收,存储到TCP/IP缓存,在TCP/IP层面返回ACK给主库
(7) 从库IO,将缓存数据,落地到relay-log中,并更新master.info 二进制日志信息
(8) 从库SQL,读取relay.info ,获取上次已经执行 到的relay-log的信息,继续回放最新的relay
(9) SQL更新relay.info为最新状态
(10) 补充1: relay-log会自动被定时清理
(11) 补充2: 主库一旦有新的binlog更新,dump会有信号通知,告知IO线程来取新的,来保证复制实时性.

你可能感兴趣的:(MySQL主从复制搭建)