Назад | Перейти на главную страницу

Как настроить ARR в активном / пассивном (он же отказоустойчивом) режиме?

Эта проблема

Я пытаюсь настроить несколько веб-ферм (для разных сайтов), следуя Архитектура NLB + ARR. Допустим, у меня 6 виртуальных машин:

  1. Кластер ARR + NLB из 2 ВМ. Он получает трафик и направляет его на контент-серверы. Правила перезаписи URL с условиями заголовка HTTP Host используются для маршрутизации запросов на правильные серверы содержимого.
  2. Серверы содержимого сайта 1: 2 виртуальных машины. Хостинг http://www.mysite1.com/
  3. Серверы содержимого сайта 2: 2 виртуальных машины. Хостинг http://www.mysite2.com/

Все работает нормально, я проверил, что у меня высокая доступность на обоих уровнях.

Теперь по какой-то причине Сайт 2 должен работать в активном / пассивном режиме, так что только 1 виртуальная машина получает трафик, а другая предназначена для аварийного переключения. В некотором смысле мне нужно что-то похожее на режим одиночного хоста NLB, но для ARR.

Как этого добиться?

Обходные пути

Я пробовал несколько косвенных подходов для достижения желаемого поведения.

  1. Алгоритм балансировки нагрузки. Пытался установить круглые и робиновые веса на 1/0. Проблема в том, что вы не можете установить 0. Он должен быть не меньше 1. Вы можете установить 4 миллиарда + smth / 1, но я не уверен, гарантирует ли это, что ни один случайный запрос никогда не поступит на второй узел.
  2. Соответствие имени хоста серверу. В расширенных настройках сопоставления имени хоста я могу настроить только 1 сервер, который будет выделен для сайта 2. Он работает, но проблема в том, что таблицы маршрутизации не синхронизируются между двумя виртуальными машинами ARR. Таким образом, время от времени ARR1 присоединяет трафик к одному узлу, а ARR2 - к другому, который не является активным / пассивным.
  3. Соответствие имени хоста + одиночный хост NLB. В качестве модификации предыдущего подхода я также могу переключить NLB в режим одного хоста, чтобы решить проблему синхронизации таблицы маршрутизации. Проблема в этом случае заключается в том, что я также отключаю балансировку нагрузки ARR для Сайта 1.
  4. Сходство имени хоста + одиночный хост NLB + 2 IP-адреса. Если я добавлю второй IP-адрес к предыдущему решению, создаю 2 кластера NLB, работающих в разных режимах, все должно работать нормально. Проблема в том, что я не хочу платить за второй публичный IP.

Ни одно из решений не является идеальным.

Образ идеального решения

Я действительно хотел бы знать, как перевести ARR в режим одного хоста, как это можно сделать для NLB. И пусть он синхронизирует маршрутизацию между узлами.

Кто-нибудь знает, как это сделать? Или знает альтернативные подходы?

Я нашел один способ, который кажется работающим, хотя и не полностью. Это описано Вот. Идея состоит в том, чтобы использовать алгоритм балансировки нагрузки «Server Variable Hash» и «HTTP_HOST» в качестве переменной. Таким образом, все экземпляры ARR сопоставляют данный хост с одним и тем же сервером контента. Я проверил, что они делают откат на другой доступный сервер, если сопоставленный сервер не работает.

Однако проблема с решением заключается в том, что вы не можете контролировать, на какой контент-сервер отображается хост, это определяется хеш-функцией. Тем не менее, в некотором смысле это правильно - если вы боитесь, что какой-либо узел станет активным, то как вы можете ожидать надежного переключения при отказе? Вы должны быть уверены во всех своих контент-серверах одновременно.

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