Redis - Sentinelによる高可用化
今回はRedisに高可用性を提供するRedis Sentinelについての設定方法と動作の確認を行いたいと思います。
レプリケーション機能の構築についてはこちらの記事をご確認ください。
Redis Sentinelについて
Redis SentinelはRedisの高可用性を提供するため、監視や通知などといった以下の機能を備えています。
- レプリケーションにおけるマスターやレプリカの動作状況の監視
- 障害発生時などの通知
- マスターの障害発生時にレプリカをマスターへと自動で昇格させるフェイルオーバー
- クライアントに対して現在のマスターのIPアドレスなどの情報提供
また、Redis Sentinelは分散システムであり、複数のSentinelインスタンスによってRedisインスタンスの監視を行うことで誤検知を防ぎ、単一障害点をなくしています。
設定
AlmaLinuxのリポジトリからRedis Sentinelをインストールした場合、以下の設定の変更が必要です。
尚、デフォルトの設定ファイルは「/etc/redis/sentinel.conf」です。
- sentinel monitor <マスター名> <IPアドレス> <ポート番号> <クォーラム>
Sentinelが監視するマスターのRedisインスタンスを指定します。尚、レプリカは自動的に検出されるため指定する必要がありません。
クォーラムとはマスターが障害状態にある場合などに、マスターと通信が取れない状況であるという事実に同意する必要があるSentinelインスタンスの数であり、設定値以上の同意を得られなければフェイルオーバーは開始されません。
ただし、クォーラムは障害の検出のみに使用され、フェイルオーバーを実行するにはSentinelインスタンスの1つが既知のSentinelインスタンスの過半数の投票によって選出され、フェイルオーバーを実行する権限が与えられる必要があります。
尚、マスター名はデフォルトでは「mymaster」となっています。
構築
設定項目で記載したように、Sentinelのフェイルオーバーは複数のインスタンスで動作する仕組みとなっており、少なくとも3つのSentinelインスタンスが必要となっています。
前回作成したRedis環境では2つのサーバしかないため、本来であればもう1台サーバを用意し独立した3つの環境にSentinelインスタンスを用意する必要がありますが、今回の目的はあくまでも検証ということで1つのサーバ上でそれぞれのポートを分ける形で構築したいと思います。
尚、Redis SentinelはRedisのパッケージに含まれますので追加のインストールは不要です。
環境
- IPアドレス:10.15.0.1
インスタンス | ポート番号 |
---|---|
Redis ① | 6379 |
Redis Sentinel ① | 26379 (Redis Sentinelデフォルト値) |
Redis Sentinel ② | 36379 |
Redis Sentinel ③ | 46379 |
- IPアドレス:10.15.0.2
インスタンス | ポート番号 |
---|---|
Redis ② | 6379 |
それでは実際に設定を行っていきます。
ポートについては上記環境情報の通りで、それぞれに合わせた形でPIDファイルやログファイルの名前も変更します。
# cd /etc/redis
# cp -p sentinel.conf sentinel_26379.conf
# cp -p sentinel.conf sentinel_36379.conf
# cp -p sentinel.conf sentinel_46379.conf
# vi sentinel_26379.conf
# vi sentinel_36379.conf
# vi sentinel_46379.conf
# diff -u sentinel.conf sentinel_26379.conf | grep -e ^+ -e ^-
--- sentinel.conf 2024-10-24 21:04:05.096730165 +0900
+++ sentinel_26379.conf 2024-10-24 20:47:17.690688858 +0900
-pidfile /var/run/redis-sentinel.pid
+pidfile /var/run/redis-sentinel_26379.pid
-logfile /var/log/redis/sentinel.log
+logfile /var/log/redis/sentinel_26379.log
-sentinel monitor mymaster 127.0.0.1 6379 2
+sentinel monitor mymaster 10.15.0.1 6379 2
# diff -u sentinel_26379.conf sentinel_36379.conf | grep -e ^+ -e ^-
--- sentinel_26379.conf 2024-10-24 20:47:17.690688858 +0900
+++ sentinel_36379.conf 2024-10-24 20:47:17.831688864 +0900
-port 26379
+port 36379
-pidfile "/var/run/redis-sentinel_26379.pid"
+pidfile "/var/run/redis-sentinel_36379.pid"
-logfile "/var/log/redis/sentinel_26379.log"
+logfile "/var/log/redis/sentinel_36379.log"
# diff -u sentinel_26379.conf sentinel_46379.conf | grep -e ^+ -e ^-
--- sentinel_26379.conf 2024-10-24 20:47:17.690688858 +0900
+++ sentinel_46379.conf 2024-10-24 20:37:57.693665896 +0900
-port 26379
+port 46379
-pidfile "/var/run/redis-sentinel_26379.pid"
+pidfile "/var/run/redis-sentinel_46379.pid"
-logfile "/var/log/redis/sentinel_26379.log"
+logfile "/var/log/redis/sentinel_46379.log"
これで、Redis Sentinelの設定は完了です。
では次にSentinelプロセスを起動していきます。
尚、systemdにて管理している場合は「systemctl start redis-sentinel」コマンドで「/etc/redis/sentinel.conf」を読み取りサービスが起動しますが、今回はそれぞれ設定ファイルを分けているのでコマンドでプロセスを起動しています。
# redis-sentinel /etc/redis/sentinel_26379.conf &
# redis-sentinel /etc/redis/sentinel_36379.conf &
# redis-sentinel /etc/redis/sentinel_46379.conf &
# ps -aux | grep redis-sentinel
root 10811 0.5 0.4 58408 16640 pts/2 Sl 17:08 0:00 redis-sentinel *:26379 [sentinel]
root 10816 0.6 0.4 58408 16632 pts/2 Sl 17:08 0:00 redis-sentinel *:36379 [sentinel]
root 10821 1.0 0.4 58408 16616 pts/2 Sl 17:08 0:00 redis-sentinel *:46379 [sentinel]
無事起動できたので、Sentinelインスタンスの状態を確認していきます。
- SENTINEL SENTINELS <マスター名>:指定したマスターのSentinelインスタンスのステータスを表示します。
※接続しているSentinelインスタンスの情報は表示されません。
# redis-cli -p 26379
> SENTINEL SENTINELS mymaster
1) 1) "name"
2) "85f28ae67412322d4c9f1de37f1af977342aba70"
3) "ip"
4) "10.15.0.1"
5) "port"
6) "46379"
7) "runid"
8) "85f28ae67412322d4c9f1de37f1af977342aba70"
9) "flags"
10) "sentinel"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "684"
19) "last-ping-reply"
20) "684"
21) "down-after-milliseconds"
22) "30000"
23) "last-hello-message"
24) "71"
25) "voted-leader"
26) "?"
27) "voted-leader-epoch"
28) "0"
2) 1) "name"
2) "8c6d334d67771e9bd8262ea5fbfbd0a5c90b93b6"
3) "ip"
4) "10.15.0.1"
5) "port"
6) "36379"
7) "runid"
8) "8c6d334d67771e9bd8262ea5fbfbd0a5c90b93b6"
9) "flags"
10) "sentinel"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "684"
19) "last-ping-reply"
20) "684"
21) "down-after-milliseconds"
22) "30000"
23) "last-hello-message"
24) "1162"
25) "voted-leader"
26) "?"
27) "voted-leader-epoch"
28) "0"
Sentinelインスタンスはお互いを自動で認識するため、特に設定しませんでしたが上記のように別のポートで起動したSentinelインスタンスについてきちんと認識しています。
- SENTINEL MYID:接続しているSentinelインスタンスのIDを表示します。
> QUIT
# redis-cli -p 36379
> SENTINEL MYID
"8c6d334d67771e9bd8262ea5fbfbd0a5c90b93b6"
> QUIT
# redis-cli -p 46379
> SENTINEL MYID
"85f28ae67412322d4c9f1de37f1af977342aba70"
試しに別のポートで起動しているSentinelインスタンスに接続してIDを確認すると、先ほど認識していたものとポート番号やrunidが一致することがわかります。
では実際にRedisのマスタープロセスを強制終了し、フェイルオーバーの動作を確認します。
- 「SENTINEL GET-MASTER-ADDR-BY-NAME <マスター名>」:指定したマスターのIPアドレスとポート番号を表示します。
> SENTINEL GET-MASTER-ADDR-BY-NAME mymaster
1) "10.15.0.1"
2) "6379"
> QUIT
# ps -aux | grep redis-server
root 3096 0.2 0.4 136740 14992 ? Sl 10月17 38:09 redis-server 127.0.0.1:6379
root 10836 0.0 0.0 4592 2272 pts/2 S+ 17:22 0:00 grep --color=auto redis-server
# kill 3096
# ps -aux | grep redis-server
root 10838 0.0 0.0 4592 2272 pts/2 S+ 17:23 0:00 grep --color=auto redis-server
# redis-cli -p 36379
> SENTINEL GET-MASTER-ADDR-BY-NAME mymaster
1) "10.15.0.2"
2) "6379"
無事フェイルオーバーが実行され、マスターが自動で切り替わることが確認できました。
まとめ
以上でRedis Sentinelの設定やどういう動作をするのかなどの大枠はつかめたのではないかと思います。
設定で必要な情報はほとんど自動で検出し補完してくれるため簡単に構築することが可能でしたが、フェイルオーバーの動作仕様など少しわかりづらい部分については以下公式コミュニティのドキュメントに記載がありますので、ログなどを参照しつつ読んでいただくことでより理解が深まるのではないかと思います。
技術情報
関連サービス
お気軽にお問い合わせください。応対時間 9:30-17:30 [ 土・日・祝日除く ]
お問い合わせ