美文网首页
MySQL主从复制搭建

MySQL主从复制搭建

作者: 新_WX | 来源:发表于2019-08-16 17:53 被阅读0次

    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 </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.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主从复制搭建

          本文链接:https://www.haomeiwen.com/subject/spmqsctx.html