主题
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-primary | 1 | 写节点(主从架构写节点天然单点,故障需提升从库) |
| mysql-secondary | 2 | 读节点,跨节点反亲和 |
| mysql-proxysql | 2 | 读写分离,跨节点反亲和 + PDB |
| mysql-nfs-provisioner | 1 | 专用 StorageClass nfs-mysql 动态供给 |
| mysql-backup | CronJob | 0 18 * * * UTC = 北京 02:00,保留 7 天 |
镜像与 Chart(全部来自内部 Harbor 192.168.122.156:30000)
| 内容 | 内部地址 | 来源(国内源同步) |
|---|---|---|
| MySQL 镜像 | mysql/mysql:8.4.5-debian-12-r0 | docker.m.daocloud.io/bitnamilegacy/mysql |
| ProxySQL 镜像 | mysql/proxysql:2.7.3 | docker.m.daocloud.io/proxysql/proxysql |
| MySQL chart | oci://…/charts/mysql:12.3.5 | oci://docker.m.daocloud.io/bitnamicharts/mysql |
| NFS provisioner chart | oci://…/charts/nfs-subdir-external-provisioner:4.0.18 | Harbor 已有 |
| NFS provisioner 镜像 | sig-storage/nfs-subdir-external-provisioner:v4.0.2 | Harbor 已有 |
连接信息
| 用途 | 地址 | 账号 |
|---|---|---|
| 应用接入(推荐) | mysql-proxysql.mysql.svc.cluster.local:3306 | appuser / 见 .secrets.env |
| 只写主库 | mysql-primary.mysql.svc.cluster.local:3306 | root / 见 .secrets.env |
| 只读从库 | mysql-secondary.mysql.svc.cluster.local:3306 | root |
| 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(勿提交到公共仓库)。