Может кто-нибудь объяснить, как именно Booksleeve и Redis работают вместе и это приложение в приложении SignalR?
Мы реализуем масштабирование для нашего приложения SignalR и стараемся избежать единой точки отказа в нашем кластере. Таким образом, требуется более одного сервера шины сообщений Redis.
Проблема с реализацией Redis Sentinel заключается в том, что после отработки отказа клиенту необходимо подключиться к новой конечной точке [адрес], что потребует перезапуска приложения SignalR (конечная точка Redis определена в Application_Start()).
Не вариант.
Я пытаюсь понять, поможет ли Книжная рука, и хотел бы, чтобы некоторые объяснили это.
Проблема в том, что у нас может быть только одна конечная точка, определенная для шины сообщений. Аппаратное решение в настоящее время не вариант.
Будет ли приложение SignalR подключаться к оболочке Booksleeve, которая поддерживает список ведущих / подчиненных?
Еще один вариант использования служебной шины Azure. Тем не менее, инструкции по подключению провайдера служебной шины Windows Azure указывают, что с этим все еще остаются проблемы:
Обратите внимание, что этот веб-сайт является сайтом ASP.NET, работающим в веб-роли Azure. Начиная с версии 1.0alpha2 в AzureWebSites есть некоторые ошибки, из-за которых сценарии ServiceBus Scale out не работают должным образом. Мы работаем над решением этой проблемы на будущее
2 ответа
Я не знаю специфики того, как SignalR подключается, но: BookSleeve уже предлагает некоторые уступки отказоустойчивым узлам. В частности, ConnectionUtils.Connect
Метод принимает строку (идеально подходит для значений конфигурации web.config и т. д.), которая может включать в себя несколько узлов redis, и BookSleeve будет пытаться найти наиболее подходящий узел для подключения. Если узлы, упомянутые в строке, являются обычными узлами Redis, он будет пытаться подключиться к ведущему устройству, в противном случае откатится к подчиненному устройству (возможно, добавив подчиненное устройство в процесс). Если упомянутые узлы являются сторожевыми узлами, он попросит сторожа назначить сервер для подключения.
На данный момент BookSleeve не предлагает избыточную оболочку подключения, которая автоматически восстанавливает соединение. Это на дорожной карте, но это не сложно сделать в коде вызова. Я планирую добавить больше поддержки для этого одновременно с реализацией поддержки redis-cluster.
Но: все это с точки зрения BookSleeve - я не могу специально комментировать SignalR.
BookSleeve 1.3.41.0 поддерживает Redis Sentinel. Используемая нами конфигурация развертывания: 1 мастер-редис, 1 подчиненный редис. Каждая коробка имеет часового (один для мастера, один для раба). Клиенты сначала подключаются к часовому, а затем перенаправляет их на активный мастер.
Вот как это реализовано в клиентском коде:
public class OwinStartup
{
public void Configuration(IAppBuilder app)
{
var config = new WebClientRedisScaleoutConfiguration();
GlobalHost.DependencyResolver.UseRedis(config);
app.MapSignalR();
}
}
public class WebClientRedisScaleoutConfiguration : RedisScaleoutConfiguration
{
public WebClientRedisScaleoutConfiguration()
: base(() => getRedisConnection(), WebUIConfiguration.Default.Redis.EventKey)
{ }
private static BookSleeve.RedisConnection _recentConnection;
private static BookSleeve.RedisConnection getRedisConnection()
{
var log = new TraceTextWriter();
var connection = BookSleeve.ConnectionUtils.Connect("sentinel1:23679,sentinel2:23679,serviceName=WebClient", log);
if (connection != null)
{
_recentConnection = connection;
return connection;
}
if (_recentConnection != null)
{
return _recentConnection;
}
// Cannot return null nor throw exception -- this will break reconnection cycle.
return new BookSleeve.RedisConnection(string.Empty);
}
}
Горячая настройка Redis.Общие шаги Загрузите Redis для Windows http://redis.io/download Распакуйте в c:\redis
Мастер (только самый первый редис-бокс, только один такой конфиг)
- Создать службу Redis: выполнить команду в каталоге redis
redis-server --service-install redis.conf --service-name redis
- Запустить сервис Redis
- Убедитесь, что Redis перечисляет порт 6379
Раб (другие коробки)
- Обновление redis.conf: добавить строку
slaveof masterAddr 6379
гдеmasterAddr
это адрес, на котором работает redis в режиме master, 6379 - это порт redis по умолчанию. - Создать службу Redis: выполнить команду в каталоге redis
redis-server --service-install redis.conf --service-name redis
- Запустить сервис Redis
- Убедитесь, что Redis перечисляет порт 6379
Страж (общий для хозяина и раба)
Создайте файл redis-sentinel.conf с содержимым:
port 26379 logfile "redis-sentinel1.log" sentinel monitor WebClient masterAddr 6379 1
где masterAddr - это адрес, где выполняется redis в режиме master, 6379 - это порт redis по умолчанию, 1 - кворум (номер хоста, который принимает решение, сервер отключен или нет).
WebClient
это имя группы. Вы указываете это в коде клиентаConnectionUtils.Connect("...,serviceName=WebClient...")
- Создать службу Redis Sentinel: выполнить команду в каталоге Redis
redis-server --service-install redis-sentinel.conf --service-name redis-sentinel --sentinel
- Запустить сервис redis-sentinel