如何将rc.local中的pt-kill守护进程以Docker方式部署?
将pt-kill守护进程迁移至Docker部署的方案
核心思路
原来的pt-kill通过--daemonize后台运行,迁移到Docker时需要调整为前台运行(容器依赖主进程存活),同时用环境变量传递敏感配置,遵循Docker单进程原则为每个数据库实例创建独立容器。
步骤1:选择基础镜像
直接使用Percona官方提供的预装Percona Toolkit的镜像,无需手动安装:
percona/percona-toolkit:latest
步骤2:单实例Docker运行命令
针对db-1和db-2分别启动独立容器,用环境变量传递数据库密码(避免硬编码):
启动针对db-1的容器
docker run -d --name pt-kill-db1 \ --restart=always \ -e DB_PASSWORD="your_db_password" \ percona/percona-toolkit \ pt-kill --rds --match-command Query --victims all --match-user phppoint --busy-time 30 --kill --print \ h=db-1,u=master,p=${DB_PASSWORD},P=3306
启动针对db-2的容器
docker run -d --name pt-kill-db2 \ --restart=always \ -e DB_PASSWORD="your_db_password" \ percona/percona-toolkit \ pt-kill --rds --match-command Query --victims all --match-user phppoint --busy-time 30 --kill --print \ h=db-2,u=master,p=${DB_PASSWORD},P=3306
--restart=always:容器退出时自动重启,保证服务可用性。- 移除了原命令中的
--daemonize,让pt-kill前台运行,确保容器持续存活。
步骤3:更规范的Dockerfile方式
如果需要自定义镜像(比如添加健康检查),可以编写Dockerfile:
FROM percona/percona-toolkit:latest # 设置默认配置(可通过运行时环境变量覆盖) ENV DB_HOST=db-1 ENV DB_USER=master ENV DB_PASSWORD="" ENV DB_PORT=3306 # 健康检查:定期验证pt-kill能否连接数据库 HEALTHCHECK --interval=5m --timeout=3s \ CMD pt-kill --test --rds h=${DB_HOST},u=${DB_USER},p=${DB_PASSWORD},P=${DB_PORT} || exit 1 # 前台启动pt-kill CMD ["pt-kill", "--rds", "--match-command", "Query", "--victims", "all", "--match-user", "phppoint", "--busy-time", "30", "--kill", "--print", "h=${DB_HOST},u=${DB_USER},p=${DB_PASSWORD},P=${DB_PORT}"]
构建并运行镜像
# 构建镜像 docker build -t custom-pt-kill . # 运行db-1实例 docker run -d --name pt-kill-db1 \ --restart=always \ -e DB_HOST=db-1 \ -e DB_PASSWORD="your_db_password" \ custom-pt-kill # 运行db-2实例 docker run -d --name pt-kill-db2 \ --restart=always \ -e DB_HOST=db-2 \ -e DB_PASSWORD="your_db_password" \ custom-pt-kill
关键注意事项
- 网络连通性:确保Docker容器能访问目标数据库
db-1和db-2。如果数据库在Docker集群内,需将容器加入同一自定义网络;如果是外部数据库,需保证容器网络路由可达。 - 日志查看:
pt-kill的--print输出会直接进入Docker日志,可通过docker logs pt-kill-db1查看,替代原后台运行的日志文件。 - 敏感信息管理:生产环境建议用Docker Secrets或K8s Secrets传递密码,避免直接在命令行暴露密码。
内容的提问来源于stack exchange,提问作者Chris Muench
相关产品推荐
相关产品推荐

