Kubernetes 集群搭建Mysql主从服务

100人浏览   2026-06-09 00:18:24

IT行业的核心在于数据。确保数据在各种情况下的安全性,就需要我们建立健全的数据备份策略。在测试环境中,我们通过MySQL的主从架构和定时任务保障数据的安全。

MySQL主从服务器需分布于两台不同的物理机,以避免单点故障。

MySQL主服务器利用binlog实现数据同步备份至从服务器。

定时任务将从服务器的数据dump保存到NAS服务器上。

这种处理方式确保了在主服务器损毁的情况下,我们能够迅速且无缝地切换到备份服务器,同时保证数据的实时有效性。若整个集群损毁,我们依然可以通过定时任务备份的数据恢复至某一时刻。

以下是实施步骤:

  1. 在虚拟机上创建MySQL数据文件夹。
  2. 编写MySQL主服务器配置文件。
  3. 通过Rancher创建MySQL主服务器Deployment。
  4. 编写MySQL从服务器配置文件。
  5. 通过Rancher创建MySQL从服务器Deployment。
  6. 部署PHPMyAdmin远程访问数据库
  7. 通过定时脚本将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

相关推荐