Как подключиться к кластерному кэшу Azure Redis в redis-rb? - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь использовать клиент Ruby Redis redis-rb для подключения к кэшу Redis Azure, настроенному для кластеризации.

Что я пробовал:

Я использовал этот связанный вопрос для успешного подключения к некластеризованному Redis Cache. Я также могу использовать это для подключения к кластерному кэшу Redis Azure, который правильно сообщает MOVED, когда я пытаюсь получить или установить ключи:

Redis::CommandError (MOVED 1234 address_here:port_here)

Я видел эту документацию длясоздание соединения с cluster:

Узлы могут быть переданы клиенту в виде массива URL-адресов соединения.

nodes = (7000..7005).map { |port| "redis://127.0.0.1:#{port}" }
redis = Redis.new(cluster: nodes)

Вы также можете указать параметры в виде хэша. Параметры те же, что и для соединения с одним сервером.

(7000..7005).map { |port| { host: '127.0.0.1', port: port } }

Я использовал эти примеры для построения примера для единственной доступной конечной точки DNS, которая завершается с ошибкой:

irb(main):024:0> client = Redis.new(cluster: ["redis://my-redis-cluster.redis.cache.windows.net:6379"])
...
Redis::CannotConnectError (Redis client could not connect to any cluster nodes)

Я пробовал каждый вариант этого, перечисленный в документации, с одинаковыми результатами.

Проблема:

Кэш Azure для Redis предоставляет кластеризованные узлы на одной конечной точке DNSв то время как этот параметр кластера redis-rb, по-видимому, ожидает набор известных конечных точек узла.

Можно ли использовать эту библиотеку для подключения к кластерному кэш-памяти Redis Azure? И если да, то на что будет похож воспроизводимый пример? Если это невозможно с redis-rb, но возможно с другим клиентом Ruby Redis, мне также будет интересно это решение.

1 Ответ

1 голос
/ 03 ноября 2019

Согласно официальному документу Azure How to configure Redis clustering for a Premium Azure Cache for Redis, есть два часто задаваемых вопроса, которые ответили на ваши вопросы.

1. Все ли клиенты Redis поддерживают кластеризацию?

Не все клиенты поддерживают кластеризацию Redis! Пожалуйста, проверьте документацию для библиотеки, которую вы используете, чтобы убедиться, что вы используете библиотеку и версию, которая поддерживает кластеризацию. StackExchange.Redis - это одна библиотека, которая поддерживает кластеризацию в своих новых версиях. Для получения дополнительной информации о других клиентах см. Раздел Игра с кластером учебного руководства по кластеру Redis .

Протокол кластеризации Redis требует, чтобы каждый клиент подключался к каждому шарду. непосредственно в режиме кластеризации, а также определяет новые сообщения об ошибках, такие как «MOVED» на «CROSSSLOTS». Попытка использовать клиент, который не поддерживает кластеризацию с кэшем режима кластера, может привести к большому количеству исключений перенаправления MOVED или просто сломать ваше приложение, если вы выполняете многоключевые многоключевые запросы.

Примечание

Если вы используете StackExchange.Redis в качестве клиента, убедитесь, что вы используете последнюю версию StackExchange.Redis 1.0.481или позже, чтобы кластеризация работала правильно. Если у вас есть какие-либо проблемы с исключениями перемещений, см. Дополнительные исключения перемещений.

2. Как подключиться к кешу, когда включена кластеризация?

Вы можете подключиться к кешу, используя те же конечные точки, порты и ключи, которые вы используете при подключениив кеш, у которого не включена кластеризация. Redis управляет кластеризацией на сервере, поэтому вам не нужно управлять им с вашего клиента.

Поэтому, пожалуйста, попробуйте следовать приведенному ниже рисунку, чтобы использовать redis-rb-cluster вместоredis-rb для подключения Azure Redis Cache для кластеризации, включенной так же, как некластеризация.

enter image description here

...