Я разработал 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 и хорошо поддерживается. Varnish, как правило, используется в мире Linux, потому что эта штука просто безумно быстра, когда у него есть возможность использовать ее, то есть анонимных посетителей. Что, очевидно, не относится к вашему сайту.
Сеансы по умолчанию хранятся в базе данных, так что это не проблема. Единственная другая вещь, которой нужно делиться на всех серверах, это каталог публичных файлов и любой другой, например, приватные файлы, если вы используете что-то подобное). В большинстве случаев для этого используется общая / распределенная файловая система, такая как NFS, хотя существуют и более продвинутые подходы. На одном сайте, где я участвую, находится файловая система, предоставляемая еще одним сервером, который монтируется по NFS на серверах Drupal (поэтому доступ там медленный) и распространяется Lighthttpd в другом домене. Но, опять же, это, вероятно, не так важно для вас, так как вы, скорее всего, не собираетесь обслуживать много изображений и CSS-файлов.
Как упомянул rocketeerbkw, для Memcache, Redis и других есть кеш-серверы. До сих пор я использовал только Memcache, но недавно начал изучать Redis, и он выглядит очень многообещающе, но я не уверен, что он доступен для Windows. Однако было бы возможно настроить отдельный сервер Linux, который будет использоваться для кэша. Drupal 7 в значительной степени опирается на кэши, поэтому возможность их удаления из базы данных очень важна по двум причинам:
Такие инструменты, как Redis и Memcache, предназначены для быстрого поиска на основе ключей и хранят свои данные всегда в памяти, чтобы сделать поиск максимально быстрым. Они также имеют встроенную поддержку для автоматической очистки старых данных кэша, если настроенный лимит становится ближе.
Может быть, даже более важно, это помогает снизить нагрузку на базу данных. После установки базовой настройки добавить дополнительные веб-серверы очень просто. Как только вы начинаете достигать пределов одного сервера базы данных, все становится намного сложнее, и вам нужно разобраться с такими вещами, как репликация master / master (Drupal 7 действительно не сильно выигрывает от среды master / slave).
Таким образом, в основном вам нужен только ваш собственный API. Если возможно, вам нужно убедиться, что все всегда доступно со всех серверов. Вы можете использовать либо базу данных, либо файловую систему, либо что-то еще (Drupal также может использовать MongoDB для хранения определенных данных, например, полей). Если это не вариант, вам нужно будет использовать липкие сессии, чтобы пользователи всегда оказывались в одном экземпляре. Однако вам следует избегать этого, поскольку в случае сбоя одного из серверов все пользователи, находящиеся на этом сервере, должны повторно подключиться к другому серверу, что может привести к потере данных.
источник
По умолчанию PHP хранит сессии на диске. Если пользователь заходит на сервер 1, а затем нажимает на сервер 2, он выходит из системы. Есть несколько вариантов исправления:
Для реализации # 2 и ответить на ваши вопросы о HAProxy; В самой базовой настройке вы можете запустить его в режиме TCP и использовать алгоритм балансировки «source» ( http://cbonte.github.com/haproxy-dconv/configuration-1.4.html#4-balance ), чтобы убедиться, что пользователи нажимают тот же сервер. Вам следует прочитать документы, чтобы определить, есть ли у вас недостатки при использовании этого подхода.
Для # 1 вы можете использовать хранилище ключей / значений, такое как Redis или Memecached, к которому все ваши серверы будут подключаться и получать сеансы. Это заставляет сессии загружаться / сохранять очень быстро, и вы также можете использовать их как общий кеш Drupal.
источник