Я запускаю Redis в контейнерах докеров и использую режим Redis Sentinel. Я установил следующую конфигурацию -
3 redis sentinels nodes
1 redis master node
2 redis slave nodes
Я запускаю все это на своей локальной машине. Таким образом, всего 6 контейнеров докеров проходят через docker-compose
в сетевом режиме моста. Все контейнеры имеют сопоставление портов с внешними.
Все контейнеры могут получать доступ друг к другу, поскольку они находятся в одной и той же сети докеров моста, созданной во время работы docker-compose up
.
Я создал Java-клиент, используя библиотеку Redisson для доступа к redis. Настроил клиент для использования режима redis-sentinel следующим образом:
Config config = new Config();
config.useSentinelServers()
.setMasterName("redis-master")
.addSentinelAddress("redis://127.0.0.1:26379")
.addSentinelAddress("redis://127.0.0.1:26380")
.addSentinelAddress("redis://127.0.0.1:26381")
RedissonClient client = Redisson.create(config);
Здесь я столкнулся с проблемой. Всякий раз, когда я пытаюсь запустить некоторые команды на Redis через этот клиент, запрос проходит через дозорные узлы, которые дают мне текущий адрес главного узла Redis. Но мой Java-клиент не может напрямую связываться с мастером Redis, поскольку IP-адрес, возвращаемый дозорным узлом, является IP-адресом внутренней сети докеров для главного узла, который недоступен за пределами сети докеров, и он терпит неудачу с аналогичным исключением, как показано ниже:
Exception in thread "main" org.redisson.client.RedisConnectionException: Unable to connect to Redis server: 172.21.0.2/172.21.0.2:6379
at org.redisson.connection.pool.ConnectionPool$2$1.operationComplete(ConnectionPool.java:161)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511)
Как решить эту проблему? Нужно ли запускать его в каком-то другом сетевом режиме? или какой-то способ перевести этот внутренний IP-адрес докера в фактический IP-адрес машины, на которой запущены контейнеры Docker?