1. 主从复制
1.1 准备多实例环境
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 </tmp/full.sql
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.pngimage.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线程来取新的,来保证复制实时性.
网友评论