亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

docker部署rsync+inotify,實現文件同步服務

  • 背景

    有个需求是要将mysql的binlog文件实时同步到另一服务器。通过rsync + inotify 方案构建一个小型同步服务,并跑在 Docker 容器中。

                    https://img1.sycdn.imooc.com/04259368086dc67209250271.jpg

  • 构建镜像并启动容器

    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

    https://img1.sycdn.imooc.com/85fd8868096e074310870356.jpg

4、检查sync.sh文件,如果有CRLF格式会导致容器启动失败

# 检查文件格式(CRLF会导致错误)
file sync.sh
#如果输出包含 CRLF,转换格式
sed -i 's/\r$//' sync.sh

https://img1.sycdn.imooc.com/091e2068086e0d3506700165.jpg

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

看到如下信息说明容器启动成功

https://img1.sycdn.imooc.com/3b81c368096e0f5b04430086.jpg

  • 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]
#然后输入远程服务器的密码

   https://img1.sycdn.imooc.com/f1c24268086e179305990362.jpg

 使用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 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
JAVA開發工程師
手記
粉絲
1
獲贊與收藏
3

關注作者,訂閱最新文章

閱讀免費教程

  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消