Как мне распределить нагрузку по кластеру, используя Erlang?

StackOverflow https://stackoverflow.com/questions/662131

  •  20-08-2019
  •  | 
  •  

Вопрос

Я смотрел на модули рабов/бассейн, и это похоже на то, что я хочу, но также кажется, что у меня есть одна точка отказа в моем приложении (если мастер -узел уходит вниз).

У клиента есть список шлюзов (ради запасного, - все это делают то же самое), которые принимают соединения, а один из них выбирается случайным образом клиентом.Когда клиент подключает все узлы, изучаются, чтобы увидеть, что имеет наименьшую нагрузку, а затем IP на наименее загруженном сервере перенаправляется обратно в клиент.Затем клиент подключается к этому серверу, и все там выполняется.

Таким образом, я хочу, чтобы все узлы действовали как как шлюзы и фактически обрабатывать запросы клиентов.Балансировка нагрузки осуществляется только тогда, когда клиент изначально подключается - все фактические пакеты и обрабатываются на узеле «Домашнего» клиента.

Как бы я это сделал?

Это было полезно?

Решение

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

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

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

Просто измерьте (или вычислите) производительность вашего узла и установите вероятность выбора узла в зависимости от этого.Выбирайте узел случайным образом, независимо от текущей нагрузки.Используйте это как начальный подход.Когда вы его настроите, то можете попробовать составить какой-нибудь более сложный алгоритм.Могу поспорить, что победить этот первоначальный подход будет очень сложно.Поверьте, это очень тяжело.

Редактировать:Чтобы быть более ясным в одной тонкой детали, я настоятельно утверждаю, что вы не можете предсказать будущую нагрузку на основе текущей и исторической загрузки, но вы должны использовать знания о вероятности длительности задач и текущей декомпозиции времени жизни задачи.Эту работу так трудно попытаться достичь.

Другие советы

Целью дерева надзора является управление процессами, не обязательно пересылающими запросы.Нет причин, по которым вы не могли бы использовать другой код для отправки запросов непосредственно членам списка доступных процессов.См. функции пул:get_nodes или пул:get_node(), чтобы узнать об одном из способов получения этих списков.

Вы можете позволить модулю пула управлять процессами (перезапуск, мониторинг и завершение обработки) и использовать какой-либо другой модуль для прозрачного перенаправления запросов в пул процессов.Может быть, вы искали распределенные пулы?В erlang будет сложно уйти от главного процесса, не обращаясь к распределенным узлам.Вся работающая система представляет собой по сути одно большое дерево контроля.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top