<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://www.wikicshse.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D0%BE%D1%82%D0%BA%D0%B0%D0%B7%D0%BE%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D1%8B%D1%85_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC</id>
	<title>Теория отказоустойчивых распределенных систем - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://www.wikicshse.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D0%BE%D1%82%D0%BA%D0%B0%D0%B7%D0%BE%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D1%8B%D1%85_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC"/>
	<link rel="alternate" type="text/html" href="https://www.wikicshse.ru/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D0%BE%D1%82%D0%BA%D0%B0%D0%B7%D0%BE%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D1%8B%D1%85_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC&amp;action=history"/>
	<updated>2026-06-06T13:55:48Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://www.wikicshse.ru/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D0%BE%D1%82%D0%BA%D0%B0%D0%B7%D0%BE%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D1%8B%D1%85_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC&amp;diff=1695&amp;oldid=prev</id>
		<title>imported&gt;M8hew: Migrated current public revision from wiki.cs.hse.ru</title>
		<link rel="alternate" type="text/html" href="https://www.wikicshse.ru/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D0%BE%D1%82%D0%BA%D0%B0%D0%B7%D0%BE%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D1%8B%D1%85_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC&amp;diff=1695&amp;oldid=prev"/>
		<updated>2024-12-16T08:22:52Z</updated>

		<summary type="html">&lt;p&gt;Migrated current public revision from wiki.cs.hse.ru&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Теория отказоустойчивых распределенных систем ==&lt;br /&gt;
&lt;br /&gt;
Обязательный осенний курс для студентов 4 курса специализации РС ПМИ ФКН ВШЭ.&lt;br /&gt;
&lt;br /&gt;
Занятия проводятся онлайн по субботам c 9.30 в [https://us06web.zoom.us/j/9624371278?pwd=WEN6a2hvaU9pR0xpalY2T3JHV0QwUT09 zoom]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Лектор&amp;#039;&amp;#039;&amp;#039;: Алексей Неганов aka [https://t.me/bokareis @bokareis].&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Записи пар&amp;#039;&amp;#039;&amp;#039;: [https://disk.yandex.ru/d/sbYrPpVALsUsgw тут]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Текущая ведомость&amp;#039;&amp;#039;&amp;#039;: TBD&lt;br /&gt;
&lt;br /&gt;
== Формула оценки == &lt;br /&gt;
&lt;br /&gt;
Оценка за курс ставиться по следующей формуле (О&amp;lt;sub&amp;gt;Дз1&amp;lt;/sub&amp;gt; + О&amp;lt;sub&amp;gt;Дз2&amp;lt;/sub&amp;gt; + О&amp;lt;sub&amp;gt;Дз3&amp;lt;/sub&amp;gt; + О&amp;lt;sub&amp;gt;Экз&amp;lt;/sub&amp;gt;)*4/3, где максимальная отметка &lt;br /&gt;
* за Дз1 1 балл&lt;br /&gt;
* за Дз2 3 балла&lt;br /&gt;
* за Дз3 2 балла&lt;br /&gt;
* за Экз 2 балла&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Задание 1&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Напишите систему, вычисляющую интеграл от некоторой функции.&lt;br /&gt;
&lt;br /&gt;
Мастер (клиент) находит рабочие узлы (сервера) через IP broadcast(через UDP) — рассылает стартовое сообщение по всем адресам подсети, на которое рабочие узлы, слушающие на своих TCP портах чтобы принять запрос от мастера уже после того, как он их нашёл и знает, куда стучаться отвечают. Затем каждому рабочему узлу даётся отрезок, он вычисляет на нём интеграл и отправляет ответ мастеру. Мастер складывает ответы серверов и получает итоговый результат.&lt;br /&gt;
&lt;br /&gt;
Требования:&lt;br /&gt;
* если после раздачи заданий сервера становятся недоступны (выключаются / происходит разрыв сети), но хотя бы один сервер доступен, программа это детектирует, раздаёт работу доступным серверам вместо отключившихся и даёт верный ответ&lt;br /&gt;
* если недоступный сервер снова появляется в сети и пытается послать ответ, это не приводит к ошибке, в частности, результат по соотв. отрезку не будет учтён дважды&lt;br /&gt;
* если недоступный сервер появился в сети, мастер должен уметь присылать на него новые задачи (например, отключился какой-то ещё сервер)&lt;br /&gt;
&lt;br /&gt;
Задачу прошу сделать на чистом С, пользуясь API сетевых сокетов. Лучше всего на UNIX-like системе, хотя на Windows в общем сокеты похожие.&lt;br /&gt;
&lt;br /&gt;
Обязательно показать работу программы с полной / частичной потерей пакетов, дублированием, задержками. Рекомендую утилиту tc или iptables.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Литература:&amp;#039;&amp;#039;&lt;br /&gt;
* Стивенс У. Р. &amp;quot;Разработка сетевых приложений&amp;quot;, гл. 2, 3, 4, 5, 7&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Deadline: 24 ноября 23:00&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Задание 2&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Вы имитируете базу данных с репликами. Клиент отправляет данные на master сервера, с мастера данные реплицируются на другие узлы. Чтение распределяется равномерно по всем репликам (т. е. запрос клиента на чтение обслуживается не мастером, а какой-то репликой).  При потере мастера реплики должны проголосовать и выбрать нового мастера среди живых узлов, используя протокол консенсуса (Raft).&lt;br /&gt;
&lt;br /&gt;
Если мастер оживает и на нём есть какие-то несинхронизованные данные, то они должны обработаться разумным образом, а бывший мастер — стать одной из реплик.&amp;lt;br&amp;gt;&lt;br /&gt;
Отдельным пунктом — реализация линеаризуемого атомарный CAS&lt;br /&gt;
&lt;br /&gt;
# Система должна выполнять CRUD операции — create/read/update/delete&lt;br /&gt;
# При чтениях не надо данные от реплики прокачивать через мастер, данные должны идти с реплики на клиента. Для этого мастер может отвечать, например, 302 Found и давать заголовок Location с адресом реплики&lt;br /&gt;
# Учитывайте семантику методов HTTP — PUT идемпотентный (и требует ID ресурса в запросе), POST — неидемпотентный, PATCH позволяет обновить ресурс частично и зависит от текущего состояния&lt;br /&gt;
# Максимальное количество реплик фиксированное.&lt;br /&gt;
&lt;br /&gt;
Задачу предпочтительнее решать на Go, Python. Допустимо на C++, C#, Java&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Deadline: 15 декабря 23:00&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Задание 3&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Нужно реализовать operation-based conflict-free replicated data type как map ключ -&amp;gt; значение, last writer wins. (Last-Write-Wins-Element-Set).  Обеспечить reliable broadcast with causal order, нельзя просто брать физические timestamps с разных реплик для определения, кто более свежий. Например, если на реплике А добавили значение, она синхронизовала это с репликой B, потом на реплике B значение удалили, то по локальному физическому времени реплики A добавление значения может быть &amp;quot;позже&amp;quot; удаления на реплике B по её локальному времени, хотя событие создания было причиной события удаления — не попадитесь в эту ловушку!&lt;br /&gt;
&lt;br /&gt;
Каждая реплика будет отдельным HTTP сервером, который позволит менять поля в множестве через запрос PATCH, в котором будет передаваться изменяемое подмножество полей как JSON. Реплики должны при наличии соединения между собой синхронизовывать состояние, при отсутствии соединения — работать автономно.&lt;br /&gt;
&lt;br /&gt;
Система должна обладать свойством strong eventual consistency.&lt;br /&gt;
&lt;br /&gt;
Вопросы:&lt;br /&gt;
- физическое и логическое время&lt;br /&gt;
- happens before, соисполняемость&lt;br /&gt;
- broadcast и в частности causal broadcast&lt;br /&gt;
- CRDT&lt;br /&gt;
- CAP теорема, линеаризуемость, eventual consistency, strong eventual consistency&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Deadline: 18 декабря 23:00&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Программа экзамена ==&lt;br /&gt;
&lt;br /&gt;
1.  Понятие распределённой системы.&lt;br /&gt;
&lt;br /&gt;
Понятие распределённой системы и основные свойства таких систем. Применение распределённых систем для решения прикладных задач. Клиент-серверная модель. Удалённый вызов процедур.&lt;br /&gt;
&lt;br /&gt;
2.  Модели распределённых систем.&lt;br /&gt;
&lt;br /&gt;
Модели сети: синхронная, асинхронная, частично синхронная. Модели сбоев: аварийные отказы, аварийные отказы с восстановлением, византийские отказы. Задачи о двух генералах и о византийских генералах.&lt;br /&gt;
&lt;br /&gt;
3.  Часы и упорядочивание событий.&lt;br /&gt;
&lt;br /&gt;
Физические часы и проблема монотонности календарного времени. Проблема рассинхронизации физических часов. Протокол NTP. Отношение предшествования между событиями (happens before). Логические часы: часы Лампорта, векторные часы.&lt;br /&gt;
&lt;br /&gt;
4.  Основы сетевых протоколов.&lt;br /&gt;
&lt;br /&gt;
Основные принципы работы Интернета. Протокол IP и IP-адресация, NAT. Транспортные протоколы TCP и UDP. Работа с сетевыми сокетами в UNIX-системах на языке C.&lt;br /&gt;
&lt;br /&gt;
5.  Сетевые протоколы уровня приложения.&lt;br /&gt;
&lt;br /&gt;
HTTP версий 1, 2 и 3. Построение REST API для удалённого вызова процедур. Шифрование канала с помощью TLS.&lt;br /&gt;
&lt;br /&gt;
6.  Алгоритмы множественной рассылки сообщений (broadcast).&lt;br /&gt;
&lt;br /&gt;
Надёжная и ненадёжная рассылка сообщений. Эпидемические (gossip) протоколы рассылки.&lt;br /&gt;
Гарантии на порядок доставки: доставка в порядке отправки (FIFO order), в порядке причинно-следственной связи между событиями (causal order), в одинаковом для всех получателей порядке (total order), в порядке отправки и одинаково для всех получателей (FIFO total order). Требования к сообщениям и их взаимосвязь с гарантиями на порядок доставки: идемпотентность, коммутативность, коммутативность одновременных.&lt;br /&gt;
&lt;br /&gt;
7.  Репликация&lt;br /&gt;
&lt;br /&gt;
Понятие о репликации. Устойчивость к сбоям. Репликация с лидером и без лидера. Метод конечного автомата. Кворум. Согласованность в смысле чтения после записи, в смысле линеаризуемости чтения и записи, в смысле линеаризуемости атомарной операции «сравнить и записать». CAP-теорема. Согласованность в конечном счёте, сильная согласованность в конечном счёте.&lt;br /&gt;
&lt;br /&gt;
8.  Задача консенсуса и протоколы достижения консенсуса.&lt;br /&gt;
Задача консенсуса и число консенсуса. FLP-теорема. Выборы лидера в системе с репликацией. Алгоритмы Paxos и Raft.&lt;br /&gt;
&lt;br /&gt;
9.  Распределённые транзакции.&lt;br /&gt;
&lt;br /&gt;
Понятие атомарной транзакции. Изоляция транзакций.  Атомарная фиксация транзакций (commit), протокол двухфазной фиксации.&lt;br /&gt;
&lt;br /&gt;
10.  Совместное редактирование документов.&lt;br /&gt;
&lt;br /&gt;
Понятие бесконфликтного реплицируемого типа данных (conflict-free replicated data type). Разрешение конфликтов с применением логических часов, с частичными обновлениями и с полным состоянием. Операциональное преобразование. Разрешение конфликтов при совместном редактировании текстовых документов.&lt;br /&gt;
&lt;br /&gt;
11.  Византийские протоколы.&lt;br /&gt;
&lt;br /&gt;
Алгоритмы для достижения контенсуса в системах с византийскими сбоями. Атака Сивиллы и методы защиты: proof of work, proof of stake.&lt;/div&gt;</summary>
		<author><name>imported&gt;M8hew</name></author>
	</entry>
</feed>