mysql docker 主从配置

主从复制相关

前置条件:

docker安装的mysql是5.7.26版本

1. 编排docker-compose文件如下:

version: '3'
services:
  mysql-master:
    volumes: # 挂载数据卷,因为docker如果重新启动容器之后mysql的数据会清空,因此这里采取持久化,挂载到本地文件夹
      - '/etc/mysql/master/data:/var/lib/mysql'
    container_name: masterNode #自定义生成的容器名称
    build:
      context: ./
      dockerfile: master/Dockerfile
    environment:
      - 'MYSQL_ROOT_PASSWORD=123456'
    links:
      - mysql-slave
    ports:
      - '3306:3306'
    restart: always
    hostname: mysql-master
  mysql-slave:
    volumes:
      - '/etc/mysql/slave/data:/var/lib/mysql'
    container_name: slaveNode
    build:
      context: ./
      dockerfile: slave/Dockerfile
    environment:
      - 'MYSQL_ROOT_PASSWORD=123456'
    ports:
      - '3307:3306'
    restart: always
    hostname: mysql-slave

目录结构如下:

docker-compose.yml

master

​      Dockerfile

​      my.cnf

slave

​    Dockerfile

​    my.cnf

master下Dockerfile

FROM mysql:5.7.26
MAINTAINER YTJ
ADD ./master/my.cnf /etc/mysql/my.cnf

my.cnf如下:

[mysqld]
## 设置server_id,一般设置为IP,注意要唯一
server_id=100
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log-bin=replicas-mysql-bin
## 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

slave下Dockerfile

FROM mysql:5.7.26
MAINTAINER YTJ
ADD ./slave/my.cnf /etc/mysql/my.cnf

my.cnf如下:

[mysqld]
## 设置server_id,一般设置为IP,注意要唯一
server_id=101
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=replicas-mysql-slave-bin
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=replicas-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1

2 .docker-compose up -d启动服务

3. 配置master

docker exec -it <master_containter_id> /bin/bash进入master内部

mysql -u root -p 输入密码123456进入mysql命令行

创建数据库同步用户:

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

查看master状态:show master status;

1557904009549

File和Position对应的值后面要用到。

4. 配置slave

进入mysql命令行

连接master:

change master to master_host='masterNode', master_user='testSyn', master_password='123456', master_port=3306, master_log_file='replicas-mysql-bin.000003', master_log_pos=621, master_connect_retry=30;

master_host: Master 的IP地址

master_user: 在 Master 中授权的用于数据同步的用户

master_password: 同步数据的用户的密码

master_port: Master 的数据库的端口号

master_log_file: 指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值

master_log_pos: 从哪个 Position 开始读,即上文中提到的 Position 字段的值

master_connect_retry: 当重新建立主从连接时,如果连接失败,重试的时间间隔,单位是秒,默认是60秒。

查看从库状态:show slave status G;Slave_IO_Running,和Slave_SQL_Running都是NO

启动slave:start slave;

show slave status G;

当你准备好了,机会来临的时候,你才能抓住
原文地址:https://www.cnblogs.com/studentytj/p/10899218.html