🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

4018閲覧

lsyncd + rsyncdのリアルタイム片方向同期を行いたいが、lsyncによりファイルのdeleteが行われない

sujico.net

総合スコア453

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2019/10/24 01:04

編集2019/10/24 01:08

困っていること

lsyncdとrsyncdにより、親サーバのあるディレクトリの内容を子サーバのあるディレクトリに同期する形でコピーしたいと考えています。
コピーしたい内容は以下です。

  • ディレクトリ、ファイルの作成、更新、削除
  • ディレクトリ、ファイルの権限
  • ディレクトリ、ファイルのタイムスタンプ

しかし、この内削除のみうまくいきません。
やりたいことは、「同期先で作成されたファイル」が「同期元に無い」場合「同期先でファイルを削除」するということです。

調べてみたところ、lsyncdで同期元に無いファイルをrsyncdで削除するには、lsyncdの設定ファイルでdeleteをtrueにする必要があるようですが、
ドキュメントによるとdelete=trueはデフォルト設定になっているようです。

rsyncで**--delete**オプションをつけて実施すれば問題なく差分削除されますし、
lsyncに関してもsystemctl restart lsyncd.service などとサービスの再起動を行えばそのタイミングで差分削除が行われます。

この差分削除に関して動作させたいのですが、何か特別な条件などが必要でしょうか。

#動作環境

バージョンなど

OS …… AmazonLinux2 (Amazon EC2で動作 / 2つのOSでそれぞれ検証済)
rsync …… 3.1.2 (親子同じ)
lsync …… 2.2.2 (親子同じ)

設定

/etc/lsyncd.conf (親サーバ)

settings { logfile = "/var/log/lsyncd.log", pidfile = "/var/run/lsyncd.pid", statusFile = "/var/log/lsyncd-status.log", statusInterval = 1, nodaemon = false, } sync { default.rsync, source = "/tmp/rsynctest/test1/", target = "xxx.xxx.xxx.xxx::module1", delay = 0, rsync = { owner = true, group = true, perms = true, hard_links = true, archive = true, inplace = true } }

 
/etc/rsyncd.conf (親サーバ)

uid = root gid = root log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid hosts allow = xxx.xxx.xxx.xxx/32 hosts deny = * read only = true exclude = * include = * dont compress = *.gz *.tgz *.zip *.pdf *.sit *.sitx *.lzh *.bz2 *.jpg *.gif *.png #------------------ # MODULE PARAMETERS #------------------ [module1] comment = rsync test dir1 path = /tmp/rsynctest/test1/

ここまで調査した中であやしいこと

https://qiita.com/msssgur/items/4e2b199796654e0af791
上記にて、

リモートで修正されたものはローカルと同期されないので、変更は必ずローカルで行うこと。

とあるため、実はそもそもリモートで作成したファイルはlsyncで削除できないのではと考えています。

ただ、lsyncdを再起動したときとrsyncでならば「同期」することが出来るため、これが正しい動作なのかどうかがわからなくなっています。

参考サイト

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

やりたいことは、「同期先で作成されたファイル」が「同期元に無い」場合「同期先でファイルを削除」するということです。

これは、同期先でファイルを作成しただけですか?

lsyncdはinotify APIを使用して同期元で指定したディレクトリ内の変更を監視する仕組みです。

lsyncdでrsyncが実行されるトリガーは以下のふたつです。
・lsyncd起動時
・同期元で指定したディレクトリ内で何らかの変更が発生した場合

同期先でファイルを作成したのち、同期元で何かのファイルを変更してみてください。
同期先で作成したファイルが削除されるはずです。

これ間違いだったようです。
CMSからのHTML出力をWEBサーバーに同期していたのですが、CMSが出力する際に一旦丸ごと削除して出力しなおしていたため一見このような動作に見えていただけだったようです。

投稿2019/10/24 01:57

編集2019/10/24 04:21
Y.H.

総合スコア7918

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sujico.net

2019/10/24 02:26

ご回答頂きありがとうございます。 はい、同期先でファイルを作成したのみとなります。 > lsyncdでrsyncが実行されるトリガーは以下のふたつです。 > ・lsyncd起動時 > ・同期元で指定したディレクトリ内で何らかの変更が発生した場合 これであると、lsyncd再起動時にrsyncが実行されており、削除含め指定ディレクトリでの同期が行われることは確認できていますが 同期元で何らかのファイルを作成・変更したタイミングで同期先で作成したファイルの削除のみ行われないようです。(同期元で作成・変更したファイルは同期先での反映が確認できるが、同期先でのみ作成したファイルの削除が行われない)
Y.H.

2019/10/24 02:32

/var/log/lsyncd.logに実行されたrsyncのコマンドが出力されてないですか? 起動時と比較して違いがないですかね。
sujico.net

2019/10/24 02:46

それぞれ同期先でgomi.txtというファイルを作成し、確認してみました。 systemctl restart lsyncdを行った際のlsyncd.log ``` Thu Oct 24 xx:xx:xx 2019 Normal: --- TERM signal, fading --- Thu Oct 24 xx:xx:xx 2019 Normal: --- Startup --- Thu Oct 24 xx:xx:xx 2019 Normal: recursive startup rsync: /tmp/rsynctest/test1/ -> xxx.xxx.xxx.xxx::module1/ Thu Oct 24 xx:xx:xx 2019 Normal: Startup of /tmp/rsynctest/test1/ -> xxx.xxx.xxx.xxx::module1/ finished. ``` 同期元対象ディレクトリにてtestdeletefile.txtというファイルをrmした際のログ ``` Thu Oct 24 xx:xx:yy 2019 Normal: Calling rsync with filter-list of new/modified files/dirs /testdeletefile.txt / Thu Oct 24 xx:xx:yy 2019 Normal: Finished a list after exitcode: 0 ``` このようにログに残っている実行内容には差異があるようです。 後者でもrsyncが呼び出されているようですが、前者と異なりgomi.txtファイルは削除されません。
Y.H.

2019/10/24 04:18

起動時はフル同期で変更時は変更のあったもののみ直撃での同期ですね。。。
sujico.net

2019/10/24 04:28

なるほど…、ということはそもそも片方向同期ならば 同期先で勝手にファイル作ったりされちゃうのが誤りで、そこはlsyncで解決すべきところではない、というのが正しいでしょうか?
Y.H.

2019/10/24 04:54

そうなりますね。
sujico.net

2019/10/24 04:56

勉強になりました、ご回答頂きありがとうございました! ベストアンサーとさせて頂きます。
Y.H.

2019/10/24 04:58

お役に立てませんでした。 リアルタイムでなくていいなら、別途cronなどで定期的にrsyncで同期しちゃうとか・・・
sujico.net

2019/10/24 06:07

とんでもございません。 そうですね、同期先サーバにはユーザが書き込み出来ないようにした上で、lsyncを活用するかrsyncを直で実行する運用にするか、考えてみたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問