Mysql 5.7使用Docker配置主从

Mysql 5.7使用Docker配置主从

文章目录

  • Mysql 5.7使用Docker配置主从
    • 01-创建目录
    • 02-配置mysql.cnf
    • 03-启动容器
      • 03.01-创建网络
      • 03.02-修改docker-compose.yml配置
      • 03.03-说明
    • 04-修改my.cnf权限
    • 05-主库锁表
    • 06-主库备份数据
    • 07-查询主库binlog信息
    • 08-从库恢复数据
    • 09-注意事项

01-创建目录

在任意目录创建mysql-HA目录

mysql-HA
├── master     ---- 主库
├── ├──  backup     ---- dump备份文件目录
├── ├──  base     
├── ├──  data     
├── ├──  binlog     ---- 日志文件目录
├── └──  mysql.cnf  ---- mysql配置文件
├── slave1     ---- 从库1
├── ├──  backup     ---- dump备份文件目录
├── ├──  base     
├── ├──  data     
├── ├──  binlog     ---- 日志文件目录
├── └──  mysql.cnf  ---- mysql配置文件
└── slave2     ---- 从库2
├── ├──  backup     ---- dump备份文件目录
├── ├──  base     
├── ├──  data     
├── ├──  binlog     ---- 日志文件目录
├── └──  mysql.cnf  ---- mysql配置文件
└──  docker-compose.yml  ---- docker-compose配置

02-配置mysql.cnf

master 配置文件

[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
port = 3306
socket = /tmp/mysql.sock

basedir = /var/lib/mysql
datadir = /data/mysql/data

###########################################
###############   主从配置   ###############
###########################################
# 必须。设置服务器id,为1表示主服务器。规范为服务器IP的后段
server-id=2
# 主库配置0,从库配置1(0:读写;1只读)
read-only=0
# 主库必须,从库非必须。启动MySQ二进制日志系统。
log-bin=mysql-bin
# 日志格式,磁盘足够的情况下尽量使用ROW
binlog-format=ROW
# 需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行。
binlog-do-db=gdc_platform 
# 设置不要复制的数据库
binlog-ignore-db=mysql 

#设置大小写敏感
lower_case_table_names=1

sql_mode="STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_ENGINE_SUBSTITUTION"

# 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,
# 则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求
skip-name-resolve

#设置字符集
init_connect='SET collation_connection = utf8mb4_unicode_ci'
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake

#设置timestamp可以为null,如果不设置启动报错
explicit_defaults_for_timestamp=true

slave1 配置文件

[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
port = 3306
socket = /tmp/mysql.sock

basedir = /var/lib/mysql
datadir = /data/mysql/data

###########################################
###############   主从配置   ###############
###########################################
# 必须。设置服务器id,为1表示主服务器。规范为服务器IP的后段
server-id=3  
# 主库配置0,从库配置1(0:读写;1只读)
read-only=1
# 主库必须,从库非必须。启动MySQ二进制日志系统。 
log-bin=mysql-bin
# 需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行。
#binlog-do-db=gdc_platform 
# 设置不要复制的数据库
#binlog-ignore-db=mysql 

#设置大小写敏感
lower_case_table_names=1

sql_mode="STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_ENGINE_SUBSTITUTION"

# 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,
# 则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求
skip-name-resolve

#设置字符集
init_connect='SET collation_connection = utf8mb4_unicode_ci'
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake

#设置timestamp可以为null,如果不设置启动报错
explicit_defaults_for_timestamp=true

slave2 配置文件

[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
port = 3306
socket = /tmp/mysql.sock

basedir = /var/lib/mysql
datadir = /data/mysql/data

###########################################
###############   主从配置   ###############
###########################################
# 必须。设置服务器id,为1表示主服务器。规范为服务器IP的后段
server-id=4  
# 主库配置0,从库配置1(0:读写;1只读)
read-only=1
# 主库必须,从库非必须。启动MySQ二进制日志系统。 
log-bin=mysql-bin
# 需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行。
#binlog-do-db=gdc_platform 
# 设置不要复制的数据库
#binlog-ignore-db=mysql 

#设置大小写敏感
lower_case_table_names=1

sql_mode="STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_ENGINE_SUBSTITUTION"

# 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,
# 则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求
skip-name-resolve

#设置字符集
init_connect='SET collation_connection = utf8mb4_unicode_ci'
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake

#设置timestamp可以为null,如果不设置启动报错
explicit_defaults_for_timestamp=true

03-启动容器

03.01-创建网络

docker network create --subnet 172.19.0.0/24 --gateway 172.19.0.1 myNet

03.02-修改docker-compose.yml配置

networks:
    myNet:
        external: true
services:
    mysql-master:
        image: mysql:5.7
        container_name: "mysql-master"
        hostname: "mysql-master" 
        networks:
            myNet:
                ipv4_address: 172.19.0.242
        ports:
            - "3326:3306"
        restart: "no"
        privileged: true
        volumes:
            - ./master/data:/data/mysql/data
            - ./master/base:/var/lib/mysql
            - ./master/binlog:/data/mysql/mysqlbin
            - ./master/backup:/backup
            - ./master/mysql.cnf:/etc/mysql/my.cnf
        environment:
            - SET_CONTAINER_TIMEZONE=true
            - CONTAINER_TIMEZONE=Asia/Shanghai
            - MYSQL_ROOT_PASSWORD=root
    mysql-slave1:
        image: mysql:5.7
        container_name: "mysql-slave1"
        hostname: "mysql-slave1" 
        networks:
            myNet:
                ipv4_address: 172.19.0.243
        ports:
            - "3336:3306"
        restart: "no"
        volumes:
            - ./slave1/data:/data/mysql/data
            - ./slave1/base:/var/lib/mysql
            - ./slave1/binlog:/data/mysql/mysqlbin
            - ./slave1/mysql.cnf:/etc/mysql/my.cnf
            - ./slave1/backup:/backup
        environment:
            - SET_CONTAINER_TIMEZONE=true
            - CONTAINER_TIMEZONE=Asia/Shanghai
            - MYSQL_ROOT_PASSWORD=root
    mysql-slave2:
        image: mysql:5.7
        container_name: "mysql-slave2"
        hostname: "mysql-slave2" 
        networks:
            myNet:
                ipv4_address: 172.19.0.244
        ports:
            - "3346:3306"
        restart: "no"
        volumes:
            - ./slave2/data:/data/mysql/data
            - ./slave2/base:/var/lib/mysql
            - ./slave2/binlog:/data/mysql/mysqlbin
            - ./slave2/mysql.cnf:/etc/mysql/my.cnf
            - ./slave2/backup:/backup
        environment:
            - SET_CONTAINER_TIMEZONE=true
            - CONTAINER_TIMEZONE=Asia/Shanghai
            - MYSQL_ROOT_PASSWORD=root

03.03-说明

  • 在mysql-HA目录下执行docker-compose up- d启动容器
  • masterslave1slave2的IP依次为:172.19.0.242、172.19.0.243、172.19.0.244
  • masterslave1slave2的数据账号密码均为root

04-修改my.cnf权限

因MYSQL限制了配置了my.cnf的文件权限,而windows无法修改,将导致配置文件无法生效,需要通过容器修改文件权限。请按照以下命令依次修改3个容器

# 进入容器
docker exec -it mysql-master bash

#修改权限
chmod 644 /etc/mysql/my.cnf

全部修改完成后,重启容器

05-主库锁表

如果是新数据库,此步骤可省略
实际生产中,大部分情况都是由单库修改为主从结构,为防止同步出现差异,需要先将主库锁表,禁止任何更新操作

flush tables with read lock;

06-主库备份数据

如果是新数据库,此步骤可省略

因主从只会增量同步,不会全量同步,所以启动主从前需要保证主从数据一致,因此需要提前做好备份和回复工作
备份数据方式有多种,可自行选择

  1. dump
mysqldump -uroot -proot --databases gdc_platform >/backup/gdc_platform_`date +%F`.sql

  1. 使用Navicat备份工具

07-查询主库binlog信息

进入主库查询binlog信息

show master status;
File Position Binlog_Do_DB Binlog_Do_DB Executed_Gtid_Set
mysql-bin.000011 1497 gdc_platfom mysql

请记住mysql-bin.0000111497,后面从库配置需要用到

08-从库恢复数据

如果是新数据库,此步骤可省略
恢复数据的方式有很多,此处略

##09-从库启动同步
进入从库依次执行以下命令

# 配置主库信息
CHANGE MASTER TO MASTER_HOST='172.19.0.242', MASTER_PORT=3306, MASTER_USER='root', MASTER_PASSWORD='root', MASTER_LOG_FILE='mysql-bin.000011', MASTER_LOG_POS=1222;
# 启动同步
start SLAVE;

多个slave使用同样的操作

09-注意事项

如果不小心更改了从库的数据,需要重做 06,07,08步骤

你可能感兴趣的:(docker,DataBase,mysql,docker,主从)