Консенсус в распределённых вычислениях

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Консенсус в распределённых вычислениях — процесс согласования данных в распределённых вычислениях и многоагентных системах. Фундаментальной проблемой в распределённых вычислениях и многоагентных системах является достижение общей надёжности системы при наличии ряда ошибочных процессов. Это часто требует координации процессов или согласования некоторого значения данных, которое необходимо во время вычислений. Такой процесс принято называть достижением консенсуса[1].

Примеры достижения консенсуса включают согласование того, какие транзакции и в каком порядке следует фиксировать в базе данных, репликацию конечного автомата и атомарные широковещательные рассылки. Реальные приложения, часто требующие консенсуса, включают облачные вычисления, синхронизацию часов, PageRank, формирование мнений, интеллектуальные энергосистемы, оценку состояния, управление БПЛА или другими роботами, балансировку нагрузки, блокчейн и другие.

Описание проблемы[править | править код]

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

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

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

Прекращение (Termination)
В конце концов, каждый правильный процесс должен выдавать некоторое значение.
Целостность (Integrity)
Если все правильные процессы предлагают одно и то же значение , то процесс поиска консенсуса также должен выдавать то же значение.
Согласие (Agreement)
Правильный процесс должен согласовывать одно и то же значение.

Протокол, гарантирующий консенсус среди n процессов, из которых не более t терпит неудачу, называется t-устойчивым.

При оценке производительности консенсусных протоколов интерес представляют два фактора: время работы и сложность сообщения. Время выполнения задаётся в нотации Big O в количестве раундов обмена сообщениями как функция некоторых входных параметров (обычно количества процессов и/или размера входного домена). Сложность сообщения относится к объёму трафика сообщений, который генерируется протоколом. Другие факторы могут включать использование памяти и размер сообщений.

Модели вычислений[править | править код]

Различные модели вычислений могут определять «проблему консенсуса». Некоторые модели могут иметь дело с полносвязными графами, тогда как другие — с кольцами и деревьями. В некоторых моделях разрешена идентификация сообщений, тогда как в других процессы полностью анонимны. Модели общей памяти, в которых процессы взаимодействуют, обращаясь к объектам в общей памяти, также являются важной областью исследований.

Каналы связи с прямой или переносимой идентификацией[править | править код]

В большинстве моделей протокола связи участники общаются через идентифицированные каналы. Это означает, что сообщения не являются анонимными, и получатели знают источник каждого сообщения. Некоторые модели предполагают более сильную, переносимую форму идентификации, при которой каждое сообщение подписывается отправителем, так что получатель знает не только непосредственный источник каждого сообщения, но и участника, который его создал. Этот более строгий тип идентификации достигается с помощью цифровых подписей; при такой идентификации протоколы могут допускать большее количество ошибок[3].

Две разные модели идентификации часто называют моделями устного общения и письменного общения . В модели устного общения известен непосредственный источник информации, тогда как в более сильных моделях письменного общения получатель на каждом этапе узнает не только непосредственный источник сообщения, но и историю передачи сообщения[4].

Входы и выходы консенсуса[править | править код]

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

Частный случай проблемы консенсуса с одним значением, называемый бинарным консенсусом, ограничивает ввод и, следовательно, область вывода одной двоичной цифрой {0,1}. Хотя сами по себе бинарные протоколы консенсуса не очень полезны, они часто используются в качестве строительных блоков в более общих протоколах консенсуса, особенно для асинхронного консенсуса.

В многозначных согласованных протоколах, таких как Multi-Paxos и Raft, цель состоит в том, чтобы согласовать не просто одно значение, а ряд значений с течением времени, формируя постепенно растущую историю. В то время как многозначный консенсус может быть достигнут путем последовательного запуска нескольких итераций однозначного консенсусного протокола, многие оптимизации и другие соображения, такие как поддержка реконфигурации, могут сделать многозначные консенсусные протоколы более эффективными на практике.

Аварийный сбой и византийские отказы[править | править код]

Существует два типа сбоев, с которыми может столкнуться процесс: аварийный отказ (англ. Crash failure) и т.н. «византийский отказ». В первом случае процесс внезапно останавливается и не возобновляется. Византийские отказы — это отказы, при которых не налагается никаких условий. Например, они могут возникать в результате действий злоумышленника. Процесс, в котором произошел византийский отказ, может отправлять другим процессам противоречивые данные или может заснуть, а затем возобновить работу после длительной задержки. Из этих двух типов отказов византийские отказы гораздо более разрушительны.

Таким образом, консенсусный протокол, допускающий византийские отказы, должен быть устойчивым ко всем возможным ошибкам.

Более сильная версия консенсуса, допускающая византийские отказы, даётся усилением ограничения целостности:

Целостность
Если правильный процесс выдаёт значение , то это значение должно быть предложено каким-то правильным процессом.

Асинхронные и синхронные системы[править | править код]

Проблема консенсуса может рассматриваться в как для синхронных, так и асинхронных систем. Хотя в реальном мире зачастую процессы по своей природе асинхронны, более практично и часто проще моделировать синхронные системы[5].

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

Невозможность асинхронного детерминированного консенсуса[править | править код]

В полностью асинхронной распределённой системе с передачей сообщений, в которой по крайней мере один процесс может иметь аварийный сбой, в известной теореме FLP (Fischer, Lynch, and Paterson) было доказано, что детерминированный алгоритм для достижения консенсуса невозможен[6]. Этот невозможный результат вытекает из сценариев планирования наихудшего случая, которые вряд ли произойдут на практике, за исключением враждебных ситуаций, таких атака злоумышленник, атакующий. В большинстве обычных ситуаций планирование процессов имеет определённую степень естественной случайности[5].

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

Алгоритмы рандомизированного консенсуса могут обойти результат невозможности FLP, достигнув как безопасности, так и живучести с огромной вероятностью, даже при наихудших сценариях планирования, таких как интеллектуальный злоумышленник в сети[7].

Разрешённый и неразрешённый консенсус[править | править код]

Алгоритмы консенсуса традиционно предполагают, что набор участвующих узлов фиксирован и задан с самого начала: то есть, что какой-то предварительный (ручной или автоматический) процесс настройки определил известную группу участников, которые могут идентифицировать друг друга как членов группы. В отсутствие такой чётко определённой закрытой группы атака Сивиллы на группу с открытым консенсусом может обойти даже византийский алгоритм консенсуса, просто создав достаточно виртуальных участников, чтобы преодолеть порог отказоустойчивости.

Протокол консенсуса без определения группы, напротив, позволяет любому в сети динамически присоединяться и участвовать без предварительного разрешения, но вместо этого налагает форму искусственной стоимости или барьера для входа, чтобы уменьшить угрозу атаки Сивиллы. Биткойн представил первый протокол консенсуса без разрешений, использующий доказательство работы и функцию корректировки сложности, в которой участники соревнуются в решении криптографических хэш-головоломок и вероятностно зарабатывают право на фиксацию блоков и получают соответствующие вознаграждения пропорционально их вложенным вычислительным усилиям. Частично мотивированные высокими затратами энергии на этот подход, последующие протоколы консенсуса без разрешений предложили или приняли другие правила участия для защиты от атак Сивиллы, такие как доказательство доли, доказательство пространства и доказательство полномочий.

Примеры протоколов консенсуса[править | править код]

В распределённых и облачных вычислительных системах широко используется алгоритм консенсуса Paxos Лесли Лэмпорта и его варианты, такие как Raft. Эти алгоритмы, как правило, синхронны, зависят от избранного лидера для достижения прогресса и допускают отказы (crashes), но не византийские сбои (Byzantine failures).

Примером бинарного протокола консенсуса с полиномиальным временем, допускающего византийские сбои, является алгоритм Phase King Гарая и Бермана[8]. Алгоритм достигает консенсуса в модели синхронной передачи сообщений с n процессами и f сбоями при условии n > 4 f .

Google реализовал распределенную библиотеку сервиса блокировки под названием Chubby[9]. Chubby хранит информацию о блокировках в небольших файлах, которые, в свою очередь, хранятся в реплицированной базе данных, что обеспечивает восстановление в случае сбоев. База данных реализована на основе отказоустойчивого уровня журнала, основанного на алгоритме консенсуса Paxos . В этой схеме клиенты Chubby взаимодействуют с мастером Paxos для доступа/обновления реплицированного журнала[10].

Другой хорошо известный подход называется алгоритмами типа MSR, которые широко используются от компьютерных наук до теории управления[11][12][13].

Source Synchrony Authentication Threshold Rounds Notes
Pease-Shostak-Lamport [14] Synchronous Oral total communication
Pease-Shostak-Lamport [14] Synchronous Written total communication
Ben-Or Asynchronous Oral (expected) expected rounds when
Dolev et al.[15] Synchronous Oral total communication
Dolev-Strong [3] Synchronous Written total communication
Dolev-Strong [3] Synchronous Written total communication
Feldman-Micali Synchronous Oral (expected)
Katz-Koo Synchronous Written (expected) Requires PKI
PBFT [16] Asynchronous (safety)-- Synchronous (liveness) Oral
HoneyBadger [17] Asynchronous Oral (expected) per tx communication - requires public-key encryption
Abraham et al.[18] Synchronous Written
Byzantine Agreement Made Trivial [19] Synchronous Signatures (expected) Requires digital signatures

Биткойн использует доказательство работы, функцию регулировки сложности и функцию реорганизации для достижения консенсуса без разрешения в своей открытой одноранговой сети. Чтобы расширить блокчейн или распределённый реестр биткойна, майнеры пытаются решить криптографическую головоломку, где вероятность нахождения решения пропорциональна вычислительным усилиям, затрачиваемым на хеши в секунду. Узел, который первым решает такую головоломку, предлагает свою версию следующего блока транзакций, добавленную в реестр и в конечном итоге принятую всеми другими узлами. Поскольку любой узел в сети может попытаться решить проблему проверки работоспособности, атака Сивиллы в принципе невозможна, если только злоумышленник не владеет более 50% вычислительных ресурсов сети.

Другие криптовалюты (NEO, STRATIS и др.) используют доказательство доли, в котором узлы соревнуются за добавление блоков и зарабатывают соответствующие вознаграждения пропорционально доле или объему криптовалюты, выделенной, зарезервированной или находящейся во владении (staked) на некоторый момент времени. Одним из преимуществ «доказательства доли» перед системой «доказательства работы» является высокое потребление энергии, требуемое последней. Например, майнинг биткойнов, по оценкам 2018 года, потреблял энергию, сравнимую с потреблением таких стран как Чехия или Иордании[20].

Число консенсуса[править | править код]

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

Число консенсуса параллельного объекта определяется как максимальное количество процессов в системе, которые могут достичь консенсуса данным объектом в реализации без ожидания[21]. Объекты с консенсусным числом могут реализовать любой объект с консенсусным числом или ниже, но не могут реализовать какие-либо объекты с более высоким числом консенсуса. Консенсусные числа образуют то, что называется иерархией объектов синхронизации Херлихи[22].

Число консенсуса Объекты
атомарные регистры чтения/записи, блокировки
test-and-set, swap, fetch-and-add, очередь без ожидания или стек
. . . . . .
назначение n-регистров
. . . . . .
compare-and-swap, load-link/store-conditional[23], перемещение и обмен из памяти в память, очередь с операцией просмотра, fetch&cons, липкий байт

Согласно иерархии, регистры чтения/записи не могут обеспечить консенсус даже в системе с двумя процессами. Структуры данных, такие как стеки и очереди, могут обеспечить консенсус только между двумя процессами. Однако некоторые параллельные объекты являются универсальными (обозначены в таблице значком ), что означает, что они могут достичь консенсуса между любым количеством процессов и могут имитировать любые другие объекты с помощью последовательности операций[21].

Примечания[править | править код]

  1. Генкин, Михеев, 2023, с. 11.
  2. Coulouris, George; Jean Dollimore; Tim Kindberg (2001), Distributed Systems: Concepts and Design (3rd Edition), Addison-Wesley, p. 452, ISBN 978-0201-61918-8
  3. 1 2 3 Dolev, D. (1983). "Authenticated algorithms for Byzantine agreement". SIAM Journal on Computing. 12 (4): 656—666. doi:10.1137/0212045.
  4. Gong, Li (1995). "Byzantine Agreement with authentication". Dependable Computing for Critical Applications. 10. Архивировано 5 января 2020. Дата обращения: 16 февраля 2023.
  5. 1 2 Aguilera, M. K. Stumbling over Consensus Research: Misunderstandings and Issues // Replication. — 2010. — Vol. 5959. — P. 59–72. — ISBN 978-3-642-11293-5. — doi:10.1007/978-3-642-11294-2_4.
  6. Fischer, M. J. (1985). "Impossibility of distributed consensus with one faulty process" (PDF). Journal of the ACM. 32 (2): 374—382. doi:10.1145/3149.214121. Архивировано (PDF) 30 января 2023. Дата обращения: 16 февраля 2023.
  7. Aspnes, James (May 1993). "Time- and Space-Efficient Randomized Consensus". Journal of Algorithms. 14: 414—431. doi:10.1006/jagm.1993.1022. Архивировано 16 февраля 2023. Дата обращения: 16 февраля 2023.
  8. Berman, Piotr (1993). "Cloture Votes: n/4-resilient Distributed Consensus in t + 1 rounds". Theory of Computing Systems. 26: 3—19. doi:10.1007/BF01187072.
  9. Источник (PDF). Архивировано (PDF) 14 декабря 2009. Дата обращения: 16 февраля 2023.
  10. Источник (PDF). Архивировано (PDF) 12 декабря 2014. Дата обращения: 16 февраля 2023.
  11. LeBlanc, Heath J. (April 2013). "Resilient Asymptotic Consensus in Robust Networks". IEEE Journal on Selected Areas in Communications. 31 (4): 766—781. CiteSeerX 10.1.1.310.5354. doi:10.1109/JSAC.2013.130413.
  12. Dibaji, S. M. (May 2015). "Consensus of second-order multi-agent systems in the presence of locally bounded faults". Systems & Control Letters. 79: 23—29. doi:10.1016/j.sysconle.2015.02.005.
  13. Dibaji, S. M. (July 2017). "Resilient consensus of second-order agent networks: Asynchronous update rules with delays". Automatica. 81: 123—132. arXiv:1701.03430. Bibcode:2017arXiv170103430M. doi:10.1016/j.automatica.2017.03.008.
  14. 1 2 Lamport, L. (1982). "The Byzantine Generals Problem" (PDF). ACM Transactions on Programming Languages and Systems. 4 (3): 382—401. CiteSeerX 10.1.1.64.2312. doi:10.1145/357172.357176. Архивировано (PDF) 7 февраля 2017. Дата обращения: 16 февраля 2023.
  15. Dolev, Danny (1982). "An Efficient Algorithm for Byzantine Agreement without Authentication". Information and Control. 52 (3): 257—274. doi:10.1016/S0019-9958(82)90776-8.
  16. Источник (PDF). Архивировано (PDF) 4 марта 2018. Дата обращения: 16 февраля 2023.
  17. Источник. Архивировано 16 февраля 2023. Дата обращения: 16 февраля 2023.
  18. Источник (Technical report). Архивировано 16 февраля 2023. Дата обращения: 16 февраля 2023.
  19. Micali. Byzantine agreement made trivial (2018). Дата обращения: 16 февраля 2023. Архивировано 7 декабря 2022 года.
  20. Irfan. Bitcoin is an energy hog. Where is all that electricity coming from? Vox (18 июня 2019). Дата обращения: 16 февраля 2023. Архивировано 16 февраля 2023 года.
  21. 1 2 Herlihy. Wait-Free Synchronization. Дата обращения: 19 декабря 2011. Архивировано 5 июня 2011 года.
  22. Imbs, Damien (25 July 2010). "The multiplicative power of consensus numbers" (PDF). Proceedings of the 29th ACM SIGACT-SIGOPS Symposium on Principles of Distributed Computing. Association for Computing Machinery: 26—35. doi:10.1145/1835698.1835705. ISBN 9781605588889. Архивировано (PDF) 27 января 2022. Дата обращения: 22 апреля 2021.
  23. Fich, Faith (25 July 2004). "On the inherent weakness of conditional synchronization primitives". Proceedings of the Twenty-Third Annual ACM Symposium on Principles of Distributed Computing. Association for Computing Machinery: 80—87. CiteSeerX 10.1.1.96.9340. doi:10.1145/1011767.1011780. ISBN 1581138024.

Литература[править | править код]

  • Артем Генкин, Алексей Михеев. Блокчейн для всех. Как работают криптовалюты, BaaS, NFT, DeFi и другие новые финансовые технологии.. — Альпина Паблишер, 2023. — 588 с. — ISBN 978-5-9614-8046-7..