2016-11-24 4 views
2

Я разрабатываю распределенную систему, состоящую из главных и рабочих серверов. Там должно быть 2 вида сообщений:Протокол связи

Heartbeat

Мастер получает состояние работника и немедленно реагировать с соответствующей командой. Например:

  1. Сообщение от Работник к Мастер: "Эй, там у меня есть данные, а, б, в"
  2. Ответ Мастер к Worker: «Все в порядке, но выбрасывать с - нам не нужно больше этого»

участники обмениваются эти сообщения с интервалом Т.

Прямая командная команда

Скажем, клиент просит владельца убить задание № 123. Вот разговор:

  1. Сообщение от Мастер к Рабочий: "Alarm! Мы должны убить работу # 123"
  2. Сообщение от Работник к Мастер: «Нет проблем Готово. "

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


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

Есть ли какое-либо решение для этих ограничений?

+1

Первое сообщение на самом деле не является «биением сердца». Сообщение «heartbeat» - это не что иное, как сообщение «Я все еще жив», и ответ на этот вопрос «Хорошо, я тоже». Это немного сложнее, чем это, потому что, если мастер не получает сердцебиение от работника за какое-то время, как он может знать, что это «рабочий», который ушел, а не сетевое сетевое соединение, которое не работает? –

+0

@Someprogrammerdude вы правы термин «сердцебиение» неверен. Я использую его из этой статьи http://static.googleusercontent.com/media/research.google.com/ru//archive/gfs-sosp2003.pdf (мой основанный на этом хобби проект) – kirugan

+0

Бит путать. «Предположим, клиент просит хозяина убить работу № 123. Вот разговор:« Тогда почему Учитель говорит «Тревога! Нам нужно убить работу № 123» и клиент «Нет проблем! Готово»? – Prabhu

ответ

0

Прежде всего, вы должны сделать бухгалтерия где-то. В противном случае, кто поймет, что рабочий умер? Естественное место для размещения этих данных на главном компьютере, если вы строите основную/рабочую систему. В противном случае рабочих можно было бы просить отслеживать друг друга в длинном круге или рандомизированном графике. Если работник замечает, что их accountabilibuddy больше не отвечает, он может предупредить мастера.

То же самое относится к списку текущих рабочих мест; кто это отслеживает? Он также масштабирует O (n), поэтому, по-видимому, у мастера нет места для этого. Остановка данных данных среди рабочих (например,путем отслеживания того, что должно делать их accountabilibuddy) работает только до сих пор; если a и b сбоев, а a - единственный, кто ищет после b, вы просто потеряли список заданий, запущенных на b (и, возможно, предупреждение, которое должно было уведомить вас, что b разбился).

Я бы рекомендовал распределенный консенсусный алгоритм для такого рода задач. Для производства используйте то, что уже написал кто-то еще; они, вероятно, знают, что делают. Если это для учебных целей, которые, как я полагаю, посмотрите на raft consensus algorithm. Это не слишком сложно понять, но все же подчеркивает большую сложность распределенных систем. Симулятор - золото для правильного понимания.

Система управления/работника никогда не будет должным образом работать с менее чем O(n) ресурсов для n работников перед лицом крушения рабочих. По определению, мастер должен контролировать рабочих, что является заданием O(n), даже если некоторые рабочие управляют другими работниками. Также, что произойдет, если мастер сработает?

0

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

Вам необходимо сохранить списки участников и идентификаторы мастеров на всех узлах.

Плот - это пульс, отправляемый на конец мастера, это не очень дорогая сеть, поэтому вам не нужно их открывать. Каждые 200 мс в секунду вам нужно послать пульс, если они не ответят назад. Мастер сообщает, что подчиненные устройства удаляют элемент x из списка.

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

Если вы хотите присоединиться к существующему кластеру в основном так же, как и выше, если лидер не отвечает лидера с адресом лидеров.