Kubernetes环境下MySQL主从架构搭建实践指南

一、技术背景与架构价值

在分布式系统架构中,MySQL主从复制是提升数据可用性的核心方案。通过主节点处理写操作、从节点处理读请求的分离架构,可实现:

  • 读写分离:主库专注数据变更,从库承担查询压力
  • 高可用保障:主节点故障时可快速切换至从节点
  • 备份冗余:实时同步的数据副本提供灾难恢复能力
  • 横向扩展:通过增加从节点提升整体吞吐能力

传统物理机部署存在资源利用率低、环境一致性差等问题。容器化部署通过标准化镜像和编排工具,可实现:

  • 环境快速复现:基于Docker镜像构建标准化运行环境
  • 弹性伸缩能力:通过Kubernetes动态调整从节点数量
  • 跨主机部署:突破单机资源限制构建集群架构
  • 自动化运维:结合健康检查实现故障自愈

二、Docker环境下的基础实现

2.1 环境准备

建议使用Docker Compose进行多容器编排,需准备:

  • MySQL 5.7+官方镜像(推荐使用特定版本标签确保稳定性)
  • 配置持久化存储卷(避免容器重启数据丢失)
  • 网络配置(建议使用自定义bridge网络实现容器间通信)

示例docker-compose.yml核心配置:

  1. version: '3.8'
  2. services:
  3. mysql-master:
  4. image: mysql:5.7
  5. volumes:
  6. - master-data:/var/lib/mysql
  7. - ./master-conf:/etc/mysql/conf.d
  8. environment:
  9. MYSQL_ROOT_PASSWORD: root_pass
  10. MYSQL_REPLICATION_USER: repl_user
  11. MYSQL_REPLICATION_PASSWORD: repl_pass
  12. networks:
  13. - mysql-repl-net
  14. mysql-slave:
  15. image: mysql:5.7
  16. volumes:
  17. - slave-data:/var/lib/mysql
  18. - ./slave-conf:/etc/mysql/conf.d
  19. environment:
  20. MYSQL_ROOT_PASSWORD: root_pass
  21. networks:
  22. - mysql-repl-net
  23. volumes:
  24. master-data:
  25. slave-data:
  26. networks:
  27. mysql-repl-net:
  28. driver: bridge

2.2 主节点配置

关键配置参数说明:

  1. # my.cnf主节点配置
  2. [mysqld]
  3. server-id = 1
  4. log_bin = mysql-bin
  5. binlog_format = ROW
  6. binlog_do_db = replication_db # 指定需要复制的数据库
  7. sync_binlog = 1

初始化操作流程:

  1. 创建复制专用账号:

    1. CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_pass';
    2. GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
    3. FLUSH PRIVILEGES;
  2. 获取主节点状态信息:

    1. SHOW MASTER STATUS;
    2. -- 记录FilePosition值用于从节点配置

2.3 从节点配置

关键配置参数:

  1. # my.cnf从节点配置
  2. [mysqld]
  3. server-id = 2
  4. relay_log = mysql-relay-bin
  5. log_bin = mysql-bin
  6. binlog_format = ROW
  7. read_only = 1 # 确保从库只读

初始化操作流程:

  1. CHANGE MASTER TO
  2. MASTER_HOST='mysql-master',
  3. MASTER_USER='repl_user',
  4. MASTER_PASSWORD='repl_pass',
  5. MASTER_LOG_FILE='mysql-bin.000001', -- 替换为主节点实际值
  6. MASTER_LOG_POS=1234; -- 替换为主节点实际值
  7. START SLAVE;

验证复制状态:

  1. SHOW SLAVE STATUS\G
  2. -- 检查Slave_IO_RunningSlave_SQL_Running是否为Yes

三、Kubernetes环境下的进阶实现

3.1 架构设计要点

容器化部署需解决的核心问题:

  • 持久化存储:使用StatefulSet管理有状态应用
  • 服务发现:通过Headless Service实现Pod直接通信
  • 配置管理:使用ConfigMap存储MySQL配置文件
  • 初始化容器:处理首次启动的特殊逻辑

3.2 关键资源配置示例

StatefulSet核心配置:

  1. apiVersion: apps/v1
  2. kind: StatefulSet
  3. metadata:
  4. name: mysql-master
  5. spec:
  6. serviceName: mysql-master
  7. replicas: 1
  8. selector:
  9. matchLabels:
  10. app: mysql-master
  11. template:
  12. spec:
  13. containers:
  14. - name: mysql
  15. image: mysql:5.7
  16. envFrom:
  17. - configMapRef:
  18. name: mysql-master-config
  19. volumeMounts:
  20. - name: mysql-data
  21. mountPath: /var/lib/mysql
  22. - name: master-conf
  23. mountPath: /etc/mysql/conf.d
  24. volumeClaimTemplates:
  25. - metadata:
  26. name: mysql-data
  27. spec:
  28. accessModes: [ "ReadWriteOnce" ]
  29. resources:
  30. requests:
  31. storage: 20Gi

ConfigMap配置示例:

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: mysql-master-config
  5. data:
  6. MYSQL_ROOT_PASSWORD: root_pass
  7. MYSQL_REPLICATION_USER: repl_user
  8. MYSQL_REPLICATION_PASSWORD: repl_pass
  9. custom.cnf: |
  10. [mysqld]
  11. server-id = 1
  12. log_bin = mysql-bin
  13. binlog_format = ROW

3.3 初始化容器实现

通过initContainers处理首次启动逻辑:

  1. initContainers:
  2. - name: init-mysql
  3. image: mysql:5.7
  4. command:
  5. - bash
  6. - -c
  7. - |
  8. if [ ! -f /var/lib/mysql/initialized ]; then
  9. # 执行初始化脚本
  10. mysql_install_db --user=mysql --datadir=/var/lib/mysql
  11. touch /var/lib/mysql/initialized
  12. fi
  13. volumeMounts:
  14. - name: mysql-data
  15. mountPath: /var/lib/mysql

四、常见问题与解决方案

4.1 复制中断排查

典型错误场景:

  • 网络中断导致IO线程停止
  • 主从数据不一致引发SQL线程错误
  • 大事务导致复制延迟

排查流程:

  1. 检查复制状态:

    1. SHOW SLAVE STATUS\G
  2. 根据错误类型处理:

  • 网络问题:检查Kubernetes网络策略
  • 数据不一致:使用pt-table-checksum工具检测
  • 大事务:调整binlog_cache_size参数

4.2 主从切换实践

手动切换步骤:

  1. 在主节点执行:

    1. FLUSH TABLES WITH READ LOCK;
    2. SHOW MASTER STATUS; -- 记录最后位置
  2. 提升从节点为主节点:

    1. STOP SLAVE;
    2. RESET SLAVE ALL;
    3. RESET MASTER; -- 清除二进制日志
  3. 更新应用连接配置指向新主节点

五、最佳实践建议

  1. 监控体系构建:
  • 监控复制延迟(Seconds_Behind_Master)
  • 监控主从节点存活状态
  • 设置延迟告警阈值(建议不超过60秒)
  1. 备份策略设计:
  • 主节点定期全量备份
  • 从节点实时二进制日志备份
  • 保留7天以上的备份周期
  1. 版本升级方案:
  • 先升级从节点再升级主节点
  • 使用蓝绿部署模式逐步替换
  • 升级前后验证数据一致性

通过系统化的容器化部署方案,开发者可以快速构建高可用的MySQL集群环境。建议从Docker单节点验证开始,逐步过渡到Kubernetes集群部署,最终形成完整的运维管理体系。实际生产环境中还需结合具体的业务场景,在性能、可用性和成本之间取得平衡。