数据存储高可用 - MySQL主从复制实践指南
文章简介
在企业级微服务架构中,数据存储的高可用性是保障业务连续性的关键要素。本文作为《若依微服务项目云原生部署实战》专栏的第4篇,将深入探讨MySQL主从复制的原理、配置方法及在若依微服务项目中的实际应用,帮助读者构建稳定可靠的数据存储架构。
重要提醒:由于安装包使用网盘,其链接经常被取消分享,请联系张师傅(微信:ggttxlss)获取完整的离线安装包。
目标读者
- 微服务架构师
- DevOps工程师
- 数据库管理员
- 云原生技术实践者
实际应用场景背景
在若依微服务项目的云原生部署实践中,数据存储的高可用性是保障业务连续性的关键。特别是在电商、金融等对数据一致性要求极高的场景中,通过MySQL主从复制技术实现读写分离和故障切换,能够有效提升系统性能和数据安全性。本篇文章将基于真实的项目实践,详细讲解如何在虚拟机环境中部署和配置MySQL主从架构。
一、服务器资源规划方案
1.1 企业级硬件配置标准
主节点(写操作承载):192.168.3.7
从节点(读操作负载):192.168.3.8
二、安装MySQL企业级环境
2.1 安装包准备
# 5.7.17版本安装包下载地址:
https://pan.quark.cn/s/7b94f1f5dfd1 # 如遇链接失败,请添加张师傅微信:ggttxlss
2.2 安装步骤
在主从节点上执行以下操作:
- 解压安装包
tar -xvf mysql-5.7.17.tar
- 创建安装目录
mkdir -p mysql_install_package
mv mysql-community-* ./mysql_install_package/
- 卸载mariadb
yum list installed | grep mariadb
systemctl stop mariadb
rm -rf /etc/my.cnf
rm -rf /var/lib/mysql
rpm -e --nodeps mariadb-server mariadb
- 安装mysql
yum -y install mysql-community-*.rpm
rpm -ivh --force --nodeps *.rpm
# 查看安装结果
rpm -qa | grep mysql
systemctl start mysqld
# 单独查看某一个进程有没有
ps -C mysqld
- 开机自启
systemctl enable mysqld
- 修改密码
# 初始密码
grep password /var/log/mysqld.log
# 登陆
mysql -hlocalhost -uroot -p
# 默认密码什么都不能做,因此需要修改密码
alter user root@"localhost" identified by "Huawei@123";
- 允许远程登录
# 添加root用户,可以从任意地方登录
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Huawei@123' WITH GRANT OPTION;
FLUSH PRIVILEGES;
三、核心配置文件深度解析
3.1 主节点配置模板(my.cnf)
企业级生产环境配置参数,建议根据实际负载动态调整
[mysqld]
# 基础架构配置
server-id=0307 # 企业级4位编码规范(主节点标识)
log-bin=mysql-bin-0307 # 二进制日志命名规范(含节点标识)
binlog_format=MIXED # 混合日志格式(企业级数据完整性保障)
# 性能调优参数
innodb_buffer_pool_size=2G # 物理内存70%分配(企业级缓存优化)
innodb_flush_log_at_trx_commit=2 # 日志刷新策略(性能与可靠性平衡)
innodb_log_file_size=128M # 日志文件扩容(减少checkpoint开销)
thread_cache_size=128 # 线程池复用优化(高并发场景必备)
# 连接管理配置
max_connections=1024 # 企业级并发连接数(支持千级连接)
wait_timeout=28800 # 非交互连接超时(避免僵尸连接)
# 字符集配置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 其他优化配置
bind-address = 0.0.0.0
port = 3306
3.2 从节点配置要点
企业级高可用集群从节点配置规范
[mysqld]
# 基础架构配置
server-id=0308 # 从节点唯一标识
relay_log=mysql-relay-bin-0308 # 中继日志命名规范
read_only=ON # 从库只读策略(数据安全防护)
# 复制优化配置
slave_parallel_workers=4 # 多线程复制(MySQL 5.7+并行复制技术)
# 性能调优参数
innodb_buffer_pool_size=2G # 物理内存70%分配(企业级缓存优化)
innodb_flush_log_at_trx_commit=2 # 日志刷新策略(性能与可靠性平衡)
innodb_log_file_size=128M # 日志文件扩容(减少checkpoint开销)
thread_cache_size=128 # 线程池复用优化(高并发场景必备)
# 连接管理配置
max_connections=1024 # 企业级并发连接数(支持千级连接)
wait_timeout=28800 # 非交互连接超时(避免僵尸连接)
# 字符集配置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 其他优化配置
bind-address = 0.0.0.0
port = 3306
这是张师傅的配置文件,包含0307(master)和0308(slave)
0307.my.cnf
0308.my.cnf
四、主从复制架构搭建流程
4.1 初始化主节点
登录Master节点MySQL,创建复制用户:
mysql -u root -p
CREATE USER 'repluser'@'%' IDENTIFIED BY 'ciTools@345';
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'%';
FLUSH PRIVILEGES;
-- 验证账户权限
SHOW GRANTS FOR 'repluser'@'%';
-- 查看主库状态
SHOW MASTER STATUS;
记录下File和Position的值,后续配置Slave时需要使用。
4.2 配置从节点
在Slave节点上配置主从关系:
mysql -u root -p
-- 配置主库信息(日志文件需动态获取)
CHANGE MASTER TO
MASTER_HOST='192.168.3.7',
MASTER_USER='repluser',
MASTER_PASSWORD='ciTools@345',
MASTER_LOG_FILE='mysql-bin-0307.000001', -- 动态获取当前日志文件
MASTER_LOG_POS=154; -- 动态获取当前日志位置
-- 启动从库复制
START SLAVE;
-- 验证复制状态
SHOW SLAVE STATUS\G
-- 核心监控指标:
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
-- Seconds_Behind_Master: 0
4.3 验证主从复制
在Master节点创建测试数据库和表:
CREATE DATABASE test_replication;
USE test_replication;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100)
);
INSERT INTO users (name, email) VALUES ('张三', 'zhangsan@example.com');
在Slave节点验证数据是否同步:
USE test_replication;
SELECT * FROM users;
五、数据库备份策略
在生产环境中,定期备份数据库是保障数据安全的重要措施。以下是一个自动化备份所有数据库的脚本示例:
#!/bin/bash
set -x
# MySQL 配置
HOST="192.168.3.7"
PORT="3306"
MYSQL_USER="root"
MYSQL_PASSWORD="Huawei@123"
date=$(date +%Y%m%d-%H%M%S)
BASE_BACKUP_DIR="/data/mysqldump"
BACKUP_DIR="$BASE_BACKUP_DIR/$date"
ARCHIVE_FILE="$BASE_BACKUP_DIR/${date}.tar.gz"
# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR
# 获取所有数据库列表(排除系统数据库)
DATABASES=$(mysql -u $MYSQL_USER -p$MYSQL_PASSWORD -h $HOST -P $PORT -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql|sys)")
# 遍历所有数据库并进行备份
for DB in $DATABASES; do
BACKUP_FILE="$BACKUP_DIR/${DB}_backup_$date.sql"
echo "$BACKUP_FILE"
mysqldump -u $MYSQL_USER -p$MYSQL_PASSWORD -h $HOST -P $PORT -R -E --single-transaction $DB > $BACKUP_FILE
# 检查备份是否成功
if [ $? -ne 0 ]; then
echo "[$date] Backup failed for database: $DB" >> $BASE_BACKUP_DIR/backup.log
else
echo "[$date] Backup successful for database: $DB, file: $BACKUP_FILE" >> $BASE_BACKUP_DIR/backup.log
fi
done
# 创建备份的 tar.gz 文件
tar -zcvf $ARCHIVE_FILE -C $BASE_BACKUP_DIR $date
# 检查 tar.gz 创建是否成功
if [ $? -eq 0 ]; then
echo "[$date] Archive created successfully: $ARCHIVE_FILE" >> $BASE_BACKUP_DIR/backup.log
# 删除原始的备份文件夹
rm -rf $BACKUP_DIR
echo "[$date] Original backup directory deleted: $BACKUP_DIR" >> $BASE_BACKUP_DIR/backup.log
else
echo "[$date] Archive creation failed" >> $BASE_BACKUP_DIR/backup.log
fi
# 删除4周前的备份文件
find $BASE_BACKUP_DIR/* -type d -mtime +28 -exec rm -r {} \;
find $BASE_BACKUP_DIR -type f -name "*.tar.gz" -mtime +28 -exec rm {} \;
echo "[$date] Old backups deleted (older than 4 weeks)" >> $BASE_BACKUP_DIR/backup.log
设置定时任务,每天凌晨2点执行备份:
# 编辑定时任务
crontab -e
# 添加以下内容
0 2 * * * /data/mysqldump/backupall.sh >/dev/null 2>&1 &
六、数据库用户管理规范
为了更好地管理和维护数据库用户信息,推荐使用Excel文件记录相关信息,包括用户名、密码、数据库名等。在/upload/files/目录下的mysql管理.xlsx文件可用于记录这些信息。
mysql管理.xlsx,如果大家有更好的方法,请留言评论,非常欢迎提意见。
通过Excel表格管理的优势:
- 统一管理所有数据库用户的账号和密码信息
- 快速生成创建数据库、用户授权的SQL语句
- 方便批量操作和审计
- 降低人为操作失误风险
使用方法:
- 在Excel表格中录入数据库实例信息、用户名、密码等
- 利用Excel公式拼接生成对应的SQL命令
- 将生成的SQL命令直接复制到MySQL命令行中执行
例如,可以通过以下方式快速创建数据库和用户:
-- 创建数据库
CREATE DATABASE IF NOT EXISTS ruoyi DEFAULT CHARACTER SET UTF8MB4 COLLATE UTF8MB4_GENERAL_CI;
-- 创建用户并授权
CREATE USER 'ruoyi_user'@'%' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON ruoyi.* TO 'ruoyi_user'@'%';
FLUSH PRIVILEGES;
这种方式可以大大提高数据库初始化和日常维护的效率,同时保证操作的一致性和准确性。
参考资料
- MySQL官方文档 - Replication
- 《高性能MySQL》第三版
- 若依微服务官方文档
- CentOS官方文档
- 虚拟机部署mysql单机5.7.17版本
- 虚拟机部署Mysql主从复制的5.7.17版本
评论区