Docker下Mysql主从环境搭建

2020-02-02  本文已影响0人  Jinziyan2020

Mysql主从介绍

image.png

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

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

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

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

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

基于Docker的Mysql主从复制搭建

为什么基于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;

命令参数说明:

执行以上语句后即完成了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

上一篇下一篇

猜你喜欢

热点阅读