RedisのReplicationをEC2で構築する


■概要

AWS使えるけどElastiCache使えない残念なお仕事です。ならばEC2に自力でRedisを構築するしかないわけですが、Replicationを構築する際にちょっとハマったので手順を残しておきます。

■構築

1. EC2インスタンス起動

今回はAmazon Linux 2のAMIを利用します。
インスタンスタイプはt3.smallを2台、セキュリティグループはtcp/6379を開けます。

2. Redisインストール

master/slave両方
sudo amazon-linux-extras install redis4.0

下記の記事を参考にしました。
AWS EC2にredisをインストールする
https://qiita.com/stoshiya/items/b8c1d2eb41770f92ffcf

3. redis.conf修正

master/slave両方
sudo vi /etc/redis.conf

3.1. bindの設定

(修正前)
bind 127.0.0.1
(修正後)
#bind 127.0.0.1
コメントアウトする

3.2. protected-modeの設定

(修正前)
protected-mode yes
(修正後)
protected-mode no

3.3. slaveの設定 ※slaveのみ※

(修正前)
# slaveof
(修正後)
# slaveof
slaveof aa.bb.cc.dd 6379
※aa.bb.cc.ddにはmasterのプライベートIPを指定する

4. Redis起動

master/slave両方
sudo redis-server /etc/redis.conf &

■動作確認

5. Replicationが設定されていることを確認

5.1. それぞれのサーバでredis-cli起動

master/slave両方
redis-cli

5.2. それぞれのサーバでinfo表示

master/slave両方
127.0.0.1:6379> info
(master側)
# Replication
role:master
(slave側)
# Replication
role:slave
※slave側でrole:masterと表示される場合は、正しくReplication設定できていないので、構築手順を見直す。

6. masterを更新してslaveに反映されることを確認

6.1. masterで値セット

master側
127.0.0.1:6379> set key1 value1
=> OK

6.2. slaveで値を確認

slave側
127.0.0.1:6379> get key1
=> "value1"
ちゃんとmaster=>slave間でレプリケーションされていることが確認できましたね。

7. slaveは更新できないことを確認

slave側
127.0.0.1:6379> set key2 value2
=> (error) READONLY You can't write against a read only slave.

8. slaveがmasterに昇格できることを確認

8.1. slaveをmasterに昇格

slave側
127.0.0.1:6379> SLAVEOF NO ONE
=> OK

8.2. 確認

slave側
127.0.0.1:6379> info
# Replication
role:master

8.3. 値が設定できる

slave側
127.0.0.1:6379> set key2 value2
=> OK

8.4. master側で値を設定してもslaveに反映しない

master側
127.0.0.1:6379> set key2 value3
=> OK
slave側
127.0.0.1:6379> get key2
=> "value2"

9. slaveに復帰

9.1. slaveホストをmasterのslaveノードとして復帰

slave側
127.0.0.1:6379> slaveof 172.30.1.71 6379
=> OK

9.2. key2を取ってみる

127.0.0.1:6379> get key2
=> "value3"
※masterが持っていた値に上書きされた