此文档描述在 Docker 中搭建 MySQL主从集群的过程;该方案在主数据库出现宕机时并不会自行切换至备数据库,备数据库仅提供备份功能;欢迎参与 Rainbond开源社区 提供数据库高可用自动切换方案。
相关信息
数据库类型 | 版本 | 字符编码 |
MySQL | 8.0 | utf8mb4 |
在 Docker 中部署 MySQL 主从集群
在主从服务器中执行以下命令获取镜像:
docker pull bitnami/mysql:8.0.34
创建目录
mkdir -p /opt/mysql/data
chmod 777 /opt/mysql/data
启动主数据库
在主节点上执行以下 Docker 命令:
MYSQL_ROOT_PASSWORD
: 定义 root 用户密码
其余环境变量都保持默认即可。
docker run --name mysql-master --restart=always \
-p 3306:3306 \
-v /opt/mysql/data:/bitnami/mysql/data \
-e MYSQL_ROOT_PASSWORD=Root123456 \
-e MYSQL_REPLICATION_MODE=master \
-e MYSQL_REPLICATION_USER=repl_user \
-e MYSQL_REPLICATION_PASSWORD=repl_password \
-e MYSQL_AUTHENTICATION_PLUGIN=mysql_native_password \
-d bitnami/mysql:8.0.34
启动从数据库
在从节点上执行以下 Docker 命令:
MYSQL_MASTER_HOST
: 指定主节点的地址
MYSQL_MASTER_ROOT_PASSWORD
: 指定主节点的 root 密码
其余环境变量都保持默认即可。
docker run --name mysql-slave --restart=always \
-p 3306:3306 \
-v /opt/mysql/data:/bitnami/mysql/data \
-e MYSQL_MASTER_HOST=<MYSQL_HOST> \
-e MYSQL_MASTER_ROOT_PASSWORD=Root123456 \
-e MYSQL_MASTER_PORT_NUMBER=3306 \
-e MYSQL_REPLICATION_MODE=slave \
-e MYSQL_REPLICATION_USER=repl_user \
-e MYSQL_REPLICATION_PASSWORD=repl_password \
-e MYSQL_AUTHENTICATION_PLUGIN=mysql_native_password \
-d bitnami/mysql:8.0.34
建库验证
在主节点数据库创建 Rainbond 部署所需的数据库,查看从服务器是否同步更新了数据
mysql> create database console;
mysql> create database region;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| console |
| mysql |
| performance_schema |
| region |
| sys |
+--------------------+
5 rows in set (0.00 sec)
数据同步成功,则主从复制部署完成
MySQL 定时备份
在从节点上配置 MySQL 定时备份任务。
mkdir -p /opt/mysql/backup
#!/bin/bash
DATE=`date +%Y%m%d%H`
DB_USER=root
DB_PASS=Root123456
BACKUP_DIR=/opt/mysql/backup
docker exec mysql-slave mysqldump -u$DB_USER -p$DB_PASS -h 127.0.0.1 console > $BACKUP_DIR/rainbond-console-$DATE.sql
gzip $BACKUP_DIR/rainbond-console-$DATE.sql
docker exec mysql-slave mysqldump -u$DB_USER -p$DB_PASS -h 127.0.0.1 region > $BACKUP_DIR/rainbond-region-$DATE.sql
gzip $BACKUP_DIR/rainbond-region-$DATE.sql
find ${BACKUP_DIR} -name "rainbond-*.sql.gz" -type f -mtime +30 -exec rm {} \; > /dev/null 2>&1
$ crontab -e
0 2 * * * bash /opt/mysql/backup/mysql-backup.sh