docker下的mysql主从复制初探

314 阅读2分钟

记录一下自己配置调试的过程

使用的环境及工具

  • docker-compose,docker-ce
  • navcat
  • vm,ubuntu_server-14.04,mysql-5.7.25

步奏

  • 拉取mysql镜像
docker pull mysql=5.7
  • 使用docker-compose.yml 编排 容器, 我的配置如下
version: '3'
services:
    db_m:
      image: mysql:5.7
      container_name: master
      ports:
        - "3310:3306"
      environment:
        MYSQL_ROOT_PASSWORD: future
        MYSQL_DATABASE: my_test
        LANG: C.UTF-8
      volumes:
        - ./data/master:/var/lib/mysql
        - ./config/master:/etc/mysql/mysql.conf.d/

      command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']
      #restart:always
    db_s:
      image: mysql:5.7
      container_name: slave
      ports:
        - "3311:3306"
      environment:
        MYSQL_ROOT_PASSWORD: future
        MYSQL_DATABASE: my_test
        LANG: C.UTF-8
      volumes:
        - ./data/slave:/var/lib/mysql
        - ./config/slave:/etc/mysql/mysql.conf.d/
      command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']
      #restart:always

目的是创建一主一从两个mysql的容器,将mysql端口分别带出来,设置好root用户的密码以及字符格式,最重要的是 将mysql的data数据映射出来,再映射一个配置文件的目录

  • 创建容器
docker-compose up -d
  • 容器创建好了之后就要配置2个mysql,我的配置如下

主:

[mysqld]
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
datadir		= /var/lib/mysql
#log-error	= /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address	= 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# my settings
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,
NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"
server-id = 100
log-bin=/var/lib/mysql/mysql-bin.log
binlog-do-db=my_test

从:

[mysqld]
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
datadir		= /var/lib/mysql
#log-error	= /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address	= 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# my settings
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,
NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"
server-id = 101
log-bin=/var/lib/mysql/mysql-bin_slave.log
replicate-do-db=my_test
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60 

需要设置sql_mode,不然有些sql语句不能执行,设置2个mysql的server-id,设置成不同的就可以了,再打开mysql的bin-log.

  • 在主库创建从库同步的用户
grant replication client , replication slave on *.* to sla@'%' identified by 'sla_123';
flush privileges;

这里我是在navcat里执行的

  • 手动同步数据
cp ./data/master ./data/slave

这里是将保证从库跟主库数据文件一致,再查看gtid

show global variables like 'gtid_executed'

在主库跟从库中分别执行,检查gtid是否一致。

  • 设置主从关系,在从库中执行
top slave;
change master to master_host = '192.168.40.132',
master_port = 3310,master_user = 'sla',master_password='sla_123';
start slave;

这里的master_host 是我虚拟机的ip,port是主库带出来的端口

验证

  • 检查主从关系是否配置成功,验证主从复制功能是否实现

在从库中执行

show slave status
  • 验证主从复制功能

在主库中新建一张表,并添加一些数据,打开从库,可发现从库也存在该表,数据也是一致的,此时,docker下的mysql主从复制功能就基本上实现了

结尾

另外喜欢封面图片的朋友还可以去这里看看

此文章仅为记录所用
by chuandong