背景
有个需求是要将mysql的binlog文件实时同步到另一服务器。通过rsync + inotify 方案构建一个小型同步服务,并跑在 Docker 容器中。
构建镜像并启动容器
1、创建Dockerfile
FROM alpine:latest # 创建目录用来映射binlog文件目录 RUN mkdir -p /app/data # 创建目录用来映射脚本文件 RUN mkdir -p /app/watcher RUN apk add --no-cache rsync inotify-tools openssh nano # 创建入口点脚本 RUN echo $'#!/bin/sh\n\ # 确保脚本存在并执行\n\ if [ -f "/app/watcher/sync.sh" ]; then\n\ chmod +x /app/watcher/sync.sh\n\ echo "Starting sync service..."\n\ exec /app/watcher/sync.sh\n\ else\n\ echo "WARNING: /app/watcher/sync.sh not found. Container will sleep instead."\n\ exec sleep infinity\n\ fi' > /entrypoint.sh && chmod +x /entrypoint.sh # 设置入口点 ENTRYPOINT ["/entrypoint.sh"]
2、sync.sh脚本,其中RSYNC_TARGET要替换成自己的服务器和路径
#!/bin/sh WATCH_DIR="/app/data" #目标服务器和路径 RSYNC_TARGET="root@:10.30.10.38/home/mysql/data" inotifywait -m -e close_write,create,move,delete,modify "$WATCH_DIR" --format '%f' | while read FILE do echo "File change detected: $FILE" case "$FILE" in #只监听mysql-bin.开头的文件 mysql-bin.*) echo "Syncing $FILE to $RSYNC_TARGET" rsync -avz "$WATCH_DIR/$FILE" "$RSYNC_TARGET" ;; esac done
3、构建镜像,确保Dockerfile和sync.sh在一个文件夹
#构建镜像 docker build -t rsync-watcher . #查看镜像 docker images
4、检查sync.sh文件,如果有CRLF格式会导致容器启动失败
# 检查文件格式(CRLF会导致错误) file sync.sh #如果输出包含 CRLF,转换格式 sed -i 's/\r$//' sync.sh
5、启动容器
docker run -d --name rsync-watcher \ -v /home/docker/mysql/data:/app/data \ -v /home/rsync-watcher:/app/watcher \ rsync-watcher #查看容器 docker ps
解释
-v /home/docker/mysql/data:/app/data mysql binlog所在路径,或者你需要同步的文件路径,映射到容器中 -v /home/rsync-watcher:/app/watcher rsyn.sh所在路径,方便后续调整脚本
6、查看日志
docker logs rsync-watcher
看到如下信息说明容器启动成功
rsync配置文件
#进入容器 docker exec -it rsync-watcher /bin/sh vi /etc/rsyncd.conf
将如下配置改成yes
use chroot = yes read only = yes
ssh免密登录
如果目标服务器需要验证登录,则可以配置ssh免密登录
#进入容器 docker exec -it rsync-watcher /bin/sh cd /root #生成id_rsa.pub,然后一直按回车键 ssh-keygen -t rsa ssh-copy-id -i .ssh/id_rsa.pub [email protected] #然后输入远程服务器的密码
使用ssh验证
ssh [email protected]
测试全量推送
#进入容器 docker exec -it rsync-watcher /bin/sh rsync -avz /app/data/ root@:10.30.10.38/home/mysql/data
然后去目标服务器的路径查看是否已经推送。
至此,服务搭建完成,后续只要mysql-bin文件有变动便会推送到目标服务器的指定文件。
點擊查看更多內容
為 TA 點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦