使用 Docker 在 Centos 上搭建 Mysql 主从复制

hellcox

什么是 Mysql 主从

主从是包含一个主库和一个或多个从库,主库中的数据会同步到各个从库当中。

主从复制原理

  • 1、当 master 节点进行 insert、update、delete 操作时,会按顺序写入到 binlog 中。
  • 2、salve 从库连接 master 主库,master 有多少个 slave 就会创建多少个 binlog dump 线程。
  • 3、当 Master 节点的 binlog 发生变化时,binlog dump 线程会通知所有的 salve 节点,并将相应的 binlog 内容推送给slave节点。
  • 4、I/O 线程接收到 binlog 内容后,将内容写入到本地的 relay-log。
  • 5、SQL 线程读取 I/O 线程写入的 relay-log,并且根据 relay-log 的内容对从数据库做对应的操作。
    主从复制原理图

主从的作用

  • 实现读写分离
  • 读写分离可提高数据库的并发能力
  • 当备份数据
  • 使用适当中间件可以实现数据库的高可用

搭建主从环境

主库搭建

  • 拉取数据库镜像,这里使用的是 Mysql5.7镜像
  • 创建主库容器

    docker run -d --name master -p 3307:3306 -v /www/m2/master/conf/:/etc/mysql/conf.d -v /www/m2/master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7
  • 主库配置 my.conf

    # mysql 配置项
    [client]
    port=3306
    user=mysql
    default-character-set=utf8mb4
    [mysql]
    default-character-set=utf8mb4
    [mysqld]
    port=3306
    user=mysql
    character-set-server = utf8mb4
    default-time_zone = '+8:00'
    server_id=1
    log_bin=mysql-bin
    binlog_format=ROW
    slow-query-log-file=/logs/slow-query.log
    long_query_time=1
  • 进入容器链接上mysql并新增test用户用于从库同步

    docker exec master -it /bin/bash
    mysql -uroot -proot
    # 配置test用户和权限(密码也为test)
    grant replication slave on *.* to 'test'@'%' identified by 'test';
    flush privileges;
    #这里的grant replication slave是一个命令格式,表示赋予后面的账户以复制的权限。
  • 查看master节点的binlog状态

    show master status\G;
    #记住File和Position的值,在从库配置中会使用。

从库搭建

  • 创建镜像

    docker run -d --name slave --privileged=true --link master:master -p 3308:3306 -v /www/m2/salve/conf/:/etc/mysql/conf.d -v /www/m2/salve/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7
  • 从库配置 my.conf

    # mysql 配置项
    [client]
    port=3306
    user=mysql
    default-character-set=utf8mb4
    [mysql]
    default-character-set=utf8mb4
    [mysqld]
    port=3306
    user=mysql
    character-set-server = utf8mb4
    default-time_zone = '+8:00'
    server_id=2
    log-bin=mysql-slave-bin
    relay_log=mysql-relay-bin
  • 进入容器并链接主库

    docker exec slave -it /bin/bash
    mysql -uroot -proot
    # mysql 命令
    # 链接主库配置
    change master to master_host='172.17.0.4', master_user='test', master_password='test', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=313, master_connect_retry=30;
    # 启动从库
    start slave;
    # 查看从库状态
    show slave status\G;
    • 上述change命令中,master_user,master_password 为配置主库时为从库设置的账号和密码;master_port 为主库容器中 mysql 的端口,不要写成主机映射到主库容器的端口了;master_log_file,master_log_pos 这两项为配置主库时查询的值,指定同步位置。
    • show slave status 状态说明

      mysql> show slave status\G;
      *************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.17.0.4
                  Master_User: test
                  Master_Port: 3306
                Connect_Retry: 30
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 622
               Relay_Log_File: edu-mysql-relay-bin.000003
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             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: 622
              Relay_Log_Space: 1006
              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: 1
                  Master_UUID: 1cdd11f9-a256-11eb-8d55-0242ac110004
             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: 
                 Channel_Name: 
           Master_TLS_Version: 
      

      当 Slave_IO_Running , Slave_SQL_Running 均为YES时,表示启动成功。在主库中的操作可成功同步到从库。

遇到过的问题

  • 从库链接主库提示失败
    show slave status中提示:

    Last_IO_Error: error connecting to master 'test@172.17.0.4:3307' - retry-time: 30  retries: 1

    主要原因:host 错误;账号密码错误;端口错误,之前有写成3307主机映射端口导致链接失败;

  • Slave_SQL_Running:NO 同步数据中断

    方法一:跳过引起中断的错误
    mysql> stop slave ;
    mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
    mysql> start slave ;
    
    方法二:重新设置同步位置
    首先停掉Slave服务:mysql> slave stop;
    到主服务器上查看主机状态,记录File和Position对应的值;
    从库中设置好同步位置;
    启动同步。
阅读 127

我愿代替她的双眼,看繁花似锦云卷云舒;我愿成为她的双脚,踏遍天涯海角山川万里。

5 声望
0 粉丝
0 条评论
你知道吗?

我愿代替她的双眼,看繁花似锦云卷云舒;我愿成为她的双脚,踏遍天涯海角山川万里。

5 声望
0 粉丝
宣传栏