はじめに
はじめまして。 システム開発推進部第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)を今一度整理してみました
望月華