美文网首页DB优化
docker + mysql 双机热备

docker + mysql 双机热备

作者: 穿越人海zx | 来源:发表于2019-06-23 14:25 被阅读159次

    环境

    centos7
    Docker version 1.12.6
    mysql镜像5.7.5

    主 10.43.124.88 master 3307
    备 10.43.124.89 slave 3307

    一、mysql容器启动脚本准备

    vim /opt/bin/start-mysql-master.sh

    docker run --privileged=true -d -p 3307:3306 --name mysql3307 --network wp-net --network-alias mysql -e MYSQL_ROOT_PASSWORD=sxbctv3306 -v /home/slave/data/mysql:/var/lib/mysql -v /home/slave/conf/my.cnf:/etc/mysql/my.cnf -v /etc/localtime:/etc/localtime:ro  6448ea6ff3b5
    

    vim /opt/bin/start-mysql-slave.sh

    docker run --privileged=true -d -p 3307:3306 --name mysql3307 --network wp-net --network-alias mysql -e MYSQL_ROOT_PASSWORD=sxbctv3306 -v /home/slave/data/mysql:/var/lib/mysql -v /home/slave/conf/my.cnf:/etc/mysql/my.cnf -v /etc/localtime:/etc/localtime:ro  6448ea6ff3b5
    

    【注意】 需要用到挂载的数据库以及mysql的配置文件需要自己提前启动一个mysql容器,然后将数据库和配置文件拷贝到宿主机后再操作下面的步骤

    二、赋予可执行权限

    chmod +x /opt/bin/start-mysql-master.sh
    chmod +x /opt/bin/start-mysql-slave.sh

    三、配置

    1、在master 配置

      进入容器
      docker exec -it mysql3307 bash
    

    在master 的 my.conf 的[mysqld] 下增加
    vi /etc/mysql/my.cnf

    #开启二进制日志
    log-bin=mysql-bin
    #2到232–1之间的一个正整数值,唯一,默认是1,建议使用ip的最后一段
    server-id=90
    #自增id起始值为1
    auto_increment_offset=1
    #自增基数为2,保证id为奇数
    auto_increment_increment=2
    #手动启动同步服务,避免突然宕机导致的数据日志不同步
    skip-slave-start
    #互为主从需要加入这一行
    log-slave-updates
    

    2、启动master的mysql

    在master服务器执行

    ./opt/bin/start-mysql-master.sh
    

    3、slave配置

      进入容器
      docker exec -it mysql3307 bash
    

    在slave的 my.conf 的[mysqld] 下增加
    vi /etc/mysql/my.cnf

    #开启二进制日志
    log-bin=mysql-bin
    #2到232–1之间的一个正整数值,唯一,默认是1,建议使用ip的最后一段
    server-id=90
    #自增id起始值为1
    auto_increment_offset=1
    #自增基数为2,保证id为奇数
    auto_increment_increment=2
    #手动启动同步服务,避免突然宕机导致的数据日志不同步
    skip-slave-start
    #互为主从需要加入这一行
    log-slave-updates
    

    4、启动slave的mysql

    在slave服务器执行

    ./opt/bin/start-mysql-slave.sh
    

    5、查看master status

    执行mysql命令 清空所有的bin-log日志

    mysql>  reset master;
    

    然后执行mysql命令 show master status;查看最新的bin日志。

    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000004 |      592 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    

    上图中的mysql-bin.000004 就是最新的日志文件名称,Position是bin日志结束的位置

    配置主从会使用到

    6、 登陆slave(备)

      进入容器
      docker exec -it mysql3307 bash
      登陆mysql
      mysql -uroot -p123456
    
    # 主从配置
    #master_host是指主机A的ip地址,
    #master_port 主机A的端口,
    #master_uesr是执行同步操作的用户名,
    #master_password是执行同步的用户密码,
    #master_log_file是主机A的bin-log日志,
    #master_log_pos是从bin-log日志开始同步的位置
    
    mysql> change master to master_host='10.43.124.88',
    master_port=3307,
    master_user='backup',
    master_password='backup888',
    master_log_file='mysql-bin.000004',
    master_log_pos=592 ;
    Query OK, 0 rows affected, 9 warnings (0.01 sec)
    
    #开启slave
    mysql> start slave;
    Query OK, 0 rows affected (0.01 sec)
     
    #查看slave的同步情况,重点关注两个指标 Slave_IO_Running: 、 Slave_SQL_Running,如果都是yes,代表同步ok,否则任意一个为No,都是异常。
    #若出现异常,则根据错误日志去排查问题
    mysql> show slave status\G;
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 10.43.124.88
                      Master_User: backup
                      Master_Port: 3307
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000004
              Read_Master_Log_Pos: 120
                   Relay_Log_File: d8134c324dd3-relay-bin.000002
                    Relay_Log_Pos: 283
            Relay_Master_Log_File: mysql-bin.000004
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB: 
              Replicate_Ignore_DB: 
               Replicate_Do_Table: 
           Replicate_Ignore_Table: 
          Replicate_Wild_Do_Table: 
      Replicate_Wild_Ignore_Table: 
                       Last_Errno: 0
                       Last_Error: 
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 120
                  Relay_Log_Space: 463
                  Until_Condition: None
                   Until_Log_File: 
                    Until_Log_Pos: 0
               Master_SSL_Allowed: No
               Master_SSL_CA_File: 
               Master_SSL_CA_Path: 
                  Master_SSL_Cert: 
                Master_SSL_Cipher: 
                   Master_SSL_Key: 
            Seconds_Behind_Master: 0
    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 0
                    Last_IO_Error: 
                   Last_SQL_Errno: 0
                   Last_SQL_Error: 
      Replicate_Ignore_Server_Ids: 
                 Master_Server_Id: 90
                      Master_UUID: 918c8f0b-94f5-11e9-ae31-0242ac110002
                 Master_Info_File: /var/lib/mysql/master.info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
               Master_Retry_Count: 86400
                      Master_Bind: 
          Last_IO_Error_Timestamp: 
         Last_SQL_Error_Timestamp: 
                   Master_SSL_Crl: 
               Master_SSL_Crlpath: 
               Retrieved_Gtid_Set: 
                Executed_Gtid_Set: 
                    Auto_Position: 0
             Replicate_Rewrite_DB: 
    1 row in set (0.00 sec)
    
    ERROR: 
    No query specified
    

    此时配置工作已经完成,可以在master新建数据库,然后在slave去查看

    遇到的问题1

    The slave I/O thread stops because master and slave have equal MySQL server UUIDs
    image.png

    问题是出在主从的auto.cnf 的uuid一样

    [root@localhost ~]# docker exec -it mysql3307 bash
    root@6be3bff282a5:/# cat /var/lib/mysql/auto.cnf 
    [auto]
    server-uuid=918c8f0b-94f5-11e9-ae31-0242ac110002
    

    解决:在slave 中进容器 删除auto.cnf 然后重启slave 的mysql容器

    [root@localhost ~]# docker exec -it mysql3307  bash
    root@d8134c324dd3:/# cat /var/lib/mysql/auto.cnf                                                                                                                      
    [auto]
    server-uuid=918c8f0b-94f5-11e9-ae31-0242ac110002
    

    遇到的问题2

    Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'

    image.png

    在master 刷新binlog flush logs

    mysql> flush logs;
    Query OK, 0 rows affected (0.01 sec)
     
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000003 |      151 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    

    在slave执行

    mysql> reset slave;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> change master to master_host='10.43.124.88',
    master_port=3307,
    master_user='backup',
    master_password='backup888',
    master_log_file='mysql-bin.000004',
    master_log_pos=151;
    Query OK, 0 rows affected, 9 warnings (0.01 sec)
    Query OK, 0 rows affected, 2 warnings (0.01 sec)
     
    mysql> start slave;
    Query OK, 0 rows affected (0.00 sec)
    

    相关文章

      网友评论

        本文标题:docker + mysql 双机热备

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