以下是关键设计要点和实现方案:
一、核心设计考虑
- 存储设计
◦ 持久化存储:必须使用 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC),确保数据在 Pod 重启后不丢失。
▪ 推荐 ReadWriteOnce (RWO) 模式,单 Pod 独占存储,避免多副本写入冲突。
▪ 生产环境建议使用分布式存储(如 Ceph、AWS EBS)而非 hostPath。
◦ 动态供应:通过 StorageClass 动态创建 PV,简化存储管理。
- 高可用模式
◦ 主从复制(Master-Slave):
▪ 主节点(Master)处理写操作,从节点(Slave)通过 Binlog 同步数据,读请求可分发到从节点。
▪ 使用 StatefulSet 管理 Pod,确保稳定的网络标识(如 mysql-0, mysql-1)和有序扩缩容。
◦ 组复制(Group Replication):
▪ 原生支持多主节点强一致性(如 MySQL InnoDB Cluster),但复杂度较高,适合金融级场景。
- 数据一致性保障
◦ 初始化克隆:新 Pod 启动时通过 initContainer 从主节点克隆数据(如使用 xtrabackup)。
◦ 实时同步:
▪ 主从架构下,从节点持续同步主节点的 Binlog,确保数据最终一致性。
▪ 使用 Semi-Sync Replication 或 GTID 避免数据丢失。
◦ 分布式锁:通过 etcd 或 ZooKeeper 协调写操作,防止多主节点冲突。
- 稳定性保障
◦ 健康检查:配置 LivenessProbe 和 ReadinessProbe,自动重启异常 Pod。
◦ 故障转移:结合 StatefulSet 控制器自动重建 Pod,并更新 DNS 记录。
◦ 备份与恢复:定期通过 CronJob 备份数据到持久存储或对象存储(如 MinIO)。
二、部署模式选择
- 主从架构(推荐)
实现步骤:
StatefulSet 配置:
▪ 定义 serviceName: mysql,创建无头服务(Headless Service)实现 DNS 解析。
▪ 通过 volumeClaimTemplates 为每个 Pod 分配独立 PVC。
- 主从配置:
▪ 主节点 Pod 挂载 master.cnf,从节点挂载 slave.cnf,通过环境变量区分角色。
▪ 从节点初始化时通过 CHANGE MASTER TO 指定主节点地址。
- 服务暴露:
▪ 主节点通过 mysql-master 服务暴露,从节点通过 mysql-slave 服务负载均衡。
- 单机多副本(非推荐)
• 适用场景:测试环境或低一致性要求的场景。
• 风险:
◦ 多 Pod 写入同一 PVC 可能导致数据损坏(需文件锁或分布式锁)。
◦ 无主从同步时,数据不一致风险高。
三、后端服务连接配置
- 主节点连接
• DNS 名称:mysql-0.mysql.default.svc.cluster.local(通过 Headless Service 解析)。
• 连接参数示例:
env:
name: MYSQL_HOSTvalue: "mysql-0.mysql"
name: MYSQL_PORTvalue: "3306"
name: MYSQL_USERvalueFrom: secretKeyRef: name: mysql-secret key: username
name: MYSQL_PASSWORDvalueFrom: secretKeyRef: name: mysql-secret key: password
- 读请求负载均衡
• 服务配置:创建普通 Service mysql-read,指向所有从节点。
apiVersion: v1
kind: Service
metadata:
name: mysql-read
spec:
ports:
- port: 3306
targetPort: 3306
selector:
app: mysql
role: slave # 通过标签区分主从
• 应用连接:读操作使用 mysql-read.default.svc.cluster.local,写操作指定主节点。
四、完整配置示例
- StatefulSet 配置
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
ports:
- containerPort: 3306
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 20Gi
- 主从同步配置
• 主节点 ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config
data:
master.cnf: |
[mysqld]
server-id=1
log-bin=mysql-bin
• 从节点 ConfigMap:
data:
slave.cnf: |
[mysqld]
server-id=2
relay-log=mysql-relay-bin
read-only=1
五、稳定性优化建议
- 监控与告警:
◦ 使用 Prometheus 监控 MySQL 指标(如 QPS、连接数、复制延迟)。
◦ 配置 AlertManager 触发磁盘空间不足、复制中断等告警。
- 性能调优:
◦ 调整 InnoDB 参数(如 innodb_buffer_pool_size)以适配 Pod 资源限制。
◦ 使用本地 SSD 存储提升 IOPS。
- 灾备方案:
◦ 定期全量备份 + 实时 Binlog 增量备份,支持时间点恢复(PITR)。
总结
• 推荐模式:主从架构 + StatefulSet + 无头服务,兼顾高可用与数据一致性。
• 关键点:
◦ 存储需独立 PVC,避免多副本写入冲突。
◦ 通过 DNS 实现服务发现,区分读写流量。
◦ 结合监控和自动化运维工具保障稳定性。
• 扩展性:若需强一致性,可评估分布式数据库(如 TiDB)替代方案。