MySQL容器化部署实战指南
容器化部署 MySQL 的架构设计
MySQL 容器化部署的核心挑战在于数据持久化、高可用性及性能优化。传统虚拟机部署模式与容器化部署存在显著差异,需重新设计存储、网络及资源管理策略。
采用 StatefulSet 作为 K8s 工作负载控制器可解决有状态服务的部署问题。每个 Pod 拥有稳定的网络标识和持久化存储卷,确保 MySQL 实例重启后仍能保持数据一致性。存储类(StorageClass)应配置为支持动态卷供应,例如使用本地存储或云厂商的块存储服务。
网络策略需配置 Service 资源暴露 MySQL 服务。ClusterIP 类型适用于集群内部访问,NodePort 或 LoadBalancer 类型适用于外部访问。Ingress 控制器可提供更灵活的流量管理能力,但不建议直接用于数据库服务暴露。
数据持久化与备份方案
容器文件系统的临时性特性要求必须外挂持久化卷。K8s 的 PersistentVolumeClaim 应绑定到高性能存储介质,如 SSD 云盘或本地 NVMe 存储。建议配置存储卷的访问模式为 ReadWriteOnce,并设置适当的存储容量和回收策略。
xtrabackup 工具可实现容器化 MySQL 的热备份。通过 InitContainer 或 Sidecar 模式运行备份任务,将数据写入共享卷后上传至对象存储。定期快照配合 binlog 可实现分钟级 RPO(恢复点目标)。以下为备份任务的 CronJob 示例片段:
apiVersion: batch/v1beta1
kind: CronJob
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: percona-xtrabackup
command: ["sh", "-c", "xtrabackup --backup --target-dir=/backup && aws s3 cp /backup s3://bucket/backup-$(date +%s)"]
性能优化关键技术
资源配置需遵循 MySQL 的内存占用特点。容器请求(requests)应设置为实例峰值内存的 120%,限制(limits)不建议设置以避免 OOM Killer 误杀。CPU 资源应启用静态绑核,避免跨 NUMA 节点访问导致性能下降。
调整内核参数对容器化 MySQL 至关重要。需要修改 sysctl 配置包括:
- vm.swappiness=1 减少换页
- fs.file-max=1000000 增加文件描述符上限
- net.core.somaxconn=4096 提高连接队列
My.cnf 配置需针对容器环境优化:
[mysqld]
innodb_buffer_pool_size = 容器可用内存的70%
innodb_flush_neighbors = 0 # SSD环境下禁用相邻页刷新
innodb_io_capacity = 2000 # 高性能存储可提升至2000-4000
高可用与读写分离实现
使用 Operator 模式可简化 MySQL 集群管理。开源的 MySQL Operator 或自研控制器能实现自动故障转移、扩缩容和配置管理。主从切换逻辑应包含网络端点切换和只读状态检测,避免脑裂情况发生。
ProxySQL 可作为 K8s 中的读写分离中间件。部署为 Deployment 并配置服务发现,自动识别主从节点变化。连接池配置示例:
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES
(10,'mysql-master',3306),
(20,'mysql-replica',3306);
监控与日志收集方案
Prometheus Operator 配合 mysqld_exporter 实现指标采集。关键监控指标包括:
- 查询吞吐量(queries/sec)
- 连接数使用率(threads_connected/max_connections)
- 复制延迟(seconds_behind_master)
EFK 栈(Elasticsearch+Fluentd+Kibana)处理日志。Fluentd 配置需解析慢查询日志和错误日志:
<filter mysql.**>
@type parser
key_name log
<parse>
@type regexp
expression /^(?<timestamp>\d{6} \d{2}:\d{2}:\d{2}) (?<query_id>\d+) \[(?<level>\w+)\] (?<message>.*)/
</parse>
</filter>
安全加固措施
网络隔离通过 NetworkPolicy 实现。限制只有应用 Pod 能访问 MySQL 端口:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
spec:
podSelector:
matchLabels:
app: mysql
ingress:
- from:
- podSelector:
matchLabels:
app: webapp
ports:
- protocol: TCP
port: 3306
加密传输需配置 TLS 证书。使用 cert-manager 自动签发内部证书,并在 MySQL 配置中启用 SSL:
[mysqld]
ssl-ca=/etc/mysql/certs/ca.crt
ssl-cert=/etc/mysql/certs/server.crt
ssl-key=/etc/mysql/certs/server.key
require_secure_transport=ON
文章内容转自:www.yiyangjiaju.com.cn

巨人网络公司福利 91人发布