在任意目录创建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配置
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
docker network create --subnet 172.19.0.0/24 --gateway 172.19.0.1 myNet
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
- 在mysql-HA目录下执行
docker-compose up- d
启动容器master
、slave1
、slave2
的IP依次为:172.19.0.242、172.19.0.243、172.19.0.244master
、slave1
、slave2
的数据账号密码均为root
因MYSQL限制了配置了my.cnf的文件权限,而windows无法修改,将导致配置文件无法生效,需要通过容器修改文件权限。请按照以下命令依次修改3个容器
# 进入容器
docker exec -it mysql-master bash
#修改权限
chmod 644 /etc/mysql/my.cnf
全部修改完成后,重启容器
如果是新数据库,此步骤可省略
实际生产中,大部分情况都是由单库修改为主从结构,为防止同步出现差异,需要先将主库锁表,禁止任何更新操作
flush tables with read lock;
如果是新数据库,此步骤可省略
因主从只会增量同步,不会全量同步,所以启动主从前需要保证主从数据一致,因此需要提前做好备份和回复工作
备份数据方式有多种,可自行选择
- dump
mysqldump -uroot -proot --databases gdc_platform >/backup/gdc_platform_`date +%F`.sql
- 使用Navicat备份工具
进入主库查询binlog信息
show master status;
File | Position | Binlog_Do_DB | Binlog_Do_DB | Executed_Gtid_Set |
---|---|---|---|---|
mysql-bin.000011 | 1497 | gdc_platfom | mysql |
请记住mysql-bin.000011
和1497
,后面从库配置需要用到
如果是新数据库,此步骤可省略
恢复数据的方式有很多,此处略
##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使用同样的操作
如果不小心更改了从库的数据,需要重做 06,07,08步骤