サーバ構築 ミドルウェア

RedisSentinelの構築

更新日:

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"

-サーバ構築, ミドルウェア
-,

Copyright© 明日から頑張ります。 , 2025 All Rights Reserved Powered by STINGER.