SWIM - протокол построения кластера

Шпилевой Владислав

Презентация для Мегафона

План доклада

  1. Failure detection
  2. Gossip протоколы
  3. Протокол SWIM в Тарантуле
  4. Расширения SWIM
  5. Планы

Горизонтальное

масштабирование:

Tarantool VShard

Принятие решений

Вывод нерабочих узлов из кластера

Починка отказов

Failure detection

Классический Failure detection

узлов

сообщений в сети

O(N^2)
N

"Все со всеми" не работает

Gossip

узлов

сообщений в сети

O(N)
N

Протоколы "слухов", "инфекций"

Gossip

!

!

!

!

!

!

!

!

Распространяют событие все, а не один узел

Алгоритмы рандомизированы:

  • нет синхронизации;
  • нагрузка равномерна

Gossip. Применения

Lifeguard

SWIM

SWIM

Scalable

!

O(1)

Weakly-Consistent

!

!

!

!

!

!

O(log(N))

A

B

C

A

A

Infection-Style Process

!

!

!

!

Group Membership

D

E

H

G

F

A, B, C, D, E, F, G, H

A, B, C, D, E, F, G, H

A, B, C, D, E, F, G, H

A, B, C, D, E, F, G, H

A, B, C, D, E, F, G, H

A, B, C, D, E, F, G, H

A, B, C, D, E, F, G, H

Tarantool SWIM

Раунды

Адресация

UUID

URI1

URI2

URI3

Адрес можно менять

Heartbeat Rate

Модуль

Можно создавать много узлов

Конфигурируется почти все

Есть ручное управление таблицей узлов кластера

Можно обращаться к узлам

Асинхронная подписка на события

Аккуратный вывод из кластера с уведомлением всех

Случайное перемешивание

swim = require('swim')

s = swim.new([cfg])

s:cfg({heartbeat_rate = ..., ack_timeout = ...,
       gc_mode = ..., uri = ..., uuid = ...})

s:probe_member(uri)

s:add_member({uuid = ..., uri = ...})

s:remove_member(uuid)

s:broadcast([port])

s:size()

s:member_by_uuid(uuid)

s:pairs()

s:on_member_event(new_trigger[, old_trigger])

s:quit()

s:delete()

Расширения

swim = require('swim')
box.cfg{listen = 3336}
s = swim.new({uri = 3335, uuid = uuid2})
s:set_payload({
    tport = 3336,
    any_other_data = value
})
        

Payload

Надежная рассылка поверх UDP

Анти-энтропия

Чтобы не бояться UDP

Ping + Часть таблицы мемберов

Шифрование

Можно слать через открытую сеть

function on_event(m, event)
    if event:is_new_generation() then
        ...
    end
end
s:on_event(on_event)

Детектор перезапуска

Полный контроль жизненного цикла

Планы - Интеграция с репликацией

  • Raft для автосмены лидера кластера
  • Автосборка кластера из коробки
  • Обнаружение топологии кластера

Мегафон: SWIM - протокол построения кластера

By Vladislav Shpilevoy

Мегафон: SWIM - протокол построения кластера

SWIM - это протокол обнаружения и мониторинга узлов кластера, распространения событий и данных между ними. Протокол особенен своей легковесностью, децентрализованностью и независимостью скорости работы от размера кластера. В докладе рассказывается о том, как устроен протокол SWIM, как и с какими расширениями он реализован в Тарантуле.

  • 1,274