乐趣区

关于mysql:使用-Docker-在-Centos-上搭建-Mysql-主从

什么是 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 对应的值;从库中设置好同步地位;启动同步。
退出移动版