2013年07月17日

Redis Sentinel で冗長構成を組む際の注意点

はてなブックマークに登録

KVS界隈ではすっかりおなじみ(?)のRedisですが、当社でも徐々にそのニーズが高まってきました。
標準機能として、レプリケーション、Pub/Sub、ソート等の便利機能が満載のRedisですが、サービスに投入する際に冗長構成をどう組むかといった点が気になっている方もいるのではないでしょうか。
まだまだ検証中ではあるのですが、Redisに実装されているRedisSentinelを用いて冗長構成を組んだ際にハマった所をご紹介したいと思います。

RedisSentinelとは


Redisに標準実装されている機能の一つで、Redisのステータス監視、通知、自動フェイルオーバーが行なえます。
詳細な仕様、設定に関しては以下のドキュメントをご確認下さい。
http://redis.io/topics/sentinel

RedisSentinel導入前の構成

導入前
特に何の変哲も無い構成です。
Redisサーバ間ではRealIPを用いてレプリケーションを行ない、WEBサーバ上のアプリケーションからRedisを利用する際はMASTERに設定されているVIP宛にリクエストを出します。

RedisSentinel導入後の構成

導入後
RedisSentinelサーバを3台用意し、監視先の設定をVIPにしてみました。

各RedisSentinelの設定は共通で以下の様になっています。

1. sentinel monitor prod 192.168.8.1 6379 2
2. sentinel down-after-milliseconds prod 3000
3. sentinel failover-timeout prod 6000
4. sentinel can-failover prod yes
5. sentinel parallel-syncs prod 1
6. sentinel client-reconfig-script prod /opt/klab/sbin/redis_chroute.sh

監視先をVIPにすることで、障害発生時にRedisSentinelが再起動しても監視を続行出来るようにしてみました。
この検証時点ではRedis2.6.12を使用しており、一見想定通りに動作していた....ように見えたのですが、この設定のままでRedis2.6.13以降のバージョンへ置き換えた際に、問題が発生しました。
また、ドキュメントをよく読んだ方は既にお気づきかもしれませんが、バージョン関係なく障害発生時にSDOWNを検出できなくなる場合があります。

DEMOTE flag


まず、Redisのバージョンを2.6.13以降にした場合の問題から説明します。
Redis2.6.13以降、「DEMOTE flag」が追加されました。 疎通が取れずにODOWNとして扱われたMASTERに対して紐づくフラグです。 このフラグが立ったインスタンスに対し再び疎通が取れる様になった際、今現在のMASTER(旧SLAVE)となったRedisのSLAVEとして動作するように再設定が行なわれます。
さくっと冗長構成を組み直す事ができるので少し運用が楽になりそうな機能です。

しかし、VIPをRedisSentinelの監視先にした場合、上記機能の影響で問題が発生してしまいます。
各RedisSentinelはMASTERとSLAVEに関する情報を持っているのですが、障害発生前と障害発生後の状態を図にしてみました。

・障害発生前
障害前
ipportstatus
192.168.8.16379MASTER
10.13.0.26379SLAVE

・障害発生後
障害後
ipportstatus
192.168.8.16379DOWN
10.13.0.26379MASTER

フェイルオーバーが実施されると、SLAVEがMASTERへと昇格すると共にVIPも引き継がれます。
その際、RedisSentinelからはあたかも旧MASTERが復帰したように見えるため、今現在のMASTER(自分自身)へレプリケーションを行なうよう再設定を行なう結果となりました。
その結果、MASTER不在となりサービスに支障が出てしまいます。

SDOWNを検出できなくなる


これはドキュメントをよく読んで頂くとわかるのですが、RedisSentinelは障害(SDOWN)を検知すると、自分以外のRedisSentinelに対して「 is-master-down-by-addr 」コマンドを用いてMASTERの状況を問い合わせます。
この時、引数として障害が発生したと思われるMASTERのIPとポート番号が is-master-down-by-addr コマンドに与えられるのですが、この情報が各Sentinelの持つノード情報と一致する必要があります。
以下の図にあるように、フェイルオーバー後に特定のRedisSentinelを立ち上げ直した場合、同じMASTERに接続していても、IPとポート番号に差異が出てしまうためMASTERのステータスを正しく返すことができません。
ステータス


このような問題が起きた事から今現在はRedisSentinelの監視先をRealIPへと変更して検証を続けています。

【今回のまとめ】

* Redis Sentinelを利用して冗長構成を組む事が出来る。
* Redis2.6.13以降のバージョンを利用すると、運用が少し楽になるはず。
* RedisSentinelの監視対象は、VIPではなくReal IPを利用。

検証初期ではありますが、RedisSentinel非常に使いやすく便利だなという印象です。
また嵌った点が出た際にはこちらでご紹介させて頂きます。
klab_gijutsu2 at 16:02│Comments(0)TrackBack(0)冗長構成 | redis

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント