Получить количество узлов в распределенной системе

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

В настоящее время я использую централизованный сервер для подсчета количества узлов. Каждый узел взаимодействует с этим сервером. Это очень неэффективно и нарушает распределенное поведение.

Есть ли способ сделать это распределенным способом без использования централизованного сервера?


person Sampath Liyanage    schedule 25.03.2015    source источник


Ответы (1)


Если вам нужно только приблизительное количество узлов в системе, и вы хотите распределить это количество по всему кластеру, а не хранить его в базе данных, протоколы сплетен — это легкий и эффективный метод для обмена этим типом состояния между серверы.

http://en.m.wikipedia.org/wiki/Gossip_protocol

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

Вы можете расширить этот подход и использовать логические часы, такие как часы Лампорта или векторные часы для разрешения конфликтов, по сути, путем управления версиями обновлений. Например, если узел A получает счетчик серверов от узла B, версия которого равна 10, а затем получает счетчик от узла C, версия которого равна 8, узел A просто игнорирует обновление от узла C, поскольку его состояние в последний раз обновлялось в более ранней логической точке. время, чем узел B. Это улучшает согласованность количества серверов, не позволяя серверам с «устаревшим» представлением кластера перезаписывать обновления с более «современных» серверов.

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

person kuujo    schedule 25.03.2015