美文网首页
Docker下Mysql主从环境搭建

Docker下Mysql主从环境搭建

作者: Jinziyan2020 | 来源:发表于2020-02-02 17:02 被阅读0次

    Mysql主从介绍

    image.png

    Mysql服务器之间的主从同步是基于二进制日志机制,主服务器使用二进制日志来记录数据库的变动情况,从服务器通过读取和执行该日志文件来保持和主服务器的数据一致。

    在使用二进制日志时,主服务器的所有操作都会被记录下来,然后从服务器会接收到该日志的一个副本。从服务器可以指定执行该日志中的哪一类事件(譬如只插入数据或者只更新数据),默认会执行日志中的所有语句。

    每一个从服务器会记录关于二进制日志的信息:文件名和已经处理过的语句,这样意味着不同的从服务器可以分别执行同一个二进制日志的不同部分,并且从服务器可以随时连接或者中断和服务器的连接。

    主服务器和每一个从服务器都必须配置一个唯一的ID号(在my.cnf文件的[mysqld]模块下有一个server-id配置项),另外,每一个从服务器还需要通过CHANGE MASTER TO语句来配置它要连接的主服务器的ip地址,日志文件名称和该日志里面的位置(这些信息存储在主服务器的数据库里)

    Mysql的主从结构可以是一主一从,也可是一主多从,本次我们配置的是一主一从结构,做主从结构后除了可以更好地保障数据安全以外,还可以在应用程序层级做读写分离来减轻主库的压力。

    基于Docker的Mysql主从复制搭建

    为什么基于Docker搭建?

    • 资源有限
    • 虚拟机搭建对机器配置有要求,并且安装mysql步骤繁琐
    • 一台机器上可以运行多个Docker容器
    • Docker容器之间相互独立,有独立ip,互不冲突
    • Docker使用步骤简便,启动容器在秒级别

    利用Docker搭建主从服务器

    首先拉取docker镜像,我们这里使用5.7版本的mysql,为了方便两个容器的管理,我们使用docker compose来编排容器,创建内容如下的docker-compose.yaml文件:

    version: '2'
    services:
      mysql-master:
        image: daocloud.io/library/mysql:5.7
        ports:
          - "6033:3306"
        restart: always
        environment:
          - MYSQL_ROOT_PASSWORD=123456
          - MYSQL_DATABASE=test
          - MYSQL_USER=mysql
          - MYSQL_PASSWORD=123456
        volumes:
          - /data/mysql/master/mysql:/var/lib/mysql
          - /data/mysql/master/mysql.conf.d:/etc/mysql/conf.d
        tty: true
        networks:
          extnetwork:
            ipv4_address: 172.19.0.2
    
      mysql-slave1:
        image: daocloud.io/library/mysql:5.7
        ports:
          - "6034:3306"
        restart: always
        environment:
          - MYSQL_ROOT_PASSWORD=123456
          - MYSQL_DATABASE=test
          - MYSQL_USER=mysql
          - MYSQL_PASSWORD=123456
        volumes:
          - /data/mysql/slave1/mysql:/var/lib/mysql
          - /data/mysql/slave1/mysql.conf.d:/etc/mysql/conf.d
        tty: true
        networks:
          extnetwork:
            ipv4_address: 172.19.0.3
    
    networks:
       extnetwork:
         ipam:
           config:
           - subnet: 172.19.0.0/16
             gateway: 172.19.0.1
    
    

    这里我们为容器指定了IP,之所以这样做是为了方便我们后面做主从关联,若是IP变动会影响到我们的配置,不方便后续的维护。

    Master节点配置

    Master节点的Mysql配置如下:

    [client]
    default-character-set = utf8mb4
    [mysql]
    default-character-set = utf8mb4
    [mysqld]
    character-set-client-handshake = FALSE
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci
    ## 开启二进制日志功能
    log-bin=mysql-bin
    ## 设置server_id,注意要唯一
    server-id=1
    

    配置log-bin来开启Mysql的binlog,注意同一个网段的server-id要唯一。

    Slave节点配置

    Slave节点的Mysql配置如下:

    [client]
    default-character-set = utf8mb4
    [mysql]
    default-character-set = utf8mb4
    [mysqld]
    character-set-client-handshake = FALSE
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci
    ## 设置server_id,注意要唯一
    server-id=2
    ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
    log-bin=mysql-slave-bin
    ## relay_log配置中继日志
    relay_log=edu-mysql-relay-bin
    

    Slave节点同样也开启binlog,当需要做一主多从配置时可以用到。

    启动两个容器

    执行命令启动两个容器:

    docker-compose up -d
    

    使用命令docker-compose up就可以启动两个容器了,参数-d是代表后台运行。

    Master节点创建数据同步用户

    进入Master节点,连接Mysql后执行命令创建用户并授权:

    [root@test mysql]# docker-compose exec mysql-master bash
    root@32a54dc94d52:/# mysql -u root -p
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 3
    Server version: 5.7.26-log MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql>
    
    

    创建用户并授权:

    CREATE USER 'slave'@'%' IDENTIFIED BY 'slave';
    
    GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
    

    查看Master节点状态:

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

    注意记录一下这里的File和Position的值,等会儿我们在配置Slave节点的时候需要用到。

    slave节点数据同步配置

    进入Slave节点,连接Mysql后执行命令配置数据同步:

    [root@test mysql]# docker-compose exec mysql-slave1 bash
    root@66452a954494:/# mysql -u root -p
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 4
    Server version: 5.7.26-log MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql>
    
    

    配置数据同步:

    change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000009', master_log_pos= 154, master_connect_retry=30;
    
    

    命令参数说明:

    • master_host :Master的地址,指的是容器的独立ip
    • master_port:Master的端口号,指的是容器的端口号
    • master_user:用于数据同步的用户
    • master_password:用于同步的用户的密码
    • master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
    • master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
    • master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

    执行以上语句后即完成了Slave节点的数据同步配置,但是此时数据同步还并未生效,使用show slave status \G 查看Slave节点运行状态,可以发现SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。我们需要使用命令start slave来启动数据同步。

    启动数据同步后,再次使用命令show slave status \G 查看Slave节点运行状态,注意命令没有分号:

    mysql> show slave status \G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 172.19.0.2
                      Master_User: slave
                      Master_Port: 3306
                    Connect_Retry: 30
                  Master_Log_File: mysql-bin.000009
              Read_Master_Log_Pos: 154
                   Relay_Log_File: edu-mysql-relay-bin.000008
                    Relay_Log_Pos: 367
            Relay_Master_Log_File: mysql-bin.000009
                 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: 154
                  Relay_Log_Space: 744
                  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: 58d124fb-44fe-11ea-b51e-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:
                     Channel_Name:
               Master_TLS_Version:
    1 row in set (0.00 sec)
    
    

    可以看到上面的Slave_IO_Running和Slave_SQL_Running项都为Yes,Slave节点配置完成了。

    使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据 Last_IO_Error提示予以排除。

    1. 网络不通
    2. 检查ip,端口
    3. 密码不对,检查是否创建用于同步的用户和用户密码是否正确
    4. pos不对,检查Master的 Position

    主从复制测试

    在Master节点的test数据库创建一张表test,里面只有cguid和name两个字段,然后查看Slave节点的test库中是否也自己创建了test表。
    在Master节点建表:

    mysql> use test;
    Database changed
    mysql> CREATE TABLE `test` (
        -> `cguid`  bigint(20) NOT NULL COMMENT '' ,
        -> `name`  varchar(8) CHARACTER SET utf8mb4 NULL DEFAULT '' COMMENT ''
        -> );
    Query OK, 0 rows affected (0.12 sec)
    
    mysql>
    
    

    在Slave节点查看表:

    mysql> use test;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | test           |
    +----------------+
    1 row in set (0.00 sec)
    
    mysql>
    
    

    可以看到,在Master做的操作,自动同步到了Slave节点上,到此我们的Mysql主从结构就搭建完成了。

    本文参考了:https://www.cnblogs.com/songwenjie/p/9371422.html

    相关文章

      网友评论

          本文标题:Docker下Mysql主从环境搭建

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