本机安装
新建mysql安装目录
新建docker compose 环境变量文件.env
tex
# root 用户密码
ROOT_PASSWORD=123456
# binlog同步用户名
SYNC_USER=sync
# binlog同步用户密码
SYNC_PASSWORD=123456
# 管理员用户名
ADMIN_USER=root
# 管理员密码
ADMIN_PASSWORD=123456
# 容器占用内存资源限制
MEMORY_LIMIT=512M
# 容器占用CPU资源限制
CPU_LIMIT=0.50
# master端口
MASTER_PORT=3358
# slave端口
SLAVE_PORT=3357
新建master目录,新建master初始化脚本文件,并赋予执行权限
bash
# 新建目录
mkdir -p init/master
在master目录下新建master.sh文件
bash
#!/bin/bash
#定义用于同步的用户名
MASTER_SYNC_USER=${MASTER_SYNC_USER:-sync}
#定义用于同步的用户密码
MASTER_SYNC_PASSWORD=${MASTER_SYNC_PASSWORD:-123456}
#定义用于登录mysql的用户名
ADMIN_USER=${ADMIN_USER:-root}
#定义用于登录mysql的用户密码
ADMIN_PASSWORD=${ADMIN_PASSWORD:-123456}
#定义运行登录的host地址
ALLOW_HOST=${ALLOW_HOST:-%}
#定义创建账号的sql语句
CREATE_USER_SQL="CREATE USER '$MASTER_SYNC_USER'@'$ALLOW_HOST' IDENTIFIED BY '$MASTER_SYNC_PASSWORD';"
#定义赋予同步账号权限的sql,这里设置两个权限,REPLICATION SLAVE,属于从节点副本的权限,REPLICATION CLIENT是副本客户端的权限,可以执行show master status语句
GRANT_PRIVILEGES_SQL="GRANT SELECT,REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO '$MASTER_SYNC_USER'@'$ALLOW_HOST';"
#定义刷新权限的sql
FLUSH_PRIVILEGES_SQL="FLUSH PRIVILEGES;"
#执行sql
mysql -u"$ADMIN_USER" -p"$ADMIN_PASSWORD" -e "$CREATE_USER_SQL $GRANT_PRIVILEGES_SQL $FLUSH_PRIVILEGES_SQL"
赋予执行权限
bash
chmod +x master.sh
新建slave目录,新建slave初始化脚本文件,并赋予执行权限
bash
# 新建目录
mkdir -p init/slave
在slave目录下新建slave文件
bash
#!/bin/bash
#定义连接master进行同步的账号
SLAVE_SYNC_USER="${SLAVE_SYNC_USER:-sync}"
#定义连接master进行同步的账号密码
SLAVE_SYNC_PASSWORD="${SLAVE_SYNC_PASSWORD:-123456}"
#定义slave数据库账号
ADMIN_USER="${ADMIN_USER:-root}"
#定义slave数据库密码
ADMIN_PASSWORD="${ADMIN_PASSWORD:-123456}"
#定义连接master数据库host地址
MASTER_HOST="${MASTER_HOST:-%}"
#连接master数据库,查询二进制数据,并解析出logfile和pos,这里同步用户要开启 REPLICATION CLIENT权限,才能使用SHOW MASTER STATUS;
RESULT=`mysql -u"$SLAVE_SYNC_USER" -h$MASTER_HOST -p"$SLAVE_SYNC_PASSWORD" -e "SHOW MASTER STATUS;" | grep -v grep |tail -n +2| awk '{print $1,$2}'`
#解析出logfile
LOG_FILE_NAME=`echo $RESULT | grep -v grep | awk '{print $1}'`
#解析出pos
LOG_FILE_POS=`echo $RESULT | grep -v grep | awk '{print $2}'`
#设置连接master的同步相关信息
SYNC_SQL="change master to master_host='$MASTER_HOST',master_user='$SLAVE_SYNC_USER',master_password='$SLAVE_SYNC_PASSWORD',master_log_file='$LOG_FILE_NAME',master_log_pos=$LOG_FILE_POS,get_master_public_key=1;"
#开启同步
START_SYNC_SQL="start slave;"
#查看同步状态
STATUS_SQL="show slave status\G;"
mysql -u"$ADMIN_USER" -p"$ADMIN_PASSWORD" -e "$SYNC_SQL $START_SYNC_SQL $STATUS_SQL"
赋予执行权限
bash
chmod +x slave.sh
新建docker-compose.yml
文件
yaml
version: '2.2'
services:
master:
image: mysql:8.0.36
container_name: mysql-master
ports:
- '${MASTER_PORT}:3306'
restart: always
hostname: mysql-master
environment:
MYSQL_ROOT_PASSWORD: ${ROOT_PASSWORD}
MASTER_SYNC_USER: ${SYNC_USER}
MASTER_SYNC_PASSWORD: ${SYNC_PASSWORD}
ADMIN_USER: ${ADMIN_USER}
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
TZ: "Asia/Shanghai"
deploy:
resources:
limits:
memory: ${MEMORY_LIMIT}
cpus: ${CPU_LIMIT}
healthcheck:
test: ["CMD","mysqladmin","-uroot","-p$${MYSQL_ROOT_PASSWORD}","ping","-h","localhost"]
timeout: 2s
interval: 10s
retries: 5
start_period: 5s
logging:
options:
max-file: '1'
max-size: '128k'
command:
- "--server-id=1"
- "--character-set-server=utf8mb4"
- "--collation-server=utf8mb4_unicode_ci"
- "--log-bin=mysql-bin"
- "--sync_binlog=1"
- "--binlog-ignore-db=mysql"
- "--binlog-ignore-db=sys"
- "--binlog-ignore-db=performance_schema"
- "--binlog-ignore-db=information_schema"
- "--sql_mode=NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES"
volumes:
- ./init/master:/docker-entrypoint-initdb.d
- ./data/master:/var/lib/mysql
slave:
image: mysql:8.0.36
container_name: mysql-slave
ports:
- '${SLAVE_PORT}:3306'
restart: always
hostname: mysql-slave
environment:
MYSQL_ROOT_PASSWORD: ${ROOT_PASSWORD}
SLAVE_SYNC_USER: ${SYNC_USER}
SLAVE_SYNC_PASSWORD: ${SYNC_PASSWORD}
ADMIN_USER: ${ADMIN_USER}
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
MASTER_HOST: "mysql-master"
TZ: "Asia/Shanghai"
healthcheck:
test: ["CMD","mysqladmin","-uroot","-p$${MYSQL_ROOT_PASSWORD}","ping","-h","localhost"]
timeout: 2s
interval: 10s
retries: 5
start_period: 5s
deploy:
resources:
limits:
memory: ${MEMORY_LIMIT}
cpus: ${CPU_LIMIT}
logging:
options:
max-file: '1'
max-size: '128k'
depends_on:
master:
condition: service_healthy
command:
- "--server-id=2"
- "--character-set-server=utf8mb4"
- "--collation-server=utf8mb4_unicode_ci"
- "--sql_mode=NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES"
volumes:
- ./init/slave:/docker-entrypoint-initdb.d
- ./data/slave:/var/lib/mysql
启动命令
bash
docker-compose up -d