Запуск приложения Drupal на веб-ферме (масштабируемость), КАК? - PullRequest
5 голосов
/ 29 октября 2010

Мы создали веб-сайт с использованием Drupal, но проблема (хорошая проблема) в том, что мы получаем WAAAAYY слишком много обращений к серверу до такой степени, что трафик сводит сервер на колени.

теперь мы хотим запустить приложение с 3-х серверов за балансировщиком нагрузки, один для обслуживания mysql, а другой 2 для обслуживания веб-приложения. Я делал это раньше с помощью Symofony для другого проекта, и это было относительно легко. ,

Однако мне кажется, что я не могу далеко уйти с Drupal, главная проблема на этом этапе - это возможность сохранить все переменные сессии в mysql, поэтому независимо от того, на какой сервер балансировщик нагрузки отправляет запрос, Приложение имеет единую точку отсчета в отношении сессий.

Любая помощь будет принята с благодарностью, я ищу хороший учебник или документацию, так как я унаследовал этот проект от парня, который больше не работает здесь: /

Спасибо

Ответы [ 4 ]

6 голосов
/ 30 октября 2010

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

Вы пишете:

Однако я, кажется, не могу получить далеко с Drupal, главная проблема в этот момент должен быть в состоянии сохранить все переменные сеанса в MySQL, так независимо от того, какой сервер загружен балансировщик отправляет запрос приложение имеет одну точку ссылка на сессии. ссылка на сессии.

Сессии - это то, что обрабатывается на уровне ядра PHP и на уровне Drupal + MySQL. По сути, когда браузер обращается к вашему серверу, логика обработки основного сеанса PHP назначает уникальный файл cookie PHPSESSID. Этот файл cookie отправляется этим браузером при каждом последующем запросе.

[В дополнение к этому, используя PHPSESSID, базовая логика сеанса PHP может связывать некоторые другие данные, такие как настройки комментариев, сообщения drupal, которые должны отображаться при просмотре следующей страницы и т. Д. Все это выполняется с помощью переменной PHP $ _SESSION. PHP делает это довольно легко. Обратите внимание, что MySQL все еще не входит в изображение до этой точки. MySQL входит в картину, только когда дополнительные данные должны быть связаны с PHPSESSID, такими как идентификатор пользователя и т. Д. От Drupal]

Короче говоря, PHP выполняет некоторую обработку сеанса, назначая файл cookie PHPSESSID. Теперь предположим, что балансировщик нагрузки отправляет запрос в Apache Webserver 1, а mod_php (модуль PHP apache) назначает уникальный PHPSESSID, скажем, «563» (это более длинная строка в реальной жизни). Теперь в следующий раз, когда этот клиент зайдет на ваш сайт, файл cookie PHPSESSID будет отправлен со значением 563. Теперь могут возникнуть два разных случая:

  1. Балансировщик нагрузки (по совпадению) отправляет запрос в Apache 1, который изначально назначил файл cookie PHPSESSID. Он распознает 567 и все работает нормально
  2. Балансировщик нагрузки отправляет запрос в Apache 2. PHPSESSID равен 567, который Apache 2 mod_php никогда не назначал. Так что он запутался и назначил новый PHPSESSID. Здесь возникают ваши проблемы.

Как решить вашу проблему : Проблема, с которой вы сталкиваетесь, является распространенной проблемой. Вам просто нужно сообщить балансировщику нагрузки, что после отправки клиента на определенный веб-сервер тот же веб-сервер должен продолжать обрабатывать этот запрос. Обычно это делается сообщением самому балансировщику нагрузки отправить файл cookie, сообщающий, какой сервер обрабатывает первоначальный запрос. В будущем клиент представляет этот файл cookie для балансировщика нагрузки, а балансировщик нагрузки направляет запрос на исходный сервер, который обрабатывает запрос. Это, как я объяснил выше, важно, потому что только этот сервер знает о назначенном им PHPSESSID.

Все приличные балансировщики нагрузки имеют возможность назначать куки. Посмотрите сведения о конфигурации для вашего баланса нагрузки в отношении сеансов.

Больше умопомрачительных вещей После того, как вы решили проблему сессий, настроив балансировщик нагрузки для назначения файлов cookie, вам нужно будет рассмотреть еще одну важную проблему. ДОЛЖЕН быть общий доступ к папке files на вашем сервере. Это имеет смысл. Если изображение загружено пользователем на один сервер, другие люди, получающие доступ к сайту через другой сервер, должны иметь доступ к тому же изображению. Это достигается с помощью NFS (Networked File System) mount или SAN.

Только , затем у вас будет полностью работающая многосерверная установка Drupal. Как уже отмечали другие люди, вы можете обратиться к некоторым справочным статьям в сети. Рекомендуется дальнейшая оптимизация, например, сохранение таблицы сессий в memcache, а не в MySQL, но опять же, это не имеет ничего общего с тем, что я написал выше. Файлы cookie для выдачи балансировки нагрузки действительно необходимы.

Зачем переживать столько горя, что я спрашиваю? В прошлом я занимался многосерверными вещами, и это не стоит того, если ваш сайт не получает серьезного трафика. Ваш трафик достаточно велик? Установка слоя кэширования, такого как Varnish, перед Drupal или даже лучше, использование модуля boost решит ваши проблемы, если большинство ваших пользователей анонимны.

Проверьте это видео http://sf2010.drupal.org/conference/sessions/24-million-page-views-day-60-m-month-one-server. Парень раздает огромное количество просмотров страниц, используя только 1 сервер. С одним сервером все намного проще. Попробуйте! Только самые большие веб-сайты могут требовать нескольких серверов.

1 голос
/ 02 ноября 2010

Изменить ядро ​​на Pressflow

http://pressflow.org/

Агрегат JS и CSS

http://drupal.org/project/css_gzip

http://drupal.org/project/javascript_aggregator

Использовать кэширование

nginx + Authcache + memcache + Easy authcache

http://drupal.org/node/110224

http://drupal.org/project/authcache

http://drupal.org/project/memcache

http://drupal.org/node/916742

Или

nginx + Varnish + ESI + memcache

http://drupal.org/node/110224

http://drupal.org/project/varnish

http://drupal.org/project/esi

Также проверьте http://getpantheon.com/

1 голос
/ 29 октября 2010
0 голосов
/ 29 октября 2010

Хорошая проблема, чтобы иметь. Не один простой ответ.

Рассматривали ли вы memecached для кэширования, которое может помочь.

Как можно использовать лак перед Drupal для определенного кэширования.

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

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

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