Идея циклического распределения
В схеме round-robin серверы образуют кольцо. Каждый новый запрос передаётся следующему серверу, а после последнего снова первому. Никакой информации о нагрузке и состоянии серверов алгоритм не использует.
Благодаря простоте схема хорошо работает, когда серверы одинаковы по мощности, а запросы примерно одинаковы по стоимости.
Остаток от деления как индекс
Если запросы пронумерованы с нуля, а серверы — от 0 до N − 1, то индекс сервера равен остатку от деления номера запроса n на число серверов N. Любое n однозначно представляется в виде n = N × q + r, где остаток r лежит между 0 и N − 1.
Для чисел от 0 до N − 1 остаток совпадает с самим числом, потом отсчёт начинается заново. Поэтому запросы 0, 7, 14, 21 на семи серверах всегда попадают на сервер с индексом 0.
Примеры распределения запросов
Запрос №1000 на семи серверах: 1000 = 7 × 142 + 6, остаток 6, сервер с индексом 6 (седьмой по счёту). Запрос №1001 попадёт на сервер 0.
На трёх серверах десять первых запросов распределятся так: 0, 1, 2, 0, 1, 2, 0, 1, 2, 0. Сервер 0 получит четыре запроса, остальные по три, потому что десять не делится на три нацело.
Нумерация с нуля и с единицы
Люди нумеруют серверы «первый, второй, третий», а в программах индексы начинаются с нуля. Если запрос и сервер удобнее считать с единицы, вычтите единицу из номера запроса перед расчётом и прибавьте её к результату.
Ошибка «на единицу» в этих вычислениях встречается особенно часто, поэтому заранее договоритесь, какая нумерация принята в вашей системе, и проверьте на нескольких первых запросах.
Слабые места схемы
Если запросы разной тяжести, один сервер может получать более дорогие запросы подряд, и нагрузка окажется неравномерной. Если сервер выйдет из строя, алгоритм должен исключить его из кольца, иначе запросы будут теряться.
При изменении числа серверов остаток меняется почти у всех номеров, поэтому для кэшей и сессий применяют согласованное хеширование, которое перераспределяет лишь часть запросов.
Практический пример распределения запросов
Допустим, пул состоит из пяти серверов, а запросы приходят с номерами от 0 до 99. Каждый сервер получит ровно 20 запросов, потому что 100 делится на 5 без остатка. Если же запросов 101 (номера от 0 до 100), нулевой сервер получит один лишний.
Такой подсчёт полезен при тестировании: можно заранее предсказать, какой сервер должен обработать контрольный запрос, и проверить правильность настроек балансировщика по журналу.
Границы страницы
Калькулятор считает идеальный порядок в пуле одинаковых серверов. Он не моделирует веса серверов, проверки доступности и привязку сессий и не заменяет настройки балансировщика.
Отрицательные номера запросов и нулевое число серверов лишены смысла и в расчёт не принимаются.
Формула расчёта
индекс = n mod N
Проверенные примеры
Пул из 7 серверов, нумерация с нуля. Какой сервер обработает запрос №1000?
1000 = 7 × 142 + 6, остаток 6, значит сервер с индексом 6.
Куда попадут запросы с номерами 0–9 при трёх серверах?
Индексы 0, 1, 2, 0, 1, 2, 0, 1, 2, 0: три сервера по очереди, десятый запрос снова на сервере 0.
Как пользоваться онлайн-калькулятором
- Введите порядковый номер запроса, начиная с нуля.
- Укажите число серверов в пуле.
- Нажмите «Вычислить» и получите индекс сервера от 0 до N − 1.
- Если нумерация серверов начинается с единицы, прибавьте единицу к результату.