使用Docker-Compose搭建MySQL主从同步

760 阅读3分钟

Docker-Compose编写

docker-compose 官方文档链接Mysql - Official Image | Docker Hub

version: '3'
services:
  mysql_master:
    image: mysql:5.7
    container_name: se-master-mysql
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    restart: always
    environment:
      MYSQL_DATABASE: se
      MYSQL_ROOT_PASSWORD: root 
      MYSQL_ROOT_HOST: '%'
      TZ: Asia/Shanghai
    ports:
      - 3305:3306
    expose:
      - 3306
    volumes:
      - /D/dockerFile/se/mysql/data:/var/lib/mysql #数据文件挂载
      - /D/dockerFile/se/mysql/mysql.conf.d:/etc/mysql/mysql.conf.d #配置文件挂载
  mysql_slave:
    image: mysql:5.7
    container_name: se-slave-mysql
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    restart: always
    environment:
      MYSQL_DATABASE: se
      MYSQL_ROOT_PASSWORD: root #设置root帐号密码
      MYSQL_ROOT_HOST: '%'
      TZ: Asia/Shanghai
    ports:
      - 3310:3306
    expose:
      - 3306
    volumes:
      - /D/dockerFile/se/mysql_slave/data:/var/lib/mysql #数据文件挂载
      - /D/dockerFile/se/mysql_slave/mysql.conf.d:/etc/mysql/mysql.conf.d
networks:
  default:
    name: SE

搭建主从复制

  1. 建立用户(两种方法)
  • 在docker-compose中设置了root可以通过任何用户进行访问(MYSQL_ROOT_HOST: '%')
  • 创建user账号
mysql> CREATE user slave;
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'XXX(从服务器IP,可以设置为%)' IDENTIFIED BY '密码'
mysql> FLUSH privileges;

这个配置的含义就是创建了一个数据库用户slave 在从服务器使用repl这个账号和主服务器连接的时候,就赋予其REPLICATION SLAVE的权限, . 表面这个权限是针对主库的所有表的,其中xxx就是从服务器的ip地址。

注意 重启数据库

  1. 配置主服务器.cnf 修改主 MySQL 配置文档 /etc/mysql/mysql.conf.d/mysqld.cnf,在 [mysqld] 段添加以下配置:
[mysqld]
log-bin = mysql-bin
server-id = 1
  1. 查看主服务器是否配置成功
  • sql mysql > show variables like '%log_bin%'; 显示以下结果为成功,其中log_bin 为on,且log_bin_basename 与 log_bin_index 有Value。
+---------------------------------+--------------------------------+
| Variable_name                   | Value                          |
+---------------------------------+--------------------------------+
| log_bin                         | ON                             |
| log_bin_basename                | /var/lib/mysql/mysql-bin       |
| log_bin_index                   | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF                            |
| log_bin_use_v1_row_events       | OFF                            |
| sql_log_bin                     | ON                             |
+---------------------------------+--------------------------------+

查看主库状态

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000008 |      419 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
  1. 配置从服务器 修改从 MySQL 配置文档 /etc/mysql/mysql.conf.d/mysqld.cnf,在 [mysqld] 段添加以下配置:
[mysqld]
server-id = 2
relay_log = slave-relay-bin
  1. 在从服务器配置主从复制
mysql>change master to
master_host='mysql_master',
master_user='slave',
master_log_file='mysql-bin.000008',
master_log_pos=419,
master_port=3306,
master_password='root';
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

参数解释:

master_host='mysql_master' // 这里填 master 主机 ip 
master_log_file='mysql-bin.000008', // 这里填写 File 的值 
master_log_pos=419,// 这里填写 Position 的值。
mysql> start slave;// 启动从服务器复制功能

如果想要重新配置,可以通过sql stop slave;

注意:master_host='mysql_master' 中的'mysql_master' 这里本应该使用ip,但是在docker-compose容器d中其系统内部会自动将'mysql_master'映射为ip,如果希望使用IP,则可以通过一下命令获得主服务器的ip:192.168.224.4 。master_port=3306,这里的端口是容器主机的IP,并不是挂载主机的端口。(expose:暴露出容器将要提供服务所开放的端口,指这个主机的端口别人可以使用访问)
# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.224.4   2ce82c08e502
  1. 查看slave结果
show slave status;

观察:这两个必须是 Yes 为 No 或者 connect 说明没有连接上。

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

6.重启两个容器,使配置生效。

总结

一般情况下数据表是不同步的,先各自在 master 和 salve 创建好。 因为一般来说 master 和 slave 的表的存储引擎是不一样的,master 一般用的是 InnoDB,因为它要写数据比较多。 而 slave 表一般用的是 MyISAM 引擎,因为它是没有写数据操作,只有读,用 MyISAM 引擎能大大节省资源,速度也会快一些。(用于读写分离)