StatefulSet是唯一可行方案,因其提供稳定DNS、独立PVC和启停顺序保障;需动态注入错开的server_id与auto_increment参数;initContainer生成配置、Headless Service配对、探针校验复制状态缺一不可。
必须用 StatefulSet,不能用 Deployment —— 否则主从连接会断、GTID 定位失效、数据不一致却无报错。
Deployment 生成的 Pod 名带随机哈希(如 mysql-7d8f9b4c6-xyz12),重启后 DNS 记录失效,而 MySQL 主从依赖固定主机名做 CHANGE MASTER TO 和 GTID 自动定位;StatefulSet 提供三样不可替代的东西:
mysql-0.mysql.namespace.svc.cluster.local 这类稳定 DNS,主从之间靠它互相发现PVC,重建后数据不丢、卷不混mysql-0 先就绪,mysql-1 才启动),避免从库连不上主库硬编码 server_id=1 或漏配自增偏移,会导致双主写入冲突、START SLAVE 直接报 ERROR 3021 (HY000),甚至数据静默丢失。
hostname 解析序号:进容器执行 hostname | sed 's/mysql-//' | sed 's/..*$//' 得到 0 或 1,再写入配置或传给 mysqld
auto_increment_offset 和 auto_increment_increment 必须写在 [mysqld] 段里:mysql-0 设为 1,2,mysql-1 设为 2,2
把 my.cnf 放 ConfigMap 里静态挂载,看似简单,但无法适配不同 Pod 的 server_id 和角色;initContainer 在主容器启动前执行一次,才是可靠解法。
busybox 镜像,读取 /proc/1/cgroup 或解析 hostname 获取序号server_id 的临时配置文件,复制到 /etc/mysql/conf.d/
{{ .Index | add 1 }} 这类模板逻辑泄露到运行时,降低调试复杂度clusterIP: None 是 Headless Service 的标志,但它只是前提;真正起作用的是 StatefulSet 的 serviceName 字段必须和该 Service 名字一致,否则 DNS 不生效。
livenessProbe 用 mysqladmin ping -h localhost 即可,但 readinessProbe 必须等复制线程就绪:mysql -e "SHOW SLAVE STATUSG" | grep -q "Slave_IO_Running: Yes"
Slave_IO_Running 和 Slave_SQL_Running 都为 Yes 才标记就绪最常被跳过的动作是验证两节点的 SELECT @@server_id, @@auto_increment_offset, @@auto_increment_increment; —— 不亲眼确认,等于没配。
Tplink企业版路由器WiFi名称的默认设置介绍(Tplink企业版路由器WiFi名称的默认设置是什么)
Tplink路由器灯常亮无法上网的原因分析(如何解决Tplink路由器灯常亮无法上网的问题)
Tplink千兆企业级路由器自动重启的作用和优势介绍(如何设置Tplink千兆企业级路由器自动重启功能)
一根天线的tplink路由器有哪些(一根天线的Tplink路由器的特点和优势介绍)
tplink路由器外网访问不了nas(Tplink路由器外网访问NAS的原因分析)
Tplink无法搜到路由器的原因分析(如何解决Tplink无法搜到路由器的问题)