docker搭建mysql主从集群
笔者简单介绍通过docker搭建MySQL集群和主从复制的方法,仅供学习参考使用,生产环境建议通过k8s或者物理机直接搭建。
1.新建目录
在服务器上新建mysql集群目录
mkdir -p mysql-cluster && mkdir -p mysql-cluster/master/data && mkdir -p mysql-cluster/slave1/data && mkdir -p mysql-cluster/slave2/data && touch mysql-cluster/docker-compose.yml && touch mysql-cluster/master/init_master.h && touch mysql-cluster/slave1/slave.sh && touch mysql-cluster/slave2/slave.sh
最终创建的目录结构如下
2.docker-compose写入
编辑 docker-compose文件写入
version: "3.7"
services:
db_master_alex:
image: mysql:8.0
container_name: db_master_alex # 可配置自己
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456 # 可配置
MYSQL_USER: developer # 可配置
MYSQL_PASSWORD: 123456 # 可配置
TZ: Asia/Shanghai
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--default-authentication-plugin=mysql_native_password
--server-id=1
--log-bin=mysql-bin
volumes:
- $PWD/master/data:/var/lib/mysql # 挂载路径
- $PWD/master:/docker-entrypoint-initdb.d # 挂载路径
ports:
- "3306:3306"
networks:
- db_network
db_slave1_alex:
depends_on:
- db_master_alex
image: mysql:8.0
container_name: db_slave1_alex
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_USER: developer
MYSQL_PASSWORD: 123456
TZ: Asia/Shanghai
MYSQL_MASTER_HOST: db_master_alex # master的ip
MYSQL_MASTER_PORT: 3306
MYSQL_MASTER_USER: developer # 用于复制的账号
MYSQL_MASTER_PASSWORD: 123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--default-authentication-plugin=mysql_native_password
--server-id=2
--relay-log=mysql-relay-bin
--log-slave-updates
--read-only=1
volumes:
- $PWD/slave1/data:/var/lib/mysql
- $PWD/slave1:/docker-entrypoint-initdb.d
ports:
- "3307:3306"
networks:
- db_network
db_slave2_alex:
depends_on:
- db_master_alex
image: mysql:8.0
container_name: db_slave2_alex
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_USER: developer
MYSQL_PASSWORD: 123456
TZ: Asia/Shanghai
MYSQL_MASTER_HOST: db_master_alex
MYSQL_MASTER_PORT: 3306
MYSQL_MASTER_USER: developer
MYSQL_MASTER_PASSWORD: 123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--default-authentication-plugin=mysql_native_password
--server-id=3
--relay-log=mysql-relay-bin
--log-slave-updates
--read-only=1
volumes:
- $PWD/slave2/data:/var/lib/mysql
- $PWD/slave2:/docker-entrypoint-initdb.d
ports:
- "3308:3306"
networks:
- db_network
networks:
db_network:
driver: bridge
3.init_master文件
init_master文件写入
#!/bin/bash
MASTER_SYNC_USER=${MYSQL_USER:-develop}
GRANT_PRIVILEGES_SQL="GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO '$MASTER_SYNC_USER'@'%';"
mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "$GRANT_PRIVILEGES_SQL"
4.slave文件写入
#!bin/bash
sleep 20
RESULT=`mysql -u"$MYSQL_MASTER_USER" -h$MYSQL_MASTER_HOST -p"$MYSQL_MASTER_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}'`
SYNC_SQL="change master to master_host='$MYSQL_MASTER_HOST',master_user='$MYSQL_MASTER_USER',master_password='$MYSQL_MASTER_PASSWORD',master_log_file='$LOG_FILE_NAME',master_log_pos=$LOG_FILE_POS;"
#开启同步
START_SYNC_SQL="start slave;USER='$MYSQL_REPLICA_USER' PASSWORD='$MYSQL_REPLICA_PASSWORD';"
#查看同步状态
STATUS_SQL="show slave status\G;"
mysql -uroot -p"$MYSQL_PASSWORD" -e "$SYNC_SQL $START_SYNC_SQL $STATUS_SQL"
5.启动集群
docker-compose up -d
6.进入mysql容器
docker exec -it {{container_name}} bash
mysql -uroot -p{{password}} -e "create database {{db1}}";
如果正常即可观察slave也会同步进行更新。