2012-04-23 2 views
5

Я поддерживаю веб-приложение, которое перерастает один VPS. Архитектура состоит из большого числа мелких пользователей, каждый из которых имеет свой собственный поддомен. Пользователи не взаимодействуют. Загрузка означает, что мне нужно переместить некоторых пользователей и всех новых пользователей на другую установку веб-приложения на отдельный сервер.Горизонтальное масштабирование: маршрутизация пользовательских поддоменов между серверами

В настоящее время каждый поддомен каждого пользователя попадает в тот же виртуальный хост, где один фронт-контроллер PHP отображает соответствующий контент на основе имени хоста. Единственная подстановочная DNS-запись для * .mydomain.com указывает на текущий сервер.

Каков наилучший вариант для маршрутизации различных поддоменов пользователей на разные серверы?

Мои мысли:

  • новый домен верхнего уровня для каждого сервера. user.s1.mydomain.com, user.s2.mydomain.com и т. д. (информация о неэлементах и ​​утечках)
  • Запуск моего собственного DNS-сервера для маршрутизации пользователей между серверами (дополнительная точка отказа, незнакомая технология)
  • A центральный фронт-контроллер/балансировщик, который обратный-проксирует каждый запрос на соответствующий сервер (дополнительная точка отказа, потенциально ограниченные соединения)
+1

Является ли пользовательский контент для каждого субдомена все в базе данных или они загружают свои собственные данные в файловую систему на сервере? – drew010

+0

@ drew010 Пользовательский контент сохраняется как в базе данных, так и в файловой системе. Поскольку пользователи не взаимодействуют, я могу свободно настраивать несколько экземпляров базы данных ... проблема - это просто запросы к странице маршрутизации. Я полагаю, что разделение db + веб-серверов станет еще одним возможным способом масштабирования, но в итоге мне придется разделить веб-сервер и потребуется решение. – mappu

+1

Вот что я понял. Я склоняюсь больше всего к DNS, но это означает, что вам понадобится запись A для каждого субдомена или настраиваемое DNS-решение, которое может запросить ваше приложение, чтобы определить, какой IP-адрес использовать для данного субдомена.Теперь у вас могут быть лучшие результаты, задающие это на ServerFault, когда я думаю об этом. – drew010

ответ

4

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

В вашей шкале установите nginx для обработки всего статического содержимого, а также обратного динамического содержимого прокси на столько же, сколько необходимо. Установка для простого прокси проход находится близко к:

upstream upstream_regular_backend { 
    fair; 
    server 10.0.0.1:80; 
    server 10.0.0.2:80; 
} 

server { 
    listen 0.0.0.0:80; 
    server_name example.com; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    location/{ 
     proxy_pass http://upstream_regular_backend; 
    } 
} 

Для обслуживания статического контента и передачи обратно все остальное, что-то вроде:

server { 
    listen 0.0.0.0:80; 
    server_name example.com; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    index index.php; 
    root /some/dir/: 
    location ~ \.php { 
     proxy_pass http://upstream_regular_backend; 
    } 
} 

Естественно, если вы не используете PHP, настройки конфигурации соответственно.

По определению вверху, «справедливое»; будут основываться на балансировке баланса на основе времени отклика. Для мотивов кэширования вы можете использовать «ip_hash;» вместо этого, поскольку он будет обрабатывать запросы от клиента всегда на одном сервере.

Наша установка немного дальше по дороге. У нас есть nginx load-balancers, проксирующий кэш лака, который, в свою очередь, проксирует серверы динамического контента.

Если вы беспокоитесь о том, что nginx является одноточечным отказом, настройте вторичный сервер, готовый принять IP-адрес интерфейса в случае его отказа.

+0

Спасибо за ваш ответ - кажется, гарантированно работает хорошо, пока nginx может сэкономить открытые соединения, а ip_hash (недостающая часть головоломки) избавляет меня от перестройки приложения, чтобы не заботиться о том, на каком сервере каждый запрос приходит. У вас есть балансировка нагрузки nginx для завершения SSL? – mappu

+0

Мы завершаем SSL на nginx, хотя и не на настройке, которую я описал. –

+0

Что касается ограничений на подключение, то из того, что я помню, единственным ограничением, которое мы ударили, было количество дескрипторов открытых файлов. Измените nginx init.d и поднимите его на сколько угодно. Помимо этого, трафик маршрутизации nginx имеет отличную эффективность. –