参考:MariaDB/Mysql的主从复制部署(Docker)
食用方法在结尾
1. docker-compose.yml的编写,首先需要一主一从两个容器,在此定义好要用的镜像,端口映射,挂载卷等。
version: "3"
services:
master_db:
build:
context: ./master
container_name: master
ports:
- "23306:3306"
volumes:
- "/var/docker/master/:/var/lib/mysql"
restart: always
environment:
# 这里需要特别注意一下,这是mysql的密码,我用的是从环境变量中读取的方式,即在当前目录中新建一个.env文件,文件中写入对应的值。
MYSQL_ROOT_PASSWORD:
slave1_db:
build:
context: ./slave1
container_name: slave1
ports:
- "23307:3306"
volumes:
- "/var/docker/slave1/:/var/lib/mysql"
restart: always
environment:
MYSQL_ROOT_PASSWORD:
2. master镜像的构建, Dockerfile如下
# 以mariadb/server镜像为基础,方便自己写的脚本随容器启动运行
FROM mariadb/server
# 添加当前目录中的master_sql.sh到自启动目录
ADD ./master_sql.sh /docker-entrypoint-initdb.d
# 添加当前目录中的master_my.cnf到mysql数据库的配置文件目录中
ADD ./master_my.cnf /etc/mysql/my.cnf
# 定义工作目录(就是进入容器后的默认目录)
WORKDIR /docker-entrypoint-initdb.d
master_sql.sh文件
#! /bin/bash
# mysql账户和密码
USERNAME="root"
USERPASS="123456"
# 用于备份的账户和密码
BACKNAME="backup"
BACKPASS="backup"
# 授予权限
mysql -u${USERNAME} -p${USERPASS} -e "grant replication slave on *.* to '${BACKNAME}'@'%' identified by '${BACKPASS}' "
# 刷新
mysql -u${USERNAME} -p${USERPASS} -e "flush privileges"
# 查看
mysql -u${USERNAME} -p${USERPASS} -e "show master status\G"
my.cnf文件修改部分(我的是从第30行开始)
[mysqld]
# * My Settings
# 主机id,不能重复
server-id=1
# 开启二进制日志
log_bin=master-bin
# 不同步mysql,information_schema, performance_schema这几个库
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
innodb_flush_log_at_trx_commit=1
binlog_format=mixed
3. slave1镜像的构建, Dockerfile如下
FROM mariadb/server
ADD ./slave1_my.cnf /etc/mysql/my.cnf
ADD ./slave_sql.sh /root
WORKDIR /root
slave_sql.sh文件
#! /bin/bash
#----------以下内容修改成自己的-----------
# mysql账号和密码
USERNAME="root"
USERPASS="123456"
# 用于备份的账号和密码
BACKNAME="backup"
BACKWORD="backup"
# 主机配置信息
HOST='192.168.0.106'
PORT=23306
#---------------------分割线-----------------
# 在master容器中运行master_sql.sh进行查看并修改
LOG_FILE='master-bin.000003'
LOG_POS=654
# 停止复制
mysql -u${USERNAME} -p${USERPASS} -e "stop slave"
# 修改主机配置信息
mysql -u${USERNAME} -p${USERPASS} -e "change master to
MASTER_HOST = '${HOST}',
MASTER_USER = '${BACKNAME}',
MASTER_PASSWORD = '${BACKWORD}',
MASTER_PORT = ${PORT},
MASTER_LOG_FILE = '${LOG_FILE}',
MASTER_LOG_POS = ${LOG_POS};"
# 开启复制
mysql -u${USERNAME} -p${USERPASS} -e "start slave"
# 展示配置信息
mysql -u${USERNAME} -p${USERPASS} -e "show slave status\G"
my.cnf文件修改部分(我的是从第30行开始)
[mysqld]
# * My Settings
server-id=2
relay-log-index=slave1-relay-bin.index
relay-log=slave1-relay-bin
relay_log_recovery=1
食用方法
git clone https://github.com/kuprince/mariadb_master_slave_quick.git
进入mariadb_master_slave_quick文件夹,执行
docker-compose up -d
即可;-
docker-composer exec master_db bash
进入master容器,执行sh master_sql.sh
查看File和Position的值;
docker-composer exec slave1_db bash
进入从服务器修改slave_sql.sh中对应的参数,修改完成后保存运行sh slave_sql.sh
查看是否配置成功;
其中clear.sh为清理脚本,只有部署失败或者不需要此环境的时候才需要执行,正常部署环境过程中不需要执行此脚本
最后的最后还是附上地址:
https://github.com/kuprince/mariadb_master_slave_quick/tree/master