Redis Sentinel の動作を確認する

Redis Sentinel はマスターサーバーの障害を検知し、動的にレプリカをマスターに昇格することできる高可用性ソリューションです。本記事はマスターサーバーがダウンしたときの動作について説明します。マスターサーバーの redis-server のプロセスをダウンするケースについて記載します。

![Redis Sentinel Diagram-masterdown.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/3f953883-d31d-f7e8-f7e7-e244caf0b3b6.jpeg)


# Redis Sentinel の準備

Redis Sentinel の構成を用意します。下記の記事の Akamai 社が提供する環境を利用します。

https://qiita.com/110hideki/items/b816bf1bece1e8f5fef3

Redis Sentinel は 3 台のクラスタ環境で動作しています。
![Redis Sentinel Diagram-normal.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/13de78ec-0f92-e5ea-a7e0-51fb07784357.jpeg)


# Redis Sentinel のバージョンの確認


```
redissentinel-tokyo1:/etc/redis# redis-server --version
Redis server v=7.0.11 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=3af367a78d5e21e9
```
```
redissentinel-tokyo1:/etc/redis# redis-sentinel --version
Redis server v=7.0.11 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=3af367a78d5e21e9
```

# Master サーバーの停止
マスターサーバーを計画停止したときの動作を検証します。
```
systemctl stop redis-server
```

![Redis Sentinel Diagram-masterdown.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/c1e5159c-f489-bfdc-fc1c-642686a4f986.jpeg)

Redis-server は停止していますが、Redis-sentinel は動作している状態です。


# マスターの変更過程

![Redis Sentinel Diagram-masterchange.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/6cacc52b-d17d-eca4-48e8-93bed1099fd0.jpeg)

マスターがどのように変化していくかを、各サーバーのログを見ながら確認します。

## Redis_1 (マスターの停止）
マスターであった redis-server が停止したときのログを見ていきます。

### /var/log/redis/redis.log
```
21223:signal-handler (1688124943) Received SIGTERM scheduling shutdown...
21223:signal-handler (1688124943) Received SIGTERM scheduling shutdown...
21223:M 30 Jun 2023 11:35:43.835 # User requested shutdown...
21223:M 30 Jun 2023 11:35:43.836 * Waiting for replicas before shutting down.
21223:M 30 Jun 2023 11:35:44.743 * 2 of 2 replicas are in sync when shutting down.
21223:M 30 Jun 2023 11:35:44.743 * Saving the final RDB snapshot before exiting.
21223:M 30 Jun 2023 11:35:44.747 * DB saved on disk
21223:M 30 Jun 2023 11:35:44.747 * Removing the pid file.
21223:M 30 Jun 2023 11:35:44.747 # Redis is now ready to exit, bye bye...
```
- TERM のシグナルを受け取っています。
- shutdown するときに、２つのレプリカが同期しています。
- データをファイルに保存している。ファイルは ``/var/lib/redis/dump.rdb`` になります。

### /var/log/redis/sentinel.log
```
21283:X 30 Jun 2023 11:36:13.904 # +sdown master mymaster 192.168.198.87 6379
21283:X 30 Jun 2023 11:36:14.931 * Sentinel new configuration saved on disk
21283:X 30 Jun 2023 11:36:14.931 # +new-epoch 1
21283:X 30 Jun 2023 11:36:14.933 * Sentinel new configuration saved on disk
21283:X 30 Jun 2023 11:36:14.933 # +vote-for-leader 1c87ce18ee98b4373cf3d26826893e7fedc29d88 1
21283:X 30 Jun 2023 11:36:15.002 # +odown master mymaster 192.168.198.87 6379 #quorum 2/2
21283:X 30 Jun 2023 11:36:15.003 # Next failover delay: I will not start a failover before Fri Jun 30 11:42:15 2023
21283:X 30 Jun 2023 11:36:16.195 # +config-update-from sentinel 1c87ce18ee98b4373cf3d26826893e7fedc29d88 192.168.198.103 26379 @ mymaster 192.168.198.87 6379
21283:X 30 Jun 2023 11:36:16.196 # +switch-master mymaster 192.168.198.87 6379 192.168.198.103 6379
21283:X 30 Jun 2023 11:36:16.197 * +slave slave 192.168.198.112:6379 192.168.198.112 6379 @ mymaster 192.168.198.103 6379
21283:X 30 Jun 2023 11:36:16.197 * +slave slave 192.168.198.87:6379 192.168.198.87 6379 @ mymaster 192.168.198.103 6379
21283:X 30 Jun 2023 11:36:16.202 * Sentinel new configuration saved on disk
```
- ``11:36:13.904`` の時間に ``192.168.198.87 (redissentinel-tokyo1)`` のダウンを検知している。この時間は redis-server が SIGTERM を受け取った ``11:35:43.835`` から約 30 秒後になります。
- sentinel.conf ファイルを更新している。マスターとレプリカの状態をコンフィグファイルに記録して書き換えています。
- マスターサーバがダウンしたことを多数決で決定しています。
- 6 分間の間は次のフェールオーバーが起きないように設定している。
- マスターを ``192.168.198.103 (redissentinel-tokyo2)`` に設定している。
- ``192.168.198.112 (redissentinel-tokyo3)`` をレプリカに設定している。
- ``192.168.198.87 (redissentinel-tokyo1)`` をレプリカと設定している。
- sentinel.conf ファイルを更新している。

## Redis_2 (レプリカからマスターに昇格)

### /var/log/redis/redis.log
```
17497:S 30 Jun 2023 11:36:14.899 * MASTER <-> REPLICA sync started
17497:S 30 Jun 2023 11:36:14.900 # Error condition on socket for SYNC: (null)
17497:M 30 Jun 2023 11:36:15.137 * Discarding previously cached master state.
17497:M 30 Jun 2023 11:36:15.137 # Setting secondary replication ID to fac9e97e4769636aa327dbdf17c54bbfe8e2a5dc, valid up to offset: 16450434. New replication ID is 4831258c3aa4c7d8d6c9e0eb1244acb86c511c8a
17497:M 30 Jun 2023 11:36:15.137 * MASTER MODE enabled (user request from 'id=8 addr=192.168.198.103:60290 laddr=192.168.198.103:6379 fd=12 name=sentinel-1c87ce18-cmd age=77344 idle=0 flags=x db=0 sub=0 psub=0 ssub=0 multi=4 qbuf=188 qbuf-free=20286 argv-mem=4 multi-mem=169 rbs=4096 rbp=2048 obl=45 oll=0 omem=0 tot-mem=25637 events=r cmd=exec user=default redir=-1 resp=2')
17497:M 30 Jun 2023 11:36:15.152 # CONFIG REWRITE executed with success.
17497:M 30 Jun 2023 11:36:16.372 * Replica 192.168.198.112:6379 asks for synchronization
17497:M 30 Jun 2023 11:36:16.373 * Partial resynchronization request from 192.168.198.112:6379 accepted. Sending 312 bytes of backlog starting from offset 16450434.
```
- マスターとの SYNC の失敗を検知している
- マスターに昇格している
- CONFIG REWRITE を実行している
- ``192.168.198.112 (redissentinel-tokyo3)`` に SYNC を依頼している。

### /var/log/redis/sentinel.log
```
17725:X 30 Jun 2023 11:36:14.820 # +sdown master mymaster 192.168.198.87 6379
17725:X 30 Jun 2023 11:36:14.921 # +odown master mymaster 192.168.198.87 6379 #quorum 2/2
17725:X 30 Jun 2023 11:36:14.921 # +new-epoch 1
17725:X 30 Jun 2023 11:36:14.922 # +try-failover master mymaster 192.168.198.87 6379
17725:X 30 Jun 2023 11:36:14.924 * Sentinel new configuration saved on disk
17725:X 30 Jun 2023 11:36:14.924 # +vote-for-leader 1c87ce18ee98b4373cf3d26826893e7fedc29d88 1
17725:X 30 Jun 2023 11:36:14.934 # b2987056e452e83d9dbf86321430f0e05e6f701c voted for 1c87ce18ee98b4373cf3d26826893e7fedc29d88 1
17725:X 30 Jun 2023 11:36:14.941 # 79552dceee192b3e37e9bc97ef783d11b7056436 voted for 1c87ce18ee98b4373cf3d26826893e7fedc29d88 1
17725:X 30 Jun 2023 11:36:15.015 # +elected-leader master mymaster 192.168.198.87 6379
17725:X 30 Jun 2023 11:36:15.016 # +failover-state-select-slave master mymaster 192.168.198.87 6379
17725:X 30 Jun 2023 11:36:15.072 # +selected-slave slave 192.168.198.103:6379 192.168.198.103 6379 @ mymaster 192.168.198.87 6379
17725:X 30 Jun 2023 11:36:15.072 * +failover-state-send-slaveof-noone slave 192.168.198.103:6379 192.168.198.103 6379 @ mymaster 192.168.198.87 6379
17725:X 30 Jun 2023 11:36:15.136 * +failover-state-wait-promotion slave 192.168.198.103:6379 192.168.198.103 6379 @ mymaster 192.168.198.87 6379
17725:X 30 Jun 2023 11:36:16.184 * Sentinel new configuration saved on disk
17725:X 30 Jun 2023 11:36:16.185 # +promoted-slave slave 192.168.198.103:6379 192.168.198.103 6379 @ mymaster 192.168.198.87 6379
17725:X 30 Jun 2023 11:36:16.185 # +failover-state-reconf-slaves master mymaster 192.168.198.87 6379
17725:X 30 Jun 2023 11:36:16.193 * +slave-reconf-sent slave 192.168.198.112:6379 192.168.198.112 6379 @ mymaster 192.168.198.87 6379
17725:X 30 Jun 2023 11:36:16.424 * +slave-reconf-inprog slave 192.168.198.112:6379 192.168.198.112 6379 @ mymaster 192.168.198.87 6379
17725:X 30 Jun 2023 11:36:16.425 * +slave-reconf-done slave 192.168.198.112:6379 192.168.198.112 6379 @ mymaster 192.168.198.87 6379
17725:X 30 Jun 2023 11:36:16.500 # +failover-end master mymaster 192.168.198.87 6379
17725:X 30 Jun 2023 11:36:16.501 # +switch-master mymaster 192.168.198.87 6379 192.168.198.103 6379
17725:X 30 Jun 2023 11:36:16.502 * +slave slave 192.168.198.112:6379 192.168.198.112 6379 @ mymaster 192.168.198.103 6379
17725:X 30 Jun 2023 11:36:16.502 * +slave slave 192.168.198.87:6379 192.168.198.87 6379 @ mymaster 192.168.198.103 6379
17725:X 30 Jun 2023 11:36:16.507 * Sentinel new configuration saved on disk
17725:X 30 Jun 2023 11:36:46.593 # +sdown slave 192.168.198.87:6379 192.168.198.87 6379 @ mymaster 192.168.198.103 6379
```
- ``11:36:14.820`` に マスターである``192.168.198.87 (redissentinel-tokyo1)`` のダウンを検知している。
- 何度も確認が行われている。
- 最終的に、``192.168.198.103 (redissentinel-tokyo2)`` をマスターとして選出している。
- Sentinel のコンフィグレーションファイルを変更している。
- ``192.168.198.87 (redissentinel-tokyo1)`` はレプリカとしてダウンを検知している。

## Redis_3 (レプリカ -> レプリカ)
### /var/log/redis/redis.log
```
17366:S 30 Jun 2023 11:36:14.343 # Error condition on socket for SYNC: (null)
17366:S 30 Jun 2023 11:36:15.349 * Connecting to MASTER 192.168.198.87:6379
17366:S 30 Jun 2023 11:36:15.349 * MASTER <-> REPLICA sync started
17366:S 30 Jun 2023 11:36:15.349 # Error condition on socket for SYNC: (null)
17366:S 30 Jun 2023 11:36:16.193 * Connecting to MASTER 192.168.198.103:6379
17366:S 30 Jun 2023 11:36:16.194 * MASTER <-> REPLICA sync started
17366:S 30 Jun 2023 11:36:16.194 * REPLICAOF 192.168.198.103:6379 enabled (user request from 'id=7 addr=192.168.198.103:33152 laddr=192.168.198.112:6379 fd=12 name=sentinel-1c87ce18-cmd age=77345 idle=0 flags=x db=0 sub=0 psub=0 ssub=0 multi=4 qbuf=348 qbuf-free=20126 argv-mem=4 multi-mem=183 rbs=8192 rbp=4096 obl=45 oll=0 omem=0 tot-mem=29747 events=r cmd=exec user=default redir=-1 resp=2')
17366:S 30 Jun 2023 11:36:16.219 # CONFIG REWRITE executed with success.
17366:S 30 Jun 2023 11:36:16.345 * Non blocking connect for SYNC fired the event.
17366:S 30 Jun 2023 11:36:16.356 * Master replied to PING, replication can continue...
17366:S 30 Jun 2023 11:36:16.370 * Trying a partial resynchronization (request fac9e97e4769636aa327dbdf17c54bbfe8e2a5dc:16450434).
17366:S 30 Jun 2023 11:36:16.372 * Successful partial resynchronization with master.
17366:S 30 Jun 2023 11:36:16.372 # Master replication ID changed to 4831258c3aa4c7d8d6c9e0eb1244acb86c511c8a
17366:S 30 Jun 2023 11:36:16.372 * MASTER <-> REPLICA sync: Master accepted a Partial Resynchronization.
```
- SYNC の失敗を検知している
- ``192.168.198.103 (redissentinel-tokyo2)`` をマスターと見なし同期をしている。
- CONFIG REWRITE を実行している
- マスターが PING 応答をし、レプリケーションが継続される。
- マスターと部分的な同期が行われた。


### /var/log/redis/sentinel.log
```
17574:X 30 Jun 2023 11:36:14.933 * Sentinel new configuration saved on disk
17574:X 30 Jun 2023 11:36:14.934 # +new-epoch 1
17574:X 30 Jun 2023 11:36:14.938 * Sentinel new configuration saved on disk
17574:X 30 Jun 2023 11:36:14.939 # +vote-for-leader 1c87ce18ee98b4373cf3d26826893e7fedc29d88 1
17574:X 30 Jun 2023 11:36:15.840 # +sdown master mymaster 192.168.198.87 6379
17574:X 30 Jun 2023 11:36:15.894 # +odown master mymaster 192.168.198.87 6379 #quorum 3/2
17574:X 30 Jun 2023 11:36:15.895 # Next failover delay: I will not start a failover before Fri Jun 30 11:42:15 2023
17574:X 30 Jun 2023 11:36:16.198 # +config-update-from sentinel 1c87ce18ee98b4373cf3d26826893e7fedc29d88 192.168.198.103 26379 @ mymaster 192.168.198.87 6379
17574:X 30 Jun 2023 11:36:16.199 # +switch-master mymaster 192.168.198.87 6379 192.168.198.103 6379
17574:X 30 Jun 2023 11:36:16.200 * +slave slave 192.168.198.112:6379 192.168.198.112 6379 @ mymaster 192.168.198.103 6379
17574:X 30 Jun 2023 11:36:16.200 * +slave slave 192.168.198.87:6379 192.168.198.87 6379 @ mymaster 192.168.198.103 6379
17574:X 30 Jun 2023 11:36:16.206 * Sentinel new configuration saved on disk
17574:X 30 Jun 2023 11:36:46.209 # +sdown slave 192.168.198.87:6379 192.168.198.87 6379 @ mymaster 192.168.198.103 6379
```
- sentinel.conf ファイルを更新している。
- マスターであった ``192.168.198.87 (redissentinel-tokyo1)`` のダウンを検知している。
- 6 分間は次のフェールオーバーが起きないように設定している。
- マスターを ``192.168.198.103 (redissentinel-tokyo2)`` にしている。
- ``192.168.198.87 (redissentinel-tokyo1)`` をレプリカと設定している。
- sentinel.conf ファイルを更新している。
- スレーブの ``192.168.198.87 (redissentinel-tokyo1)`` のダウンを記録している

## redis-cli から Master/replica を確認する
### redis_1 (サーバーのダウン)
```
redisclient:~# redis-cli -h redissentinel-tokyo1 --tls --cacert redissentinel-tokyo_ca.crt
Could not connect to Redis at redissentinel-tokyo1:6379: Connection refused
```

### redis_2 (レプリカからマスターに昇格)
```
redisclient:~# redis-cli -h redissentinel-tokyo2 --tls --cacert redissentinel-tokyo_ca.crt
redissentinel-tokyo2:6379> ping
PONG
redissentinel-tokyo2:6379> role
1) "master"
2) (integer) 16492964
3) 1) 1) "192.168.198.112"
      2) "6379"
      3) "16492819"
redissentinel-tokyo2:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.198.112,port=6379,state=online,offset=16495596,lag=1
master_failover_state:no-failover
master_replid:4831258c3aa4c7d8d6c9e0eb1244acb86c511c8a
master_replid2:fac9e97e4769636aa327dbdf17c54bbfe8e2a5dc
master_repl_offset:16495596
second_repl_offset:16450434
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15432268
repl_backlog_histlen:1063329
redissentinel-tokyo2:6379>
```

マスターに昇格したことで、書き込みが可能になる。
```
redisclient:~# redis-cli -h redissentinel-tokyo2 --tls --cacert redissentinel-tokyo_ca.crt
redissentinel-tokyo2:6379> get scott
"dixon"
redissentinel-tokyo2:6379> set scott tiger
OK
redissentinel-tokyo2:6379> get scott
"tiger"
```

### redis_3 (レプリカからロールの変更はなし）
```
redisclient:~# redis-cli -h redissentinel-tokyo3 --tls --cacert redissentinel-tokyo_ca.crt
redissentinel-tokyo3:6379> ping
PONG
redissentinel-tokyo3:6379> role
1) "slave"
2) "192.168.198.103"
3) (integer) 6379
4) "connected"
5) (integer) 16501266
redissentinel-tokyo3:6379> info replication
# Replication
role:slave
master_host:192.168.198.103
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:16503016
slave_repl_offset:16503016
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:4831258c3aa4c7d8d6c9e0eb1244acb86c511c8a
master_replid2:fac9e97e4769636aa327dbdf17c54bbfe8e2a5dc
master_repl_offset:16503016
second_repl_offset:16450434
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15452708
repl_backlog_histlen:1050309
redissentinel-tokyo3:6379
```



# Redis_1 のリスタート
マスターであった Redis_1 がダウンしたことで、Redis_2 がマスターになっています。この状態から Redis_1 をアップすると下図のように Redis_2 がマスターになり、Redis_1 はレプリカとして動作します。
![Redis Sentinel Diagram-slaveup.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/1d3bdd57-f4a9-0ba6-6a7a-1255e8a14a7a.jpeg)

## redis_1
```
redissentinel-tokyo1:/etc/redis# systemctl start redis-server
```



### /var/log/redis/server.log
```
31517:M 30 Jun 2023 11:41:26.650 * Ready to accept connections
31517:S 30 Jun 2023 11:41:37.261 * Before turning into a replica, using my own master parameters to synthesize a cached master: I may be able to synchronize with the new master with just a partial transfer.
31517:S 30 Jun 2023 11:41:37.262 * Connecting to MASTER 192.168.198.103:6379
31517:S 30 Jun 2023 11:41:37.262 * MASTER <-> REPLICA sync started
31517:S 30 Jun 2023 11:41:37.262 * REPLICAOF 192.168.198.103:6379 enabled (user request from 'id=3 addr=192.168.198.112:47512 laddr=192.168.198.87:6379 fd=9 name=sentinel-79552dce-cmd age=10 idle=0 flags=x db=0 sub=0 psub=0 ssub=0 multi=4 qbuf=203 qbuf-free=20271 argv-mem=4 multi-mem=183 rbs=1024 rbp=1024 obl=45 oll=0 omem=0 tot-mem=22579 events=r cmd=exec user=default redir=-1 resp=2')
31517:S 30 Jun 2023 11:41:37.354 # CONFIG REWRITE executed with success.
31517:S 30 Jun 2023 11:41:37.392 * Non blocking connect for SYNC fired the event.
31517:S 30 Jun 2023 11:41:37.401 * Master replied to PING, replication can continue...
31517:S 30 Jun 2023 11:41:37.412 * Trying a partial resynchronization (request ea8357aacfed619a5e0d9df56ada81fdbe5d73c9:16452771).
31517:S 30 Jun 2023 11:41:42.321 * Full resync from master: 4831258c3aa4c7d8d6c9e0eb1244acb86c511c8a:16520922
31517:S 30 Jun 2023 11:41:42.324 * MASTER <-> REPLICA sync: receiving streamed RDB from master with EOF to disk
31517:S 30 Jun 2023 11:41:42.324 * Discarding previously cached master state.
31517:S 30 Jun 2023 11:41:42.325 * MASTER <-> REPLICA sync: Flushing old data
31517:S 30 Jun 2023 11:41:42.325 * MASTER <-> REPLICA sync: Loading DB in memory
31517:S 30 Jun 2023 11:41:42.327 * Loading RDB produced by version 7.0.7
31517:S 30 Jun 2023 11:41:42.328 * RDB age 0 seconds
31517:S 30 Jun 2023 11:41:42.328 * RDB memory usage when created 2.51 Mb
31517:S 30 Jun 2023 11:41:42.328 * Done loading RDB, keys loaded: 1, keys expired: 0.
31517:S 30 Jun 2023 11:41:42.328 * MASTER <-> REPLICA sync: Finished with success

```
- マスターの ``192.168.198.103 (redissentinel-tokyo2)`` に接続している。
- マスターから同期している。
- CONFIG WRITE を実行している。
- 以前のマスターの状態を破棄している。
- マスターからの同期を完了している。

### /var/log/redis/sentinel.log
```
21283:X 30 Jun 2023 11:41:27.658 # -sdown slave 192.168.198.87:6379 192.168.198.87 6379 @ mymaster 192.168.198.103 6379
```
- ``192.168.198.87 (redissentinel-tokyo1)``のダウンの状況を解除しています。

### redis-cli からの接続
レプリカとして接続できています。
```
redisclient:~# redis-cli -h redissentinel-tokyo1 --tls --cacert redissentinel-tokyo_ca.crt
redissentinel-tokyo1:6379> ping
PONG
redissentinel-tokyo1:6379> role
1) "slave"
2) "192.168.198.103"
3) (integer) 6379
4) "connected"
5) (integer) 16549337
redissentinel-tokyo1:6379> info replication
# Replication
role:slave
master_host:192.168.198.103
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_read_repl_offset:16550074
slave_repl_offset:16550074
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:4831258c3aa4c7d8d6c9e0eb1244acb86c511c8a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:16550074
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:16520923
repl_backlog_histlen:29152
```

## redis_2

### /var/log/redis/server.log
```
17497:M 30 Jun 2023 11:41:37.414 * Replica 192.168.198.87:6379 asks for synchronization
17497:M 30 Jun 2023 11:41:37.414 * Partial resynchronization not accepted: Replication ID mismatch (Replica asked for 'ea8357aacfed619a5e0d9df56ada81fdbe5d73c9', my replication IDs are '4831258c3aa4c7d8d6c9e0eb1244acb86c511c8a' and 'fac9e97e4769636aa327dbdf17c54bbfe8e2a5dc')
17497:M 30 Jun 2023 11:41:37.414 * Delay next BGSAVE for diskless SYNC
17497:M 30 Jun 2023 11:41:42.321 * Starting BGSAVE for SYNC with target: replicas sockets
17497:M 30 Jun 2023 11:41:42.322 * Background RDB transfer started by pid 28448
28448:C 30 Jun 2023 11:41:42.325 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB
17497:M 30 Jun 2023 11:41:42.326 # Diskless rdb transfer, done reading from pipe, 1 replicas still up.
17497:M 30 Jun 2023 11:41:42.331 * Background RDB transfer terminated with success
17497:M 30 Jun 2023 11:41:42.331 * Streamed RDB transfer with replica 192.168.198.87:6379 succeeded (socket). Waiting for REPLCONF ACK from slave to enable streaming
17497:M 30 Jun 2023 11:41:42.331 * Synchronization with replica 192.168.198.87:6379 succeeded
```
- ``192.168.198.87 (redissentinel-tokyo1)``と同期しています。

### /var/log/redis/sentinel.log
```
17725:X 30 Jun 2023 11:41:27.664 # -sdown slave 192.168.198.87:6379 192.168.198.87 6379 @ mymaster 192.168.198.103 6379
```
- ``192.168.198.87 (redissentinel-tokyo1)``のダウンの状況を解除しています。

## redis_3

### /var/log/redis/server.log
```
no log
```

### /var/log/redis/sentinel.log
```
17574:X 30 Jun 2023 11:41:27.196 # -sdown slave 192.168.198.87:6379 192.168.198.87 6379 @ mymaster 192.168.198.103 6379
17574:X 30 Jun 2023 11:41:37.260 * +convert-to-slave slave 192.168.198.87:6379 192.168.198.87 6379 @ mymaster 192.168.198.103 6379
```
- ``192.168.198.87 (redissentinel-tokyo1)``のダウンの状況を解除しています。

# コンフィグファイルの変更差分
## redis_1 

```
redissentinel-tokyo1:/etc/redis# diff redis.conf.before redis.conf.after
> latency-tracking-info-percentiles 50 99 99.9
> replicaof 192.168.198.103 6379
> save 3600 1
> save 300 100
> save 60 10000
```
- スナップショットを取るタイミングの設定が追加されています。

```
redissentinel-tokyo1:/etc/redis# diff sentinel.conf.before sentinel.conf.after

< sentinel config-epoch mymaster 0
< sentinel leader-epoch mymaster 0
< sentinel current-epoch 0
---
> sentinel config-epoch mymaster 1
> sentinel leader-epoch mymaster 1
> sentinel current-epoch 1

< sentinel monitor mymaster 192.168.198.87 6379 2
---
> sentinel monitor mymaster 192.168.198.103 6379 2

< sentinel known-replica mymaster 192.168.198.103 6379
---
> sentinel known-replica mymaster 192.168.198.87 6379
```
- マスターとレプリカの IP を変更しています。

# redis_2

```
redissentinel-tokyo2:/etc/redis#  diff redis.conf.before redis.conf.after
> requirepass "y+8erSZr9YHAUIzA19zkxaS/8d+kjx4tMJ0zWqBqjuE="
> save 3600 1
> save 300 100
> save 60 10000
> latency-tracking-info-percentiles 50 99 99.9
```
- スナップショットを取るタイミングの設定が追加されています。
```
redissentinel-tokyo2:/etc/redis# diff sentinel.conf.before sentinel.conf.after

< sentinel config-epoch mymaster 0
< sentinel leader-epoch mymaster 0
< sentinel current-epoch 0

> sentinel config-epoch mymaster 1
> sentinel leader-epoch mymaster 1
> sentinel current-epoch 1
---
< sentinel monitor mymaster 192.168.198.87 6379 2
> sentinel monitor mymaster 192.168.198.103 6379 2

< sentinel known-replica mymaster 192.168.198.103 6379
> sentinel known-replica mymaster 192.168.198.87 6379
```
- マスターとレプリカの IP を変更しています。

## Redis_3

```
redissentinel-tokyo3:/etc/redis# diff  --suppress-common-lines redis.conf.before redis.conf.after
< supervised auto
---
> supervised systemd
> save 3600 1
> save 300 100
> save 60 10000
> latency-tracking-info-percentiles 50 99 99.9
```
- スナップショットを取るタイミングの設定が追加されています。

![redis_3_redis_diff.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/0f8f1db2-6b93-8e43-f481-9759e9c007bb.jpeg)

```
redissentinel-tokyo3:/etc/redis# diff  --suppress-common-lines sentinel.conf.before sentinel.conf.after
12,14c12,14
< sentinel config-epoch mymaster 0
< sentinel leader-epoch mymaster 0
< sentinel current-epoch 0
---
> sentinel config-epoch mymaster 1
> sentinel leader-epoch mymaster 1
> sentinel current-epoch 1
26c26
< sentinel monitor mymaster 192.168.198.87 6379 2
---
> sentinel monitor mymaster 192.168.198.103 6379 2
28c28
< sentinel known-replica mymaster 192.168.198.103 6379
---
> sentinel known-replica mymaster 192.168.198.87 6379
```
- マスターとレプリカの IP を変更しています。

![redis_3_sentinel_diff.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/cb72e5b7-6c8b-f55a-3c3b-f1dc291137ce.jpeg)


# まとめ
redis-server のマスターサーバーの障害を redis-sentinel が検知し、redis-server のマスター・レプリカの関係を動的に変更することができました。レプリカは常にマスターのコピーを持つように設計されているので、レプリカがマスターに昇格したときに、その時までに同期されたデータは継続して使えることが分かりました。マスターの昇格までには 30秒ほど必要で、その間は Redis サーバーへの書き込みができなくなります。