Redis Sentinel + Cluster による高可用性
症状
目標: Sentinel を使い Redis の自動フェイルオーバー付きマスター-レプリカ構成を構築する。水平スケーリングが必要なら Redis Cluster モードに切り替える。
1. マスターとレプリカを構成する
1 つのマスターと少なくとも 2 つのレプリカを実行する。レプリカは REPLICAOF でマスターに追従する (redis.conf に 'replicaof <host> <port>' と書くこともできる)。永続化のため AOF または RDB を有効にし、requirepass/masterauth による認証を推奨する。
Redis
# at runtime on the replica nodes:
REPLICAOF 10.0.0.10 6379
# to make it persistent, redis.conf:
# replicaof 10.0.0.10 6379
# masterauth secret
INFO replication2. Sentinel を monitor とクォーラムで構成する
各 Sentinel ノードの sentinel.conf で、監視するマスターとクォーラムを定義する。quorum は、マスターを「ダウン」とみなすのに必要な Sentinel の最小数である。本番では 3 台の別々のサーバーに 3 つの Sentinel を置くことが推奨される (スプリットブレイン対策)。
Redis
# sentinel.conf:
sentinel monitor mymaster 10.0.0.10 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 13. Sentinel プロセスを起動する
各ノードで Sentinel を起動する。Sentinel は互いとレプリカを自動的に検出し、実行時に構成をファイルへ書き込む。そのため sentinel.conf は書き込み可能である必要がある。
Redis
redis-sentinel /etc/redis/sentinel.conf
# or:
redis-server /etc/redis/sentinel.conf --sentinel4. Sentinel 経由で状態を照会し、フェイルオーバーをテストする
SENTINEL コマンドで現在のマスターとレプリカを照会する。アプリケーションは Sentinel に 'get-master-addr-by-name' を照会して現在のマスターを知るべきである。計画的フェイルオーバーで自動切り替えを検証する。
Redis
SENTINEL master mymaster
SENTINEL get-master-addr-by-name mymaster
SENTINEL replicas mymaster
# planned switchover:
SENTINEL failover mymaster5. 代替: Redis Cluster でデータを分割する
単一マスターのメモリ/スループットで足りない場合は Redis Cluster を使う: データは 16384 個のハッシュスロットに分割されて複数のマスターに分散され、各マスターが独自のレプリカを持つ。アプリケーションはクラスタ対応クライアントを使う必要がある。redis-cli --cluster create で構築する。
Redis
redis-cli --cluster create \
10.0.0.11:6379 10.0.0.12:6379 10.0.0.13:6379 \
10.0.0.21:6379 10.0.0.22:6379 10.0.0.23:6379 \
--cluster-replicas 16. クラスタの状態を検証する
クラスタ作成後、すべてのスロットが割り当てられ、ノードが接続されていることを確認する。cluster_state は 'ok' で、16384 個すべてのスロットが割り当て済みと表示されるべきである。CLUSTER コマンドでノードとスロットの分布を監視する。
Redis
redis-cli --cluster check 10.0.0.11:6379
redis-cli -c -h 10.0.0.11 CLUSTER INFO
redis-cli -c -h 10.0.0.11 CLUSTER NODES