Кластер Redis требует, чтобы все узлы могли видеть друг друга для общения; для некоторых тривиальных ситуаций (например, докер со всеми открытыми узлами) доступны некоторые дополнительные параметры конфигурации:
cluster-announce-ip 10.1.1.5
cluster-announce-port 6379
cluster-announce-bus-port 6380
(видеть http://download.redis.io/redis-stable/redis.conf для единственной доступной документации по этим параметрам)
Обратите внимание, что эти значения жестко запрограммированы в файле конфигурации. Это крайне неудобно.
Можно ли как-то настроить Redis для использования имя хоста вместо IP для конечной точки? Есть ли обходной путь для этого?
В качестве наглядного примера того, почему это необходимо, рассмотрим попытку настроить тестовый кластер Redis в образе докера с несколькими экземплярами Redis в одном контейнере через Dockerfile:
Если cluster-announce-ip
установлен, все узлы пытаются болтать через cluster-announce-ip
.
Если cluster-announce-ip
это внешний IP-адрес, так как образ докера не запускается с -p
в течение docker build...
, внешний IP-адрес недоступен, и кластер не может быть настроен.
Если cluster-announce-ip
не установлен, кластер можно настроить, но поскольку IP-адрес является внутренним для докера, его нельзя увидеть извне, когда кластер запущен (внешние клиенты будут жаловаться, когда они получат MOVED 10.0.0.x:2321
который не виден внешнему клиенту).
Вы должны использовать docker build ...
а затем вручную подготовить узлы с помощью docker commit ...
чтобы сделать снимок результата. \
Когда вы запускаете контейнер на другом физическом хосте, вам необходимо обновить образ вручную, чтобы изменить IP-адрес объявления (при использовании DHCP это становится еще более проблематичным).
Я ценю, что docker swarm - одно из возможных решений этой проблемы в целом, но для целей тестирования (например, локальная разработка) это решение не актуально.
Простое использование имен хостов вместо ips позволит разработчикам просто использовать записи файла хоста для подключения вместо того, чтобы вручную обновлять образ докера для каждого разработчика (очевидно, каждая машина разработки имеет свой собственный внешний IP-адрес).
Нет, он еще не поддерживается, но есть нерешенная проблема: https://github.com/antirez/redis/issues/2186