はじめに
はじめまして。
システム開発推進部第1Gの望月です。
普段は主にフロントエンド領域の開発を行っているのですが、最近AWSでサーバー構築をする機会があり、その過程でEC2間のリアルタイム同期処理について色々と試していました。
現在進行形で勉強しつつではありますが、同期処理こんな感じでもできた、というのを自分用の振り返りも兼ねてまとめてみたいと思います。
作業環境として、OSはAmazon Linux 2になります。
使用するツール
rsync
- Remote Sync
- ファイルやディレクトリを同期するためのツール
lsyncd
- Live Syncing Daemon
- ローカルファイルシステムの変更を監視し、変更が検出されると指定されたターゲットにファイルを同期するデーモン
※rsyncとlsyncdの関係性
- lsyncdは常にファイルの変更を監視しており、変更が検出されるとrsyncを使用して同期処理を実行します
xinetd
- クライアントからの接続要求を受け付けて、必要な時に必要なものを起動するためシステムリソースを節約できる
- 今回の場合、同期先にてrsync要求を受け付け、そのタイミングで同期処理を実行することができます
パッケージのインストール
Master側での作業
rsyncのインストール
Amazon Linux 2にはデフォルトでrsyncがインストールされているため、インストールされていることを確認します。
rsync --version # 入っていない場合は以下でインストール yum install rsync |
lsyncdのインストール
lsyncdをインストールするため、epelリポジトリをインストールします。
amazon-linux-extras install epel |
lsyncdをインストールします。
yum install lsyncd |
Slave側での作業
rsyncのインストール
Master側同様に、rsyncのインストール確認を行います。
rsync --version # 入っていない場合は以下でインストール yum install rsync |
xinetdのインストール
Masterからのrsync要求を受け付けるために、xintedをインストールします。
yum install xinetd |
SSH公開鍵の設置
EC2間はSSHで通信するため、公開鍵の設置を行います。
Master側での作業
ルートユーザーの公開鍵があることを確認し、中身をコピーします。
cat /root/.ssh/id_rsa.pub # 鍵がない場合は以下で作成 # .sshへ移動 cd ~/.ssh # 鍵を作成 ssh-keygen -t rsa |
Slave側での作業
先ほどコピーしたMaster側のSSH公開鍵をSlave側に設置し、保存します。
vim ~/.ssh/authorized_keys |
設定ファイルの変更
Master側での作業
lsyncd.confの設定ファイルを変更します。
vim /etc/lsyncd.conf |
変更内容は以下になります。
settings { logfile = "/var/log/lsyncd.log", statusFile = "/tmp/lsyncd.stat", statusInterval = 1, } sync { default.rsync, source = "[同期元のディレクトリのパス]", target = "[ユーザー名]@[同期先EC2のプライベートIPアドレス]::wordpress(※モジュールの指定)", init = false, delete = "running", exclude = { ".*" }, rsync = { archive = true, links = true, verbose = false, owner = true, group = true } } |
Slave側での作業
xinetdの設定を変更します。
vim /etc/xinetd.d/rsync |
変更内容は以下になります。
# default: off # description: The rsync server is a good addition to an ftp server, as it \ # allows crc checksumming etc. service rsync { disable = no flags = IPv6 socket_type = stream wait = no user = root server = /usr/bin/rsync server_args = --daemon log_on_failure += USERID } |
rsyncの設定を変更します。
vim /etc/rsyncd.conf |
以下を追記します。
#-------------- # Global options #-------------- uid = root gid = root log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid hosts allow = [同期先EC2のプライベートIPアドレス] hosts deny = * dont compress = *.gz *.tgz *.zip *.pdf *.sit *.sitx *.lzh *.bz2 *.jpg *.gif *.png [wordpress(※任意のモジュール名)] comment = rsync server path = [同期先のディレクトリのパス] read only = false exclude = *.mp include = *.mp30 |
再起動する
Slave側での作業
xinetdを再起動します。
systemctl restart xinetd |
Master側での作業
lsyncdを起動します。
systemctl start lsyncd |
実行
Master側にて、以下コマンドで実行します。
rsync -avz [同期元のディレクトリのパス] [同期先EC2のプライベートIPアドレス]::wordpress(※モジュールの指定)/ |
以上で、Master側の指定したディレクトリ配下に更新があった時、自動でSlave側も更新されるようになりました。
まとめ
なんとか2台のEC2をリアルタイムで同期処理させることができました。
今回はリアルタイム同期を目指して、rsyncでの同期処理にlsyncdを使用してみたのですが、cronを使って定期的に処理を実行させる方法もあるようです。
そちらはまだ試せていないのですが、このあたりは今後調べて検討したい、というところで今回は終わりとさせていただきます。
最後までお読みいただきありがとうございます。
参考にしたもの
rsyncd の設定
lsync、rsyncでのディレクトリ同期 for WordPress
同期設定(rsync)を今一度整理してみました
この記事を書いた人
最近書いた記事
- 2024.09.122台のEC2間をリアルタイムで同期させてみる
- 2023.12.03【Stylelint】コード検証ツールでCSSの見落としをなくす
- 2022.12.08【連載企画4日目】ウェブ画面開発者の頭の中を見てみよう!〜伝言編 part3〜