当前位置: 首页 > news >正文

Kubernetes 实战:基于 StatefulSet 构建 MySQL 主从集群(GTID + 自动复制)

K8s 实战:用 StatefulSet 搭建 MySQL 主从集群(GTID + 自动同步)

在生产环境中,MySQL 主从复制是实现数据高可用和读写分离的常见方案。在 Kubernetes 中部署有状态应用,首选控制器便是 StatefulSet。它能为每个 Pod 提供稳定的网络标识和独立的持久化存储,非常适合数据库这类有状态服务。

本文将带领你一步步在 Kubernetes 上,利用 StatefulSet 搭建一套基于 GTID 的 MySQL 主从集群,并实现 从库自动同步。你将学会:

  • 使用 ConfigMap 管理 MySQL 配置和初始化脚本
  • 使用 Secret 保存数据库密码
  • 创建 Headless Service 为 StatefulSet 提供稳定的网络标识
  • 编写 StatefulSet YAML,动态设置 server-id 并自动配置主从复制
  • 验证集群同步状态

准备工作

  • 一个可用的 Kubernetes 集群(版本 1.18+)
  • 已配置默认 StorageClass 或准备使用特定 StorageClass
  • kubectl 命令行工具已配置好集群访问权限
  • 基本了解 MySQL 主从复制和 GTID 概念

1. 创建 Namespace

我们将所有资源放在独立的命名空间 mysql 中,方便管理。

kubectl create namespace mysql

2. 配置 MySQL 配置文件(ConfigMap)

我们需要为 MySQL 提供自定义配置,开启 GTID 模式并设置必要的复制参数。同时,我们将把两个初始化脚本也放入 ConfigMap:

  • init.sh:容器启动时运行的脚本,根据 Pod 名称设置唯一的 server-id,然后启动 MySQL。
  • init-replication.sh:当 MySQL 数据目录为空(首次启动)时,由 MySQL 官方镜像自动执行的初始化脚本。它负责创建复制用户,并在从库上配置 CHANGE MASTER。

创建 mysql-configmap.yaml

apiVersion: v1 kind: ConfigMap metadata: name: mysql-config namespace: mysql data: my.cnf: | [mysqld] server-id = 1 # 占位,实际会被 init.sh 动态覆盖 gtid_mode = ON enforce_gtid_consistency = ON log_replica_updates = ON binlog_format = ROW log_bin = mysql-bin relay_log = mysql-relay-bin expire_logs_days = 7 symbolic-links = 0 init.sh: | #!/bin/bash set -e # 从 Pod 主机名中提取索引(例如 mysql-0 → 0) HOSTNAME=$(hostname) INDEX=${HOSTNAME##*-} # 生成 server-id (索引+1,确保唯一) SERVER_ID=$((INDEX + 1)) # 将 server-id 写入独立的配置文件 cat > /etc/mysql/conf.d/server-id.cnf <<EOF [mysqld] server-id = ${SERVER_ID} EOF echo "Generated server-id = ${SERVER_ID} for pod ${HOSTNAME}" # 调用官方 entrypoint 启动 MySQL,并传递所有参数 exec /usr/local/bin/docker-entrypoint.sh "$@" init-replication.sh: | #!/bin/bash set -e # 从主机名获取 Pod 索引 HOSTNAME=$(hostname) INDEX=${HOSTNAME##*-} # 获取密码(通过环境变量传入) MYSQL_ROOT_PASSWORD="${MYSQL_ROOT_PASSWORD}" REPL_USER="${REPL_USER}" REPL_PASSWORD="${REPL_PASSWORD}" if [ "$INDEX" = "0" ]; then # 主库 (mysql-0):创建复制用户 echo "Primary node: creating replication user..." mysql -uroot -p"$MYSQL_ROOT_PASSWORD" <<-EOSQL CREATE USER IF NOT EXISTS '$REPL_USER'@'%' IDENTIFIED BY '$REPL_PASSWO
http://www.jsqmd.com/news/382840/

相关文章:

  • SQL PRIMARY KEY(主键)
  • Java异常——自定义异常
  • HTML5 测验
  • 2026年二手乳品设备厂家推荐榜单:冻干机/杀菌机/过滤机/制粒机/罐装机/包装机/压片机/榨汁机/反应釜等源头工厂精选,助力降本增效 - 品牌企业推荐师(官方)
  • PHP HTTP详解
  • 速看!大数据领域异常检测的实战心得
  • 大数据领域数据可视化的热力图展示技巧
  • 构建未来教育新生态:智慧校园一体化平台方案关键模块建设浅析
  • 学习记录260214
  • 构建未来教育新生态:智慧校园系统方案关键模块建设浅析
  • 【贪心】BISHI48 小红的整数配对
  • 2026年沈阳变速箱维修厂家推荐榜:专业解决手动/自动变速箱故障,涵盖阀体/离合器维修,高效处理打滑/漏油/异响/顿挫/跳档问题,双离合维修技术领先! - 品牌企业推荐师(官方)
  • 概率论 - 贝叶斯定理 - 实践
  • 智慧校园服务平台-信息化建设与管理中心
  • 2026年垃圾站除臭设备厂家推荐排行榜:脉冲电浆/离子/高压喷雾除臭技术实力品牌深度解析 - 品牌企业推荐师(官方)
  • 2026年上海专业搬家服务推荐榜:居民/企业/精品/日式/同城跨城/办公室/收纳/国际/仓储,一站式高端搬家解决方案深度解析 - 品牌企业推荐师(官方)
  • 智能园艺手套:AI Agent的植物护理指导
  • 雷鸟电视 adb 无法安装 APP 解决方法
  • Flink在天气预报中的应用:实时气象数据分析
  • 智慧校园系统平台 管理系统-教育智慧校园系统平台
  • 免费智慧校园系统平台_智慧教务排课选课系统_智慧校园解决方案
  • Bootstrap5 容器
  • Scala 文件 I/O
  • 【CSDN创作者成长】-如何玩转 CSDN 投票功能?
  • 细胞群体动力学仿真软件:CompuCell3D_(14).特定细胞类型建模
  • LLM学习指南(四)—— 预训练语言模型(PLM) - 教程
  • 2026年环保设施运营服务推荐榜单:专业污水运营与大气治理服务商深度解析,高效合规与口碑优选 - 品牌企业推荐师(官方)
  • 2026年 南通百度营销服务商推荐榜单:百度代理商/开户/代运营/竞价/爱采购会员/账户托管一站式解决方案 - 品牌企业推荐师(官方)
  • 信息系统仿真:信息系统基础理论_(17).仿真的并行与分布式计算
  • 2026年耐酸塑料泵厂家推荐排行榜:耐碱/耐腐蚀/化工/污水/电镀/酸洗/脱硫/工程塑料/PVDF/不锈钢/氟合金耐酸泵,专业防腐泵阀实力品牌深度解析 - 品牌企业推荐师(官方)