Redisクラスターでは、すべてのノードがお互いを認識してチャットできる必要があります。いくつかの些細な状況(たとえば、すべてのノードが公開されているdocker)に対応するために、いくつかの追加の構成オプションを使用できます。
cluster-announce-ip 10.1.1.5
cluster-announce-port 6379
cluster-announce-bus-port 6380
(これらのオプションについて利用できる唯一のドキュメントについては、 http://download.redis.io/redis-stable/redis.conf を参照してください)
これらの値は設定ファイルにハードコードされていることに注意してください。これは非常に不便です。
エンドポイントにIPの代わりにhostnameを使用するように何らかの方法でredisを構成することは可能ですか?これの回避策はありますか?
これが必要な理由の具体的な例として、Dockerfileを介して単一のコンテナーに複数のredisインスタンスを持つdockerイメージでテストredisクラスターを構成することを検討してください。
cluster-announce-ip
が設定されている場合、すべてのノードはcluster-announce-ip
を介してチャットを試みます。
cluster-announce-ip
が外部IPの場合、Dockerイメージは-p
でdocker build...
中に実行されないため、外部IPを使用できず、クラスターを構成できません。
cluster-announce-ip
が設定されていない場合は、クラスターを構成できますが、IPはdocker-internalであるため、クラスターが実行されると外部から見ることはできません(外部クライアントは、MOVED 10.0.0.x:2321
を取得するとエラーを報告します。外部クライアントには表示されません)。
結果をスナップショットするには、docker build ...
を使用してから、docker commit ...
を使用してノードを手動でプロビジョニングする必要があります。\
別の物理ホストでコンテナを実行する場合、イメージを手動で更新してアナウンスIPを変更する必要があります(DHCPを使用すると、これがさらに問題になります)。
Docker swarmがこの問題の一般的な解決策の1つであると思いますが、テスト目的(ローカル開発など)の場合は、関連する解決策ではありません。
Ipsの代わりにホスト名を使用するだけで、開発者はすべての開発者のDockerイメージを手動で更新する代わりに、Hostファイルエントリを使用して接続できます(明らかに、各開発マシンには独自の外部IPがあります)。
いいえ、まだサポートされていません。ただし、件名には未解決の問題があります: https://github.com/antirez/redis/issues/2186