netboxを構築したい。PostgreSQLは構築済みなのでRedisを構築することに。 PostgreSQLの時と同様の要望を満たす構成を調べたところ、クラスタ機能があるようなので試してみる。
Redisのクラスタ機能は、最小で3台のmasterノードから構成され、データは分散されるらしい。 そのため、求めている可用性を実現するには3台のmasterにそれぞれslaveを用意する必要がある。 計6台とやや多いが、構築作業はansibleのplaybookに落とし込むので、リソースさえ足りれば特に問題はない。
無事にクラスタを構築でき、目当てのnetbox構築に移る。が、上手くいかない。 どこで問題が生じているのか調べたところ、どうやらRedisの処理が上手くいっていない模様。 さらに調べると、Redisクラスタはリクエストを受け付けたノードがデータを処理するべきノードを判断して転送するようで、この転送処理にnetbox(が使用しているRedisライブラリかも)が対応していないようだった。 結論として、netboxはRedisクラスタで構築できなそう。
対応していないものはどうしようもないので、Sentinelを使った方法を試すことに。 SetntinelがRedisノードを監視し、障害の検出とfailoverを実現することができる模様。 Sentinelも最小3台から構成する必要があるようだが、役割はRedisの死活監視のみであるため、Redisと同居して問題なさそう。 認証周りが少し厄介だったがなんとか構築でき、netboxも無事起動できた。
ansibleでreplicaの設定までやりたかったが、全てansibleに落とし込む方がかえって煩雑になりそうだったので、master3台をansibleで構築し手動でreplicaを指定する形に落ち着いた。
replicaの指定はredis-cli
を使ってreplicaof masterノード Redisポート
をreplicaにするRedisノードで実行すれば設定できる。
設定後はinfo replication
でreplicationが上手くできているか確認できる。
Redisは構成の変更などを設定ファイルに反映するようなので、初回構築以降は設定ファイルをエディタなどで編集しない方が良さそう。