自分用のメモ代わりに。
事象
テスト環境で下記のように、
- 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が無いように気をつけること。