Использование 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-адреса не назначены статически.
Обновить:
Поскольку вы сказали, что у вас все еще есть проблемы, я бы сделал следующие рекомендации:
Удалить
auto_eject_hosts: true
, Если вы получили какое-то соединение, то со временем у вас не будет связи, потому что что-то заставило twemproxy подумать, что что-то не так с хостами Redis, и отклонить их.Таким образом, в конце концов, когда ваш клиент ServiceStack подключится к twemproxy, не будет хостов для передачи запроса, и вы получите ошибку
No connection could be made because the target machine actively refused it
,Достаточно ли у вас оперативной памяти для стресс-тестирования вашей локальной машины? Вы запускаете как минимум 4 экземпляра Redis, которым требуется реальная память для хранения значений, twemproxy использует большой объем памяти для буферизации запросов, которые он передает Redis, этот пул памяти никогда не освобождается, см. Дополнительную информацию здесь. Ваше приложение ServiceStack будет потреблять память - особенно в режиме отладки. Вероятно, у вас будет открыт Visual Studio или другая IDE, приложение для стресс-теста и ваша операционная система. Вдобавок ко всему, вероятно, будут фоновые процессы и другие приложения, которые вы еще не закрыли.
Хорошей практикой является попытка запустить тесты на изолированном оборудовании, насколько это возможно. Если это невозможно, необходимо проверить систему, чтобы убедиться, что на эталонный тест не влияют некоторые внешние действия.
Вы должны прочитать статью Redis здесь о бенчмаркинге.
Как вы используете это в
localhost
Ситуация использоватьBasicRedisClientManager
неPooledRedisClientManager
,