ConsulのDNSを使ってRedisの冗長化

 

こんにちはエンジニアのYです。

今回はConsulのDNSを使ってRedisの冗長化を検討しましたというお話です。

 

  • IPエイリアスが使えない(使いたくない)
  • マネージドサービスが使えない(使いたくない)
  • WindowsとLinuxの両方からRedisへの接続がある

このような境遇の方は役に立つかもしれません。

Consulとは?

HashiCorp社のプロダクトの一つで管理対象のServerに仕込んで使います。下記の様な機能があります。

 

  • Service Discovery
  • Failure Detection
  • Key/Value Storage
  • etc

例えばこんなことに使えます。

 

  • Service Discovery
    起動しているServer(WEB,DB,Redis…)の一覧を出したいときなど
  • Failure Detection
    NAT用のインスタンスを冗長化・負荷分散したい、障害が発生したらクラスタから切り離したいときなど
  • Key/Value Storage
    オートスケールのためにリリースされてるアプリケーションのVersionを保持したいときなど

Redis冗長化のための設定

  • App ServerのリゾルバをConsulに向ける
  • Masterを検知する仕組み(監視)を用意
  • Redis ServerのConsulにMasterの監視設定を入れたServiceを登録

構成図

c_kousei

障害発生時の動き

  1. Redis Serverが落ちる
  2. Sentinelが検知してSlaveをMasterに昇格
  3. ConsulがSlaveがMasterに昇格したことを検知してDNSが書き変わる

問題点

検証してみたところ2つの問題がありました。

①名前解決が遅い問題と回避案

Consul自身は各nodeにキャッシュを持たないため名前解決ごとにServerへリクエストが飛んでしまいレスポンスが遅い。Redisへの接続の際に名前解決がされることを考えると何かしらのキャッシュが欲しい。Consulでは名前解決の結果にTTLを設定することが出来るのでDNSキャッシュを挟むようにする。

Windows

デフォルトでキャッシュされる模様。

Linux

デフォルトではキャッシュされないのでdnsmasqを使う。

②SOAレコードのTTL問題と回避案

Consulのソースを見るとSOAレコードのTTLが0でべた書きされているので変更できない。そのためタイミングによってはネガティブキャッシュが効かずにServerへの負荷が増える。※1,2

Windwos

SOAのTTLを無視して900s(Windowsのデフォルト)でキャッシュされるのでServerへの負荷は増えないが、期待している動きではないのでレジストリの書き換えで対応する。※3

Linux

dnsmasqはSOAレコードのTTL通りキャッシュしなかった。dnsperfを使って100台のクライアントから1000req/secのリクエストを飛ばして試したところレコードが引けない状態ではServer負荷は上昇するが、Slaveの昇格を検知してレコードが引けるようにるとレコードのTTLが効いてキャッシュされるため元に戻る。このときクラスタが分離してしまうなどの影響はありませんでした。

 

利用を検討しているシステムではRedisを利用する箇所で部分メンテされることはないので、仮に負荷が上昇しても問題ない。念のためSOAレコードのべた書き部分を書き換えて動作確認したところ、想定通りネガティブキャッシュされる動きになるのを確認できました。

最後に

記事の流れが強引なところもある中、最後まで読んでいただきありがとうございました。今後はConsul Templateが要件に合うか検証していきたいです。

参考

※1 https://github.com/hashicorp/consul/blob/a440433ac832516bb026872f698669122a4789b6/command/agent/dns.go#L271-L285

※2 http://d.hatena.ne.jp/hirose31/20130702/1372

※3 https://support.microsoft.com/ja-jp/kb/245437

 
株式会社Sumzap 採用情報

 

 

  • このエントリーをはてなブックマークに追加