目次

目次

2台のEC2間をリアルタイムで同期させてみる

アバター画像
望月華
アバター画像
望月華
最終更新日2024/09/12 投稿日2024/09/12

はじめに

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

アバター画像

望月華

目次