8、主从复制基础

2021-02-26  本文已影响0人  一个反派人物

1. 介绍

两台或以上数据库实例,通过二进制日志,实现数据的“同步”关系

2 主从复制前提(搭建过程)

  1. 需要2台以上数据库实例,时间同步,网络通畅,Server_id不同,区分不同角色(主库、从库)
  2. 主库开启binlog,建立专用复制用户
  3. 保证主从开启之前的某个时间点,从库数据是和主库一致(补课)
  4. 告知从库:复制user、passwd、IP port 以及复制起点(change master to)
  5. 丛库开启专用的复制线程(三个):Dump thread、IO thread、SQL thread 开启(start slave)

3 主从搭建

使用mysql多实例搭建,3307为主库,3308和3309为从库

3.1 数据库多实例准备

systemctl start mysqld3307
systemctl start mysqld3308
systemctl start mysqld3309

3.2 检查多实例的server_id要求不同

mysql -uroot -p123 -S /data/3307/mysql.sock -e "select @@server_id;"
mysql -uroot -p123 -S /data/3308/mysql.sock -e "select @@server_id;"
mysql -uroot -p123 -S /data/3309/mysql.sock -e "select @@server_id;"

3.3 检查主库binlog开启

mysql -uroot -p123 -S /data/3307/mysql.sock -e "select @@log_bin"
+-----------+
| @@log_bin |
+-----------+
|         1 |
+-----------+

3.4 主库建立复制用户

建立复制用户repl,并授予用户replication slave权限,拥有该权限的账号才能进行主从复制。

[none]>create user repl@'10.0.0.%' identified by '123';
[none]>grant replication slave on *.* to repl@'10.0.0.%' ;

3.5 主库备份恢复到从库

主库全备

mysqldump -uroot -p123 -S /data/3307/mysql.sock -A --master-data=2 --single-transaction > /tmp/full.sql

从库恢复到主库全备时的状态

mysql -S /data/3308/mysql.sock -uroot -p123 < /tmp/full.sql
mysql -S /data/3309/mysql.sock -uroot -p123 < /tmp/full.sql

3.6 从库配置复制信息

#从库中执行
CHANGE MASTER TO
  MASTER_HOST='10.0.0.51',
  MASTER_USER='repl',
  MASTER_PASSWORD='123',
  MASTER_PORT=3307,
  MASTER_LOG_FILE='mysql-bin.000002',
  MASTER_LOG_POS=2129,
  MASTER_CONNECT_RETRY=10;

#参数解释
  MASTER_HOST:          主库的IP地址或域名
  MASTER_USER:          主库上用于复制的账户
  MASTER_PASSWORD:      主库上复制账户的密码
  MASTER_PORT:          主库的端口号
  MASTER_LOG_FILE:      从库已经记录的主库binlog文件,也就是主库全备时的binlog文件,是主从复制的起点文件
  MASTER_LOG_POS:       从库已经记录的主库position号,也就是主库全备时的position号,是主从复制的起点位置
  MASTER_CONNECT_RETRY: 连接失败的重试次数

其中MASTER_LOG_FILEMASTER_LOG_POS两个信息需要从全备文件中获取

[root@db01 ~]$ grep "\-- CHANGE MASTER TO" /tmp/full.sql 

3.7 从库中启动专用复制线程

[(none)]>start slave;

3.8 验证主从状态

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

#需要 Slave_IO_Running 和 Slave_SQL_Running 都为Yes状态

3.9 改变配置后的复制状态重置

如果从库的复制信息改变可以运行一下命令进行主从复制重置

[(none)]>stop slave;
[(none)]>reset slave all;
[(none)]>CHANGE MASTER TO
...;
[(none)]>start slave;

3.10 主从状态错误

3.10.1 Slave_IO_Running: No

查看从服务器的错误日志

2021-02-24T11:30:33.053002Z 14 [ERROR] Slave I/O for channel '': The replication receiver thread cannot start because the master has GTID_MODE = ON and this server has GTID_MODE = OFF. Error_code: 1593

原因:因为主服务器开启了GTID,从服务器没有开启。从服务器也开启GTID后,状态恢复

4 主从复制原理

4.1 主从复制涉及的文件和线程

4.1.1 线程

主库:

从库:

4.1.2 文件

主库:

从库:

  1. relay-log文件:
  1. master.info:
  1. relay-log.info:

4.2 主从复制原理图


文字说明:
  1. S:执行Change master to,IP、Port、USER、Password、binlog位置信息写入到master.info文件,执行start slave(启动SQL、IO线程)
  2. S:连接主库
  3. M:分配Dump_Thread,专门和S的IO_Thread通讯,启用几个从库开启几个线程
  4. S:IO线程请求新binlog日志
  5. M:Dump线程,接收请求,截取binlog日志返回给S的IO线程
  6. S:IO线程接收binlog,日志放在TCP/IP缓存中,此时网络层面返回ACK给主库。主库工作完成。
  7. 与第8步一起进行
  8. S:IO线程将接收的binlog最终写入到relay-log当中,并更新master.info文件的binlog位置信息。IO线程工作结束
  9. S:SQL线程读取relay-log.info,获取上次执行到的位置点
  10. S:SQL线程向后执行新的relay-log
  11. S:SQL线程再次更新relay-log.info

小细节:

  1. S:relay-log 参数relay_log_purge=ON,定期删除应用过的relay-log
  2. M:Dump线程实时监控主库binlog的变化,如果有新变化,发信号给从库。

5 主从监控

5.1 主库方面

mysql> show processlist;
mysql> show slave hosts;

5.2 从库方面

mysql> show slave status \G;

#主库相关信息,来自master.info
                  Master_Host: 10.0.0.51
                  Master_User: repl
                  Master_Port: 3307
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 194

#从库的relay-log执行情况,来自于relay-log.info,一般用于判断主从延时
#目前执行到db01-relay-bin.000008的Position 407,对应主库mysql-bin.000004的Position 194
               Relay_Log_File: db01-relay-bin.000008
                Relay_Log_Pos: 407
        Relay_Master_Log_File: mysql-bin.000004
          Exec_Master_Log_Pos: 194
        Seconds_Behind_Master: 0

#从库线程状态,具体报错信息
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 

#过滤复制相关信息,只复制主库的某些库
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 

#延时从库的配置信息
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL

#GTID相关复制信息
           Retrieved_Gtid_Set: 802c2d06-7673-11eb-a360-000c2951bbce:12
            Executed_Gtid_Set: 802c2d06-7673-11eb-a360-000c2951bbce:1-12

6 主从管理命令

6.1 从库线程管理

#启动所有线程
mysql> start slave;
#关闭所有线程
mysql> stop slave;
#单独控制sql线程
mysql> start slave sql_thread;
mysql> stop slave sql_thread;
#单独控制io线程
mysql> start slave io_thread;
mysql> stop slave io_thread;

6.2 解除从库身份

mysql> reset slave all;
上一篇下一篇

猜你喜欢

热点阅读