Kubernetes 集群搭建Mysql主从服务
IT行业的核心在于数据。确保数据在各种情况下的安全性,就需要我们建立健全的数据备份策略。在测试环境中,我们通过MySQL的主从架构和定时任务保障数据的安全。
MySQL主从服务器需分布于两台不同的物理机,以避免单点故障。
MySQL主服务器利用binlog实现数据同步备份至从服务器。
定时任务将从服务器的数据dump保存到NAS服务器上。
这种处理方式确保了在主服务器损毁的情况下,我们能够迅速且无缝地切换到备份服务器,同时保证数据的实时有效性。若整个集群损毁,我们依然可以通过定时任务备份的数据恢复至某一时刻。
以下是实施步骤:
- 在虚拟机上创建MySQL数据文件夹。
- 编写MySQL主服务器配置文件。
- 通过Rancher创建MySQL主服务器Deployment。
- 编写MySQL从服务器配置文件。
- 通过Rancher创建MySQL从服务器Deployment。
- 部署PHPMyAdmin远程访问数据库
- 通过定时脚本将mysql数据备份到指定目录
在虚拟机上创建MySQL数据文件夹
我们最开始是将mysql的目录也通过pv挂载的。但是发现这种配置下如果设备断电等异常情况会导致mysql Binlog文件或者其他的一些数据文件损坏引起mysql无法启动。而且通过网络挂载的mysql读写效率极低。所以我们目前的方案是将mysql的数据目录直接挂载到本地文件夹上。在通过备份来保证数据安全,而且这样比起通过网络挂载还提高了mysql的执行效率。
ssh root@10.20.10.21
mkdir -p /data/k8s/mysql/
# mysql 的主要目录
cd /data/k8s/mysql/
# mysql配置文件目录
mkdir etc
# mysql数据目录
mkdir database
# mysql日志
mkdir logs
# mysql redolog
mkdir redolog
# mysql undolog
mkdir undolog编写MySQL主服务器配置文件
[client]
loose_default_character_set=utf8mb4 # 默认字符集
user=root # 用户名
password=${mysql_password} # MySQL密码
[mysqld]
server-id=1 # 服务器ID
sql_mode=NO_ENGINE_SUBSTITUTION # SQL模式
lower_case_table_names=1 # 表名大小写敏感设置
bind_address=0.0.0.0 # 绑定地址
port=3306 # 端口号
autocommit=1 # 自动提交设置
character_set_server=utf8mb4 # 服务器字符集
skip_name_resolve=1 # 跳过域名解析
max_connections=20000 # 最大连接数
max_connect_errors=1000 # 最大连接错误数
tmpdir=/tmp # 临时文件目录
long_query_time=10 # 慢查询时间阈值
slow_query_log=1 # 慢查询日志开关
slow_query_log_file=/logs/slow_query.log # 慢查询日志文件路径
log_error=/logs/ # 错误日志路径
log_queries_not_using_indexes=1 # 记录未使用索引的查询
log_slow_admin_statements=1 # 记录慢速管理语句
log_slow_slave_statements=1 # 记录慢速从服务器语句
log_throttle_queries_not_using_indexes=50 # 限制未使用索引查询的频率
log_warnings=2 # 日志警告级别
log_timestamps=system # 日志时间戳格式
log_bin=master-bin # 二进制日志文件名
log_bin_index=master-bin.index # 二进制日志索引文件名
expire_logs_days=30 # 日志过期天数
min_examined_row_limit=100 # 最小检查行限制
binlog-ignore-db=mysql # 忽略的数据库(binlog)
binlog-ignore-db=information_schema # 忽略的数据库(binlog)
binlog-ignore-db=performance_schema # 忽略的数据库(binlog)
binlog_cache_size=8M # 二进制日志缓存大小
sort_buffer_size=2M # 排序缓冲区大小
tmp_table_size=64M # 临时表大小
max_heap_table_size=64M # 最大堆表大小
table_open_cache=6140 # 表打开缓存数
open_files_limit=12280 # 打开文件限制数
query_cache_type=ON # 查询缓存类型
query_cache_size=64M # 查询缓存大小
query_cache_limit=8M # 查询缓存限制通过Rancher创建MySQL主服务器Deployment

编写MySQL从服务器配置文件
参考主服务器的目录建设在10.20.10.22这台服务器上创建mysql目录。需要根据具体情况调整从服务器安装的虚拟机。尽量确保主服务和从服务器不在同一台物理机。
vi etc/my.cnf
[client]
loose_default_character_set=utf8mb4 # 默认字符集
user=root # 用户名
password=${mysql_password} # MySQL密码
[mysqld]
server-id=2 # 服务器ID
sql_mode=NO_ENGINE_SUBSTITUTION # SQL模式
lower_case_table_names=1 # 表名大小写敏感设置
bind_address=0.0.0.0 # 绑定地址
port=3306 # 端口号
autocommit=1 # 自动提交设置
character_set_server=utf8mb4 # 服务器字符集
skip_name_resolve=1 # 跳过域名解析
max_connections=20000 # 最大连接数
max_connect_errors=1000 # 最大连接错误数
tmpdir=/tmp # 临时文件目录
log_error=/logs/ # 错误日志路径
slow_query_log=1 # 慢查询日志开关
slow_query_log_file=slow_query.log # 慢查询日志文件路径
log_queries_not_using_indexes=1 # 记录未使用索引的查询
log_slow_admin_statements=1 # 记录慢速管理语句
log_slow_slave_statements=1 # 记录慢速从服务器语句
log_throttle_queries_not_using_indexes=50 # 限制未使用索引查询的频率
expire_logs_days=30 # 日志过期天数
long_query_time=10 # 慢查询时间阈值
min_examined_row_limit=100 # 最小检查行限制
log_timestamps=system # 日志时间戳格式
relay-log=slave-relay-bin # 中继日志文件名
relay-log-index=slave-relay-bin.index # 中继日志索引文件名通过Rancher创建MySQL从服务器Deployment
参考主服务器配置。只需要修改【指定主机运行所有 Pods】
部署PHPMyAdmin远程访问数据库
需要再Rancher的配置映射里增加phpmyadmin配置文件

<?php
declare(strict_types=1);
// blowfish_secret是用于phpMyAdmin的cookie加密的密钥。为了安全起见,你需要生成一个足够强大且随机的字符串作为blowfish_secret。字符串长度应在32到64个字符之间。
$cfg['blowfish_secret'] = '${}';
$i = 0;
$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
// 需要修改成rancher 服务发现中mysql主服务器的集群ip
$cfg['Servers'][$i]['host'] = '';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['verbose'] = 'master';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
// 需要修改成rancher 服务发现中mysql从服务器的集群ip
$cfg['Servers'][$i]['host'] = '176.16.67.193';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['verbose'] = 'backup';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
添加ingress

访问phpmyadmin

# 在主服务器上执行
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
FLUSH PRIVILEGES;# 在从服务器上执行
## 确保替换master_server_ip为主服务器的IP地址,
## 并将your_password替换为步骤1中创建的复制用户的密码。
CHANGE MASTER TO
MASTER_HOST='master_server_ip',
MASTER_USER='replication_user',
MASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;
# 启动同步进程
START SLAVE;通过定时脚本将mysql数据备份到指定目录
vi ~/.my.cnf
# 允许免密登录
[mysqldump]
user=root
password=${mysql_password}
[mysql]
user=root
password=${mysql_password} vi ~/backup.sh
#!/bin/sh
set -x
now_date=$(date +%Y-%m-%d)
# 设置备份保留10天。
delete_date=$(date -d"10 day ago" +%Y-%m-%d)
echo "backup master db server"
# mysql_host 可以是主服务也可以是从的。
mkdir -p /mnt/mysql/backup/master/$now_date
mysqldump --all-databases -h ${mysql_host} > /mnt/mysql/backup/master/$now_date/all.sql
gzip -c /mnt/mysql/backup/master/$now_date/all.sql > /mnt/mysql/backup/master/$now_date/all.sql.gz
rm -rf /mnt/mysql/backup/master/$now_date/all.sql
backup(){
echo "database name $1"
databaseName=$1
echo "backup master db server, datebase $databaseName"
# mysql_host 可以是主服务也可以是从的。
mysqldump $databaseName -h ${mysql_host} > /mnt/mysql/backup/master/$now_date/$databaseName.sql
gzip -c /mnt/mysql/backup/master/$now_date/$databaseName.sql > /mnt/mysql/backup/master/$now_date/$databaseName.sql.gz
rm -rf /mnt/mysql/backup/master/$now_date/$databaseName.sql
}
# 可以为某个库单独配置加快恢复速度
backup ${DatabaseName}
rm -rf /mnt/mysql/backup/master/$delete_date 相关推荐
-
「nginx」十、nginx的location配置详解2026-07-04 00:51:45 -

最清晰的mysql体系架构图 ,助你深度掌握MySQL开发管理,赢在大数据时代
最清晰的mysql体系架构图 ,助你深度掌握MySQL开发管理,赢在大数据时代2026-07-04 00:21:47 -
PHP读取Excel内的图片2026-07-03 00:07:41 -
mysql:Otter跨机房数据同步(单向)2026-07-03 00:02:48 -

在windows10系统下搭建IIS+PHP+MYSQL+phpMyAdmin服务器运行环境
在windows10系统下搭建IIS+PHP+MYSQL+phpMyAdmin服务器运行环境2026-07-02 00:15:08