В последнее время у меня появился интерес к кластерам VPS, и мне показалось отличной идеей попробовать настроить систему с несколькими VPS, которую я опишу ниже. На самом деле он не предназначен для производственного использования, а скорее как эксперимент по совершенствованию соответствующих навыков и знаний о многосерверных системах. Однако, поскольку мне не хватает ноу-хау, мне нужна общая информация.
Описание установки
Поскольку я ежедневно имею дело с приложениями Node.js, которые используют Redis в качестве хранилища данных, он послужит основой для настройки. Я имел в виду установку как минимум 2 VPS. На каждом из серверов будут работать одни и те же службы Node (скажем, 5 разных служб одновременно на обоих серверах), а также каждый VPS запускает один экземпляр Redis, который используется службами Node для хранения данных. Цель этой настройки - включить зеркальное отображение данных между обоими серверами (если служба Node №1 на первом сервере добавила что-то в Redis, это изменение также должно быть отражено на втором сервере). Это также будет означать, что загруженные файлы и т. Д. Должны зеркально отображаться на обоих серверах (в том смысле, что изменения как в хранилищах данных, так и в файловых системах должны отражаться на другом).
В идеале это позволило бы использовать простые балансировщики нагрузки, которые распределяют нагрузку между серверами, и в случае сбоя одного сервера другие серверы будут продолжать работать и, следовательно, поддерживать службы Node в сети. Скорость, с которой необходимо отразить изменения, невысока, и даже минутная задержка не имеет особого значения. Однако, если пользователь активно обновляет данные, ему должны быть представлены данные, которые он только что изменил (в том смысле, что его нужно каким-то образом заставить взаимодействовать с сервером, на котором он обновлял данные, поскольку изменения могли не быть отражены на других серверов пока нет).
Вопросы
Каковы разумные способы достижения балансировки нагрузки? Я слышал об использовании некоторой магии DNS, но толком этого не понимаю. Простое обновление записей DNS будет слишком медленным, поскольку они кэшируются в нескольких местах. Также я читал об использовании одного «основного прокси-сервера», который бы выполнял балансировку между другими серверами. Это кажется немного рискованным, потому что в случае отказа основного сервера все будет отключено.
Как зеркалировать части файловой системы на разных VPS, чтобы загруженные изображения и т. Д. Присутствовали на обоих серверах. Существуют ли какие-либо широко распространенные варианты программного обеспечения или простой сценарий, который обнаруживает загрузки и затем реплицирует эти файлы на разные серверы, будет работать нормально?
Спасибо!
Могу помочь только с вопросом 1.
Есть несколько подходов к балансировке нагрузки и аварийному переключению (сначала самый простой)
Балансировка нагрузки DNS Все просто: скажем, у вас есть два (или более) сервера с IP-адресами 1.1.1.1 и 2.2.2.2. Чтобы настроить балансировку нагрузки DNS, вы создаете записи DNS для своего имени хоста, скажем www.example.com:
www.example.com. A 1.1.1.1
A 2.2.2.2
(Кроме того, DNS-сервер должен быть настроен для обслуживания этого имени в циклическом режиме, но обычно он в любом случае используется по умолчанию).
Теперь каждый DNS-запрос к www.example.com будет отвечать двумя адресами в псевдослучайном порядке, и, таким образом, ваши клиенты, вероятно, будут равномерно распределены между серверами.
Нет необходимости часто обновлять записи, после настройки они работают вечно. Он также предоставляет некоторые степень аварийного переключения, как если бы один из хостов вышел из строя, браузеры отключат время ожидания, а затем попробуют второй хост, НО может быть значительная задержка, и пользователям это не понравится.
Динамический DNS. Возможное добавление к 1. После того, как хост выходит из строя, динамически обновляет записи DNS и удаляет ссылку на отказавший хост, но большое количество кэширования в системе DNS приводит к некоторому периоду ухудшения работы, о котором я упоминал выше. Использование очень низкого TTL улучшает ситуацию, но по-прежнему существует кеширование внутри клиентской ОС / браузера, которое не учитывает TTL, а также некоторые интернет-провайдеры не игнорируют низкие TTL. В любом случае, суть в том, что это очень простой и доступный способ достичь баланса и основной отказоустойчивость.
Прокси. Простой и популярный для балансировки нагрузки. Чтобы исключить единую точку отказа, вам необходимо комбинировать ее с другими подходами.
IP Failover. В дополнение к 2., чтобы справиться с отказом самого прокси, ДВА прокси используются в настройке «IP failover» - основная идея состоит в том, чтобы иметь один IP-адрес, который обычно появляется на host1, но как только он выходит из строя, host2 обнаруживает его, и приходит IP на host2. Ищите проект linux "heartbeat". (Вы также можете сами серверы аварийного переключения без прокси, но у вас не будет балансировки). Как обычно оба ПК должны находиться в одной подсети (одном центре обработки данных).
Anycast. Идея состоит в том, чтобы объявлять маршруты к одному IP-адресу (фактически одной подсети) в нескольких физических местах. Вам нужна собственная подсеть / 24 и возможность настраивать BGP. Anycast часто используется для DNS-серверов. Существуют трудности с постоянными TCP-соединениями, и поэтому проще подходит для UDP и DNS, но все же иногда используется и для Интернета.
Это основные идеи. Как видите, у каждого метода есть ограничения и сложности. И если это недостаточно сложно, вы можете построить любую мыслимую комбинацию вышеперечисленных подходов :)