部署 MySQL 主从集群

此文档描述在 DockerCentos 7 中搭建 MySQL主从集群的过程;该方案在主数据库出现宕机时并不会自行切换至备数据库,备数据库仅提供备份功能;欢迎参与 Rainbond开源社区 提供数据库高可用自动切换方案。

相关信息

数据库类型版本字符编码
MySQL8.0utf8mb4

在 Docker 中部署 MySQL 主从集群

部署 MySQL 主从集群 - 图1info

采用 Bitnami 打包的 MySQL 镜像。

在主从服务器中执行以下命令获取镜像:

  1. docker pull bitnami/mysql:8.0.34

创建目录

  1. mkdir -p /opt/mysql/data
  2. chmod 777 /opt/mysql/data

启动主数据库

在主节点上执行以下 Docker 命令:

  • MYSQL_ROOT_PASSWORD: 定义 root 用户密码

其余环境变量都保持默认即可。

  1. docker run --name mysql-master --restart=always \
  2. -p 3306:3306 \
  3. -v /opt/mysql/data:/bitnami/mysql/data \
  4. -e MYSQL_ROOT_PASSWORD=Root123456 \
  5. -e MYSQL_REPLICATION_MODE=master \
  6. -e MYSQL_REPLICATION_USER=repl_user \
  7. -e MYSQL_REPLICATION_PASSWORD=repl_password \
  8. -e MYSQL_AUTHENTICATION_PLUGIN=mysql_native_password \
  9. -d bitnami/mysql:8.0.34

启动从数据库

在从节点上执行以下 Docker 命令:

  • MYSQL_MASTER_HOST: 指定主节点的地址
  • MYSQL_MASTER_ROOT_PASSWORD: 指定主节点的 root 密码

其余环境变量都保持默认即可。

  1. docker run --name mysql-slave --restart=always \
  2. -p 3306:3306 \
  3. -v /opt/mysql/data:/bitnami/mysql/data \
  4. -e MYSQL_MASTER_HOST=<MYSQL_HOST> \
  5. -e MYSQL_MASTER_ROOT_PASSWORD=Root123456 \
  6. -e MYSQL_MASTER_PORT_NUMBER=3306 \
  7. -e MYSQL_REPLICATION_MODE=slave \
  8. -e MYSQL_REPLICATION_USER=repl_user \
  9. -e MYSQL_REPLICATION_PASSWORD=repl_password \
  10. -e MYSQL_AUTHENTICATION_PLUGIN=mysql_native_password \
  11. -d bitnami/mysql:8.0.34

建库验证

在主节点数据库创建 Rainbond 部署所需的数据库,查看从服务器是否同步更新了数据

  • 在主节点创建数据库
  1. mysql> create database console;
  2. mysql> create database region;
  • 在从节点数据库中查看
  1. mysql> show databases;
  2. +--------------------+
  3. | Database |
  4. +--------------------+
  5. | information_schema |
  6. | console |
  7. | mysql |
  8. | performance_schema |
  9. | region |
  10. | sys |
  11. +--------------------+
  12. 5 rows in set (0.00 sec)

数据同步成功,则主从复制部署完成

在 Centos 7 中部署 MySQL 主从集群

参阅社区文档 在 Centos7 安装 MySQL 主从集群

MySQL 定时备份

在从节点上配置 MySQL 定时备份任务。

  • 创建目录
  1. mkdir -p /opt/mysql/backup
  • 备份脚本

vim /opt/mysql/backup/mysql-backup.sh

  1. #!/bin/bash
  2. DATE=`date +%Y%m%d%H`
  3. DB_USER=root
  4. DB_PASS=Root123456
  5. BACKUP_DIR=/opt/mysql/backup
  6. docker exec mysql-slave mysqldump -u$DB_USER -p$DB_PASS -h 127.0.0.1 console > $BACKUP_DIR/rainbond-console-$DATE.sql
  7. gzip $BACKUP_DIR/rainbond-console-$DATE.sql
  8. docker exec mysql-slave mysqldump -u$DB_USER -p$DB_PASS -h 127.0.0.1 region > $BACKUP_DIR/rainbond-region-$DATE.sql
  9. gzip $BACKUP_DIR/rainbond-region-$DATE.sql
  10. find ${BACKUP_DIR} -name "rainbond-*.sql.gz" -type f -mtime +30 -exec rm {} \; > /dev/null 2>&1
  • 配置计划任务
  1. $ crontab -e
  2. 0 2 * * * bash /opt/mysql/backup/mysql-backup.sh