AWS環境でのRedis構築

今回RedisをActive/Stanbyで構築したため、備忘録としてブログに残したいと思います。

今回検証した環境は以下。

・Redis 3.0.2

参考資料: Redis Sentinel Documentation – Redis

 システム構成としては、Active/Stanbyそれぞれ1台構成。

Redisの設定

RedisをActive/Stanby構成をするには、Slave側に一行以下設定をする。

slaveof masterのIp port

Redis Sentinelの動作

 Redis sentinelは、Redisサーバの監視機能、Failoverの機能を提供する管理サーバみたいなもの。実際に、公式ドキュメントでもRedisでの冗長構成の際は、このSentinelを使うのを推奨している。

複数のSentinelがRedisのマスターを監視しており、設定された閾値(Quorum)以上のSentinelがRedisマスターDownと判断した際に、RedisマスターはStatusがOdown(停止)となる。

フェイルオーバーの動作としては、以下のようになる。

・マスターにて障害が発生

・SentinelがマスターのDownを検知(Sdown) 

複数Sentinel間でイベントを通知し、閾値以上のSentinelがSdownと判断した場合、RedisマスターのStatusをOdownに遷移する。

・過半数以上(Sentinelが5台の場合、3台以上)のSentinelがDownと判断した場合はFailoverが実行される。

 

Sentinelの設定ファイルの以下設定がマスターDownの検知の設定となる。(以下例では、2台以上Sentinelがダウンの同意をすれば、マスターはOdownとなる)

sentinel monitor mymaster redis1 6379 2

検証するまでは、上の設定で2を設定すると2台以上が同意すれば、フェイルオーバーまでするものと思い込んでたが、実際はダウン判定とフェイルオーバーの設定は上記動作の流れで記載した通り、別ものだった。

Redisのフェイルオーバーの設計

 RedisMasterに障害が発生した際、上記のSentinelによりFailoverの条件を満たしていれば、Redis自体のFailoverが実行され、SlaveがMasterに遷移する。

しかし、Redisを使用するアプリケーションから見たときには、接続先は障害が発生している旧Masterとなるため、アプリケーション側でRedisの接続先を変更する必要がある。

アプリケーション側のRedis接続先を変える方法はいくつかあるが、今回はVipとAwsのVirtualRouterの変更により、接続先を変更する。

 

 ※ネットワーク構成

f:id:hangyoun:20151010181646p:plain

RedisにそれぞれVipである192.168.10.10のIPアドレスを持たせて、アプリケーション側はRedisの接続先IPをVipである192.168.10.10にする。

Virtual Routerにて、192.168.10.10への通信はRedis MasterのInstanceへルーティングする設定をする。(※Natサーバと同じで、Source/Destのcheckを無効にしておく必要がある)

 

※Routerの定義(Sample)

送信先ターゲット
192.168.10.10(※Redis のVip) RedisMasterのInstanceId

 

そしてMasterに障害が発生した際は、Sentinelの機能により、Failover後にスクリプトを実行できるため、スクリプトの中でVirtual Routerの192.168.10.10の通信を新MasterにするようにAPIを使用して変更する。(aws ec2 replace-route)

また、スクリプトは全Sentinelが動作しているサーバで実行されるため、何度実行されても同じ結果になるようにする必要がある。

そうすることで、アプリケーション側のRedis接続先の切り替えを可能としている。