redis-sentinelで、ssh portforwarding越しにredisのレプリケーションを行う場合の注意点


自分用のメモ代わりに。

事象

テスト環境で下記のように、

  • srv1
    • redis master (port 6400)
    • redis sentinel
  • srv2
    • redis slave (from srv1 master) (port 6400)

という構成を作った。

srv1 と srv2は別のNWにあり、レプリケーションのために

ssh portforwardingを行った。

+---------------+     +-------------+  ssh port forwarding   +------------+
| srv1:sentinel | --> | srv1:master | ---------------------> | srv2:slave |
+---------------+     +-------------+                        +------------+

この場合に、srv2:slaveをsrv1:masterに繋ぐまでは、想定通りsrv1:masterのredisは

masterのママとなる。

が、srv2:redisを

slaveof localhost [forwarding port]

と、srv2 -> srv1のsshトンネルを経由して接続させると、srv1:masterのredisが

sentinelよりslaveに降格させられる事象が発生した。

原因

srv1:sentinelが、srv1:masterに接続してきたsrv2:slaveのredisを、
srv1のローカルIPアドレス+srv2:slaveのlisten portとして認識した為。

つまり、sentinelはsrv1:masterに接続したsrv2:slaveをslave化しようとして、

srv1:masterのredisに対して slaveof していた。

対策

srv2:redisのportを変更した。

このときにsrv1:sentinelは

  • srv1 IPアドレス + srv2:slave port

として認識することには変わらないので、srv1に

srv2:slaveのredisと同じポートで動いているredisが無いように気をつけること。