67 lines
7.6 KiB
Markdown
67 lines
7.6 KiB
Markdown
# Семинар 4. Групповые взаимодействия
|
||
|
||
На семинаре закрепим материал лекции через демонстрацию IP multicast, разбор историй отказов, работу с причинным буфером и эксперименты с gossip. Будем различать получение сетевого сообщения и его доставку приложению, проверять гарантии рассылки и сравнивать стоимость распространения информации.
|
||
|
||
## Подготовка и участие
|
||
|
||
Для самостоятельных экспериментов заранее выполните [инструкции по подготовке gossip](gossip/readme.md#подготовка) и проверьте запуск `distsys-gossip -h`. Если окружение не готово, можно участвовать в разборе демонстрации и подготовленных журналов: предсказывать результат, находить нужные показатели и объяснять наблюдения.
|
||
|
||
## 1. IP multicast: доставка сетевых сообщений
|
||
|
||
Проследим путь сообщения от отправителя к нескольким получателям в [примере с контейнерами](ip_multicast/readme.md). Найдём в коде адрес группы, присоединение получателя и отправку датаграммы.
|
||
|
||
Затем отключим одного получателя, отправим сообщение и вернём его в группу. Перед запуском предположим, кто увидит каждое сообщение, а после сравним прогноз с журналом.
|
||
|
||
Обсудим, восстанавливаются ли пропущенные сообщения и какие механизмы понадобились бы для этого. Свяжем наблюдение с различием между сетевым получением и доставкой приложению.
|
||
|
||
## 2. Надёжная рассылка: обязательства при отказах
|
||
|
||
Разберём свойства Validity, No Duplication, No Creation, Agreement и Uniform Agreement на историях с остановкой процессов. В каждой истории сначала определим, какие процессы корректны, затем проверим обязательства по доставке.
|
||
|
||
Основные вопросы:
|
||
|
||
- Что меняется, если отправитель падает посреди рассылки?
|
||
- Обязаны ли остальные корректные процессы доставить сообщение, если получатель уже доставил его, а затем упал?
|
||
- Почему перед вызовом `deliver` может потребоваться дождаться, пока сообщение сохранится у других процессов?
|
||
|
||
Сравним BEB, RB и URB и обсудим роль корректного большинства.
|
||
|
||
## 3. Порядок доставки: зависимости и буфер
|
||
|
||
На примерах последовательных сообщений и ответа в чате различим FIFO и Causal Order. Построим зависимости между сообщениями, полученными в перемешанном порядке, и пошагово разберём буфер доставки.
|
||
|
||
Для каждого сообщения определим, выполнены ли его зависимости и как доставка изменяет состояние получателя. Проверим, почему после одной доставки нужно снова просмотреть буфер и когда допустимы разные последовательности доставок.
|
||
|
||
В завершение обсудим пример независимых операций, для которых причинного порядка недостаточно, чтобы реплики получили одинаковый результат, и роль Total Order.
|
||
|
||
## 4. Gossip: скорость, трафик и остановка
|
||
|
||
В [лабораторной работе](gossip/readme.md) сравним push, pull и push-pull с одинаковыми параметрами. Перед каждым экспериментом сформулируем прогноз, затем сопоставим его с результатом.
|
||
|
||
- Измерим время полного охвата и число сетевых сообщений.
|
||
- Изменим fanout и вероятность потерь, сохраняя остальные параметры.
|
||
- Сравним полный охват с прекращением периодических обменов.
|
||
- Разберём, почему `-q` останавливает симулятор, а `STOPPED` у процесса не означает его отказ.
|
||
|
||
Объясним наблюдения через действия узлов и ограничения модели. Результат одного запуска используем как конкретный пример; для проверки общего вывода повторим эксперимент с другими seed.
|
||
|
||
## Дополнительные материалы
|
||
|
||
### IP multicast
|
||
|
||
- [Адреса multicast](https://en.wikipedia.org/wiki/Multicast_address), [IGMP](https://linkmeup.gitbook.io/sdsm/9.-multicast/1.-igmp) и [подробный разбор multicast](https://linkmeup.gitbook.io/sdsm/9.-multicast).
|
||
- [Работа с multicast в Python](https://pymotw.com/3/socket/multicast.html).
|
||
- Примеры применения: [zeroconf](https://en.wikipedia.org/wiki/Zero-configuration_networking), [multicast DNS](https://en.wikipedia.org/wiki/Multicast_DNS), [multicast NTP](https://www.oreilly.com/library/view/cisco-ios-cookbook/0596527225/ch14s11.html), [обнаружение узлов в Apache Ignite](https://ignite.apache.org/docs/latest/clustering/tcp-ip-discovery).
|
||
|
||
### Надёжность и порядок
|
||
|
||
- [Отношение happens-before](https://en.wikipedia.org/wiki/Happened-before).
|
||
- [Конспект курса Distributed Systems](https://www.cl.cam.ac.uk/teaching/2021/ConcDisSys/dist-sys-notes.pdf), разделы 3 и 4.
|
||
|
||
### Gossip и его применения
|
||
|
||
- [Визуализация распространения информации](https://flopezluis.github.io/gossip-simulator/).
|
||
- Обнаружение узлов и сведения о составе группы: [Consul](https://developer.hashicorp.com/consul/docs/architecture/gossip), [обсуждение Serf, memberlist и SWIM](https://www.hashicorp.com/resources/everybody-talks-gossip-serf-memberlist-raft-swim-hashicorp-consul), [Cassandra](https://docs.datastax.com/en/cassandra-oss/3.x/cassandra/architecture/archGossipAbout.html).
|
||
- [Gossip в Hyperledger Fabric](https://hyperledger-fabric.readthedocs.io/en/latest/gossip.html).
|
||
- Распространение блоков и транзакций Bitcoin: [обзор P2P-сети](https://nakamoto.com/bitcoins-p2p-network/), [статья](https://arxiv.org/pdf/1703.08761.pdf), [видеоматериалы](https://www.dsn.kastel.kit.edu/bitcoin/videos.html).
|