Проблема
Я пытаюсь настроить несколько веб-ферм (для разных сайтов) следуяАрхитектура NLB+ARRДопустим, у меня есть 6 виртуальных машин:
- Кластер ARR+NLB из 2 виртуальных машин. Он получает трафик и перенаправляет его на серверы контента. Правила перезаписи URL с условиями заголовка HTTP Host используются для маршрутизации запросов на правильные серверы контента.
- Сайт 1 Контент-серверы: 2 ВМ. Хостингhttp://www.mysite1.com/
- Сайт 2 Контент-серверы: 2 ВМ. Хостингhttp://www.mysite2.com/
Все работает отлично, я проверил и убедился в высокой доступности на обоих уровнях.
Теперь, по какой-то причине Сайт 2 должен работать в активном/пассивном режиме, так что только 1 VM получает трафик, а другая используется для отказоустойчивости. В некотором смысле, я хочу что-то похожее на режим одного хоста NLB, но для ARR.
Как этого можно добиться?
Обходные пути
Я испробовал несколько косвенных подходов, чтобы добиться желаемого поведения.
- Алгоритм балансировки нагрузки.Попробовал установить веса round and Robin на 1/0. Проблема в том, что нельзя установить 0. Должно быть не менее 1. Можно установить 4 миллиарда + что-то / 1, но я не уверен, гарантирует ли это, что ни один случайный запрос не попадет на второй узел.
- Соответствие имени хоста серверу.В расширенных настройках Host Name Affinity я могу настроить только 1 сервер для размещения на сайте 2. Это работает, но проблема в том, что таблицы маршрутизации не синхронизированы между 2 виртуальными машинами ARR. Поэтому время от времени ARR1 привязывает трафик к одному узлу, а ARR2 — к другому, который не является активным/пассивным.
- Привязка имени хоста + NLB для отдельного хоста.В качестве модификации предыдущего подхода я также могу переключить NLB в режим одного хоста, чтобы решить проблему синхронизации таблицы маршрутизации. Проблема в этом случае заключается в том, что я также отключаю балансировку нагрузки ARR для Сайта 1.
- Привязка имени хоста + NLB Single Host + 2 IP-адреса.Если я добавлю второй IP-адрес к предыдущему решению, создам 2 кластера NLB, работающих в разных режимах, все должно работать нормально. Проблема в том, что я не хочу платить за второй публичный IP.
Ни одно из решений не идеально.
Образ идеального решения
Мне бы очень хотелось узнать способ перевести ARR в режим одного хоста, как это можно сделать для NLB. И заставить его синхронизировать маршрутизацию между узлами.
Кто-нибудь знает, как это сделать? Или знает альтернативные подходы?
решение1
Я нашел один способ, который, кажется, работает, хотя и не полностью. Он описанздесь. Идея заключается в использовании алгоритма балансировки нагрузки «Server Variable Hash» и «HTTP_HOST» в качестве переменной. Таким образом, все экземпляры ARR сопоставляют заданный хост с одним и тем же сервером контента. Я проверил, что они выполняют откат на другой доступный сервер, если сопоставленный не работает.
Проблема с решением, однако, в том, что вы не можете контролировать, на какой сервер контента сопоставляется хост, это определяется хэш-функцией. Тем не менее, в некотором смысле это правильно - если вы боитесь сделать какой-либо узел активным, то как вы можете ожидать надежного переключения? Вы должны быть уверены во всех ваших серверах контента одновременно.
Другая проблема заключается в том, что вы не можете использовать несколько имен хостов для каждого сайта, поскольку они, скорее всего, будут сопоставлены с разными серверами.