RedisSentinelとは
Redisをレプリケーション環境で運用した場合、フェイルオーバーは自動化されていない。
そのため、マスターサーバの障害時には手動でコマンドを叩いてスレーブサーバをマスターに昇格させる必要がある。
また、スレーブを複数台で構成している場合は、それぞれ手動で新マスターサーバを向くようにしないといけない。
フェイルオーバを自動で行うには、
- Redis Sentinle
- Redis Cluster
のどちらかで対応可能っぽい。
RedisSentinelは
- マスターサーバ・スレーブサーバの状態を監視して正常な状態か確認できる
- 監視しているインスタンスに異常があった場合、APIを介して通知ができる
- 障害時にスレーブを自動でマスタに昇格、他のスレーブは新マスタを見るように再構成できる
- クライアントからの接続に対して現在のRedisマスターのアドレスを返すことができる
とのこと。
構成
ドキュメントの Example 2: basic setup with three boxes
のRedis3台(Master1台/Replication2台)、Sentinel3台(それぞれのRedidsサーバに同居)の構成で構築する。

なお、下記の構成は DON'T DO THIS
とのこと。
マスタのダウン判定、フェイルオーバーはSentinelの投票数で決まるので、M1/S1が停止した場合、投票数が過半数に満たずフェイルオーバがされないから。

その他、クライアント側にSentinel配置するパターンもある。
設定
前提
- すでにredis3台それぞれインストール済み
Replication設定
- スレーブサーバのコンフィグに
slaveof <masterip> <masterport>
でマスタの情報を書く。
[root@redis2 ~] $ grep slaveof /etc/redis/redis.conf # Master-Slave replication. Use slaveof to make a Redis instance a copy of # slaveof <masterip> <masterport> slaveof 192.168.22.11 6379
- スレーブのredis再起動してレプリケーション状態を確認
[root@redis2 ~]# systemctl restart redis [root@redis2 ~]# redis-cli info replication # Replication role:slave master_host:192.168.22.11 master_port:6379 master_link_status:up master_last_io_seconds_ago:8 master_sync_in_progress:0 slave_repl_offset:9912 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:9778dff7ac400670b6c48c9f03ebdcb6173ee3dd master_replid2:0000000000000000000000000000000000000000 master_repl_offset:9912 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:9913 repl_backlog_histlen:0
Sentinelのコンフィグ
- 3台のサーバに同じ用に配置
# 接続設定。bindで待ち受けるIP指定するか"protectd-mode no"でprotected-modeを無効にするかどちらかの対応が必要 # bind 127.0.0.1 192.168.1.1 protected-mode no # sentinelが待ち受けるポート番号 port 26379 # sentinelのworkディレクトリ dir /tmp # redisマスターを監視する設定。 # redismaster というグループ名で192.168.22.11:6379でクォーラム2のRedisマスタを監視する。 # sentinel monitor <master-group-name> <ip> <port> <quorum> sentinel monitor redismaster 192.168.22.11 6379 2 # ダウンしていると判断するまでの時間(ms) # 30秒ping/pong返ってこなければDownしてるとみなす。 sentinel down-after-milliseconds redismaster 30000 # failover後にマスタと同期するスレーブの数。 # 数を大きくすれば複数のスレーブと新マスタ間で同時にsyncされてフェイルオーバにかかる時間も短縮される。 # 大きくしすぎるとデータロードでブロックされる瞬間があるかも? sentinel parallel-syncs redismaster 1 # failover処理完了(master昇格、全スレーブが新マスタと同期完了)するまでの時間(ms) # 同じマスタに再度フェイルオーバ可能になるまでの時間(ms)はfailover-timeoutの2倍かかる? sentinel failover-timeout redismaster 180000 # Logファイル logfile "/var/log/redis/redis-sentinel.log"
systemd用のファイル
- 3台のサーバに同じ用に配置
[Unit] Description=Redis Sentinel After=network.target [Service] ExecStart=/usr/local/bin/redis-server /etc/redis/redis-sentinel.conf --daemonize no --sentinel ExecStop=/usr/local/bin/redis-shutdown redis-sentinel User=redis Group=redis RuntimeDirectory=redis RuntimeDirectoryMode=0755 LimitNOFILE=65536 [Install] WantedBy=multi-user.target
- 再起動
[root@redis1 redis]# systemctl daemon-reload [root@redis1 redis]# systemctl restart redis-sentinel
ログローテート設定
/var/log/redis/*.log { weekly rotate 10 copytruncate delaycompress compress notifempty missingok }
設定確認
- sentinel経由でマスタの情報取得
[root@redis1 redis]# redis-cli -p 26379 SENTINEL get-master-addr-by-name redismaster 1) "192.168.22.11" 2) "6379"
- マスタのRedisを停止して、master情報変わること確認する
[root@redis1 ~]# systemctl stop redis [root@redis1 ~]# redis-cli -p 26379 SENTINEL get-master-addr-by-name redismaster 1) "192.168.22.12" 2) "6379"