Использование ServiceStack Redis с Twemproxy

Я успешно использую ServiceStack PooledRedisClientManager. Сейчас я добавляю Twemproxy в смесь и имею 4 экземпляра Redis с Twemproxy, работающим на одном сервере Ubuntu.

Это вызвало проблемы с тестами легкой нагрузки (100 пользователей), подключающимися к Redis через ServiceStack. Я пробовал оригинальные PooledRedisClientManager и BasicRedisClientManager, оба выдают ошибку. Невозможно установить соединение, потому что целевая машина активно отказалась от него

Что мне нужно сделать, чтобы эти двое хорошо играли вместе? Это конфиг Twemproxy

alpha:
  listen: 0.0.0.0:12112
  hash: fnv1a_64
  distribution: ketama
  auto_eject_hosts: true
  redis: true
  timeout: 400
  server_retry_timeout: 30000
  server_failure_limit: 3
  server_connections: 1000
  servers:
   - 0.0.0.0:6379:1
   - 0.0.0.0:6380:1
   - 0.0.0.0:6381:1
   - 0.0.0.0:6382:1

Я могу подключиться к каждому из экземпляров сервера Redis по отдельности, он просто не проходит через Twemproxy.

1 ответ

Решение

Я не использовал twemproxy раньше, но я бы сказал, что ваш список серверов неверен. Я не думаю, что вы используете 0.0.0.0 правильно.

Ваши серверы должны быть (для локального тестирования):

servers:
 - 127.0.0.1:6379:1
 - 127.0.0.1:6380:1
 - 127.0.0.1:6381:1
 - 127.0.0.1:6382:1

Ты используешь 0.0.0.0 на listen Команда сказать twemproxy прослушивать все доступные сетевые интерфейсы на сервере. Это означает, что twemproxy будет пытаться слушать:

  • адрес обратной связи 127.0.0.1 (localhost),
  • на ваш частный IP (т.е. 192.168.0.1) и
  • на ваш публичный IP (т.е. 134.xxx.50.34)

Когда вы указываете серверы, конфигурация сервера должна знать фактический адрес, к которому она должна подключиться. 0.0.0.0 не имеет смысла. Это нуждается в реальной стоимости. Поэтому, когда вы захотите использовать разные машины Redis, которые вы захотите использовать, частные IP-адреса каждой машины будут такими:

servers:
 - 192.168.0.10:6379:1
 - 192.168.0.13:6379:1
 - 192.168.0.14:6379:1
 - 192.168.0.27:6379:1

Очевидно, ваши IP-адреса будут другими. Ты можешь использовать ifconfig определить IP на каждой машине. Хотя, возможно, стоит использовать имя хоста, если ваши IP-адреса не назначены статически.


Обновить:

Поскольку вы сказали, что у вас все еще есть проблемы, я бы сделал следующие рекомендации:

  1. Удалить auto_eject_hosts: true, Если вы получили какое-то соединение, то со временем у вас не будет связи, потому что что-то заставило twemproxy подумать, что что-то не так с хостами Redis, и отклонить их.

    Таким образом, в конце концов, когда ваш клиент ServiceStack подключится к twemproxy, не будет хостов для передачи запроса, и вы получите ошибку No connection could be made because the target machine actively refused it,

  2. Достаточно ли у вас оперативной памяти для стресс-тестирования вашей локальной машины? Вы запускаете как минимум 4 экземпляра Redis, которым требуется реальная память для хранения значений, twemproxy использует большой объем памяти для буферизации запросов, которые он передает Redis, этот пул памяти никогда не освобождается, см. Дополнительную информацию здесь. Ваше приложение ServiceStack будет потреблять память - особенно в режиме отладки. Вероятно, у вас будет открыт Visual Studio или другая IDE, приложение для стресс-теста и ваша операционная система. Вдобавок ко всему, вероятно, будут фоновые процессы и другие приложения, которые вы еще не закрыли.

    Хорошей практикой является попытка запустить тесты на изолированном оборудовании, насколько это возможно. Если это невозможно, необходимо проверить систему, чтобы убедиться, что на эталонный тест не влияют некоторые внешние действия.

    Вы должны прочитать статью Redis здесь о бенчмаркинге.

  3. Как вы используете это в localhost Ситуация использовать BasicRedisClientManager не PooledRedisClientManager,

Другие вопросы по тегам