У нас есть существующее приложение, которое мы хотим разделить на несколько серверов (например: всего 1000 пользователей, 100 пользователей разделены на 10 серверов).
В идеале мы хотели бы иметь возможность ретранслировать запросы HTTPS на конкретный сервер на основе некоторого компонента URL-адреса. Например: пользователи с 1 по 100 переходят к http://server1.domain.com/ Пользователи от 2 до 200 переходят к http://server2.domain.com/ и т.д. и т.п.
Где входящие запросы выглядят так: https://secure.domain.com/user/{целочисленный пользователь # идет сюда} / путь / к / файлу
Кто-нибудь знает простой способ сделать это? Фунт выглядит многообещающе ... но не похоже, что он поддерживает маршрутизацию на основе такого URL.
Еще лучше было бы, если бы его не нужно было жестко запрограммировать. Балансировщик нагрузки мог бы сделать отдельный HTTP-запрос другому серверу, чтобы спросить: «Эй, на какой сервер я должен ретранслировать запрос на URL {URL, который был запрошен идет сюда}? " и ретранслировать на имя хоста, возвращенное в ответе HTTP.
Лак наверное сделал бы это. Как и в случае с другими вариантами, упомянутыми здесь, вам понадобится что-то вроде фунта перед ним, чтобы действовать как терминатор SSL. Однако после этого вы можете настроить каждый реальный сервер как «бэкэнд», а затем добавить в конфигурацию что-то вроде следующего:
## Define the back end servers. backend server01 { .host = "192.0.2.1"; .port = "80"; } backend server02 { .host = "192.0.2.2"; .port = "80"; } sub vcl_recv { if (req.url ~ "^/1[0-9][0-9]/"){ ## If the first part of the link is 100-199 use server01 set req.backend = server01; pipe; } else if (req.url ~ "^/2[0-9][0-9]/") { ## If the first part of the link is 200-299 use server02 set req.backend = server02; pipe; } else { ## If all else fails fall back to server01 set req.backend = server01; pipe; } }
Это всего лишь отрывок из соответствующих разделов, и, вероятно, в конфигурации потребуется больше. Например, вы можете добавить следующее сразу после sub vcl_recv {
чтобы кэшировать любые статические файлы, чтобы серверы не попадали каждый раз для файлов, которые не меняются.
if (req.request == "GET" && req.url ~ "\.(png|jpg|gif|css)$") { lookup;
Вы даже можете добавить в конфигурацию небольшие встроенные программы на C, чтобы общаться с внешней службой и решать, какой бэкэнд использовать.
Это можно было бы сделать с помощью перезаписчика URL в Кальмар - обратите внимание, что вам нужно прервать SSL перед прокси (например, станнель).
Есть ли у вас ресурсы для кодирования? Я сделал это почти точно с помощью небольшой программы на среднем сервере. Он извлекает идентификатор пользователя из URI, выполняет поиск в БД, чтобы найти расположение их файлов, извлекает файл и затем записывает его обратно пользователю. Я сделал это с помощью сервлета Java, но есть много других вариантов для достижения того же результата.
HAProxy сделает то, о чем вы просите. У него есть возможность выполнять маршрутизацию уровня 7 на основе содержимого URL-адреса, и это открытый исходный код.
Подобного можно добиться с помощью nginx. Nginx может выполнять завершение SSL, а затем передавать ваши запросы серверной части.
Есть ли у вас конкретное требование, чтобы пользователи 1-100 переходили на конкретный веб-сервер, или запросы могут распределяться равномерно? Я бы посоветовал их равномерно распределить. Поможет вам распространиться и тем самым снизит ваш риск.