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の変更により、接続先を変更する。
※ネットワーク構成
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接続先の切り替えを可能としている。