балансировка нагрузки нескольких горизонтальных экземпляров drupal

8

Я разработал REST WebAPI, используя модуль Services. Работает нормально. У меня есть клиент этого API с предполагаемым использованием, который требует горизонтального масштабирования моего экземпляра Drupal. Обратите внимание, что из-за характера моего API, требующего значительных ресурсов процессора и графического процессора, я не могу использовать облачные серверы. Кроме того, из-за природы моего API, экземпляры Drupal должны работать в ОС Windows. (Моему приложению требуется программное обеспечение, доступное только на Win64.) У меня сейчас довольно мощный сервер в одном месте, и для этого амбициозного клиента я планирую горизонтальное масштабирование моего оборудования следующим образом:

  • Один сервер CentOS с HaProxy в качестве балансировщика нагрузки внешнего интерфейса,
  • Два для начала, с дополнительным добавлением по мере необходимости серверов Windows Server 2008 R2, на которых размещается Drupal,
  • Один сервер баз данных CentOS, предоставляющий одну базу данных для нескольких экземпляров Drupal,
  • Один сервер базы данных CentOS работает в режиме репликации в случае смерти сервера БД 1.

Мои вопросы связаны с тем, как работает балансировщик нагрузки HaProxy. Я предполагаю, что sessionIds, созданные экземплярами Drupal, будут уникальными друг от друга. Рассматривает ли балансировщик нагрузки идентификатор сеанса и направляет все запросы на тот же сервер, который создал этот идентификатор сеанса? Как будет работать связь REST WebAPI, если из-за балансировки нагрузки каждый запрос API направляется на другой сервер? Все ли данные, на которые ссылается WebAPI, должны храниться в базе данных, потому что я не могу гарантировать, что несколько запросов API для одного и того же ресурса будут направлены в один и тот же экземпляр Drupal?

Блейк Сефтнер
источник
Очень интересный вопрос Я не могу не чувствовать, что это более общий вопрос, чем вопрос, касающийся Drupal (хотя он может применяться к любому REST API на основе PHP, который использует аутентификацию сеанса, если я правильно читаю); в этом случае вам может быть полезно пометить его для переноса на основной SO-сайт. Просто мысль :)
Клайв
+1 для поиска дополнительной информации в другом месте. Вы можете использовать большинство советов для масштабирования любого PHP-приложения с помощью Drupal. Поскольку мой комментарий был слишком длинным, я опубликовал ответ, который может помочь вам найти то, что вам нужно.
rocketeerbkw
Спасибо rocketeerbkw и Berdir за ваши идеи. В ходе моего постоянного исследования этого я узнал, что HaProxy не обрабатывает SSL с липкими сессиями, и мне нужно использовать что-то вроде stunnel для SSL, так как все мои API-соединения по SSL. Похоже, необходимы дополнительные исследования, чтобы полностью понять мой следующий шаг здесь.
Блейк Сенфтнер
И, похоже, дальнейшие исследования показывают, что мои настройки должны выглядеть следующим образом: уровень 1: сервер межсетевого экрана и stunnel, уровень 2: балансировщик нагрузки, уровень 3: несколько веб-серверов drupal, уровень 4: сервер общей базы данных, уровень 5: сервер репликации базы данных. И, возможно, вместе с Tier4 SAN для общего хранилища файлов для нескольких экземпляров Drupal. Любые идеи, панировочные сухари или веб-статьи, описывающие людей, создающих что-то подобное, приветствуются.
Блейк Сенфтнер

Ответы:

12

Наличие нескольких веб-серверов за балансировщиком нагрузки / обратным прокси-сервером довольно распространено для Drupal и хорошо поддерживается. Varnish, как правило, используется в мире Linux, потому что эта штука просто безумно быстра, когда у него есть возможность использовать ее, то есть анонимных посетителей. Что, очевидно, не относится к вашему сайту.

Сеансы по умолчанию хранятся в базе данных, так что это не проблема. Единственная другая вещь, которой нужно делиться на всех серверах, это каталог публичных файлов и любой другой, например, приватные файлы, если вы используете что-то подобное). В большинстве случаев для этого используется общая / распределенная файловая система, такая как NFS, хотя существуют и более продвинутые подходы. На одном сайте, где я участвую, находится файловая система, предоставляемая еще одним сервером, который монтируется по NFS на серверах Drupal (поэтому доступ там медленный) и распространяется Lighthttpd в другом домене. Но, опять же, это, вероятно, не так важно для вас, так как вы, скорее всего, не собираетесь обслуживать много изображений и CSS-файлов.

Как упомянул rocketeerbkw, для Memcache, Redis и других есть кеш-серверы. До сих пор я использовал только Memcache, но недавно начал изучать Redis, и он выглядит очень многообещающе, но я не уверен, что он доступен для Windows. Однако было бы возможно настроить отдельный сервер Linux, который будет использоваться для кэша. Drupal 7 в значительной степени опирается на кэши, поэтому возможность их удаления из базы данных очень важна по двум причинам:

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

  2. Может быть, даже более важно, это помогает снизить нагрузку на базу данных. После установки базовой настройки добавить дополнительные веб-серверы очень просто. Как только вы начинаете достигать пределов одного сервера базы данных, все становится намного сложнее, и вам нужно разобраться с такими вещами, как репликация master / master (Drupal 7 действительно не сильно выигрывает от среды master / slave).

Таким образом, в основном вам нужен только ваш собственный API. Если возможно, вам нужно убедиться, что все всегда доступно со всех серверов. Вы можете использовать либо базу данных, либо файловую систему, либо что-то еще (Drupal также может использовать MongoDB для хранения определенных данных, например, полей). Если это не вариант, вам нужно будет использовать липкие сессии, чтобы пользователи всегда оказывались в одном экземпляре. Однако вам следует избегать этого, поскольку в случае сбоя одного из серверов все пользователи, находящиеся на этом сервере, должны повторно подключиться к другому серверу, что может привести к потере данных.

Berdir
источник
0

По умолчанию PHP хранит сессии на диске. Если пользователь заходит на сервер 1, а затем нажимает на сервер 2, он выходит из системы. Есть несколько вариантов исправления:

  1. Не хранить сессии на диске
  2. Убедитесь, что пользователи всегда используют один и тот же сервер
  3. Смонтируйте общую файловую систему на всех серверах

Для реализации # 2 и ответить на ваши вопросы о HAProxy; В самой базовой настройке вы можете запустить его в режиме TCP и использовать алгоритм балансировки «source» ( http://cbonte.github.com/haproxy-dconv/configuration-1.4.html#4-balance ), чтобы убедиться, что пользователи нажимают тот же сервер. Вам следует прочитать документы, чтобы определить, есть ли у вас недостатки при использовании этого подхода.

Для # 1 вы можете использовать хранилище ключей / значений, такое как Redis или Memecached, к которому все ваши серверы будут подключаться и получать сеансы. Это заставляет сессии загружаться / сохранять очень быстро, и вы также можете использовать их как общий кеш Drupal.

rocketeerbkw
источник
6
Drupal по умолчанию хранит сессии в базе данных, а не в файловой системе.
Бердир