Skip to content

MySQL 高可用部署(mysql 命名空间)

架构

                ┌─────────────────────────────┐
  应用 ───────► │ ProxySQL ×2 (读写分离入口)   │
                │ mysql-proxysql.mysql:3306   │
                └──────┬───────────┬──────────┘
              写(HG10) │           │ 读(HG20)
                       ▼           ▼
              ┌────────────┐  ┌─────────────────┐
              │ Primary ×1 │  │ Secondary ×2    │  ← Bitnami MySQL 8.4.5 主从复制
              └─────┬──────┘  └─────────────────┘
                    │ 半同步复制(async)

        NFS: 192.168.122.1:/mnt/xfs/rancher/mysql (StorageClass: nfs-mysql)

  备份: CronJob 每天 02:00(北京) mysqldump → NFS (mysql-backup PVC),保留 7 天

组件

组件副本说明
mysql-primary1写节点(主从架构写节点天然单点,故障需提升从库)
mysql-secondary2读节点,跨节点反亲和
mysql-proxysql2读写分离,跨节点反亲和 + PDB
mysql-nfs-provisioner1专用 StorageClass nfs-mysql 动态供给
mysql-backupCronJob0 18 * * * UTC = 北京 02:00,保留 7 天

镜像与 Chart(全部来自内部 Harbor 192.168.122.156:30000)

内容内部地址来源(国内源同步)
MySQL 镜像mysql/mysql:8.4.5-debian-12-r0docker.m.daocloud.io/bitnamilegacy/mysql
ProxySQL 镜像mysql/proxysql:2.7.3docker.m.daocloud.io/proxysql/proxysql
MySQL chartoci://…/charts/mysql:12.3.5oci://docker.m.daocloud.io/bitnamicharts/mysql
NFS provisioner chartoci://…/charts/nfs-subdir-external-provisioner:4.0.18Harbor 已有
NFS provisioner 镜像sig-storage/nfs-subdir-external-provisioner:v4.0.2Harbor 已有

连接信息

用途地址账号
应用接入(推荐)mysql-proxysql.mysql.svc.cluster.local:3306appuser / 见 .secrets.env
只写主库mysql-primary.mysql.svc.cluster.local:3306root / 见 .secrets.env
只读从库mysql-secondary.mysql.svc.cluster.local:3306root
ProxySQL 管理仅限 pod 内 localhost:6032(ProxySQL 安全限制,远程禁止)admin / 见 .secrets.env

默认数据库:appdb

部署命令

bash
export KUBECONFIG=~/.kube/config-122.31

# 1. NFS provisioner (StorageClass nfs-mysql)
helm install mysql-nfs-provisioner oci://192.168.122.156:30000/charts/nfs-subdir-external-provisioner \
  --version 4.0.18 --plain-http -n mysql -f nfs-provisioner-values.yaml

# 2. MySQL 主从
helm install mysql oci://192.168.122.156:30000/charts/mysql \
  --version 12.3.5 --plain-http -n mysql -f mysql-values.yaml

# 3. ProxySQL 读写分离 + 4. 备份
kubectl apply -f proxysql.yaml -f backup.yaml

备份与恢复

  • 备份文件位于 NFS mysql-mysql-backup-pvc-*/mysql-YYYYMMDD-HHMMSS.sql.gz,自动保留 7 天
  • 手动触发:kubectl -n mysql create job --from=cronjob/mysql-backup mysql-backup-manual-$(date +%s)
  • 恢复:gunzip < backup.sql.gz | mysql -h mysql-primary -uroot -p

已知限制

  • 主库宕机不会自动切换(bitnami 主从方案固有限制),需手动提升从库; 如需自动故障转移需迁移到 MySQL Operator(InnoDB Cluster)方案
  • 读写分离基于 SQL 解析(SELECT 走从库),从库存在复制延迟,对延迟敏感的读请走主库
  • InnoDB 数据在 NFS 上初始化较慢(分钟级),已配置宽松 startupProbe(90×10s)兜底, 切勿缩短探针,否则初始化中途被杀死会导致 redo log 损坏(MY-012960)
  • ProxySQL admin 接口仅允许 localhost,管理操作请在 pod 内执行(proxysql 镜像无 mysql 客户端, 可用 kubectl run 临时挂载 mysql 客户端,或部署 client toolbox)

密码

所有密码生成后保存在 .secrets.env(勿提交到公共仓库)。