Зачем нам нужен полный порядок изменений представлений в консенсусных протоколах?

В своей знаменитой статье Мигель Кастро и Барбара Лисков Обоснуйте фазу фиксации протокола консенсуса PBFT следующим образом:

Это гарантирует, что реплики согласовывают общий порядок запросов в одном и том же представлении, но этого недостаточно для обеспечения общего порядка запросов при изменении представления. Реплики могут собирать подготовленные сертификаты в разных представлениях с одним и тем же порядковым номером и разными запросами. Фаза фиксации решает эту проблему следующим образом. Каждая реплика i выполняет многоадресную рассылку ‹COMMIT, v, n, i› _ {α_i}, говоря, что у нее есть подготовленный сертификат, и добавляет это сообщение в свой журнал. Затем каждая реплика собирает сообщения до тех пор, пока не получит сертификат кворума с 2 сообщениями f + 1 COMMIT для одного и того же порядкового номера n, и просматривает v из разных реплик (включая себя). Мы называем этот сертификат подтвержденным сертификатом и говорим, что запрос фиксируется репликой, когда у нее есть как подготовленные, так и подтвержденные сертификаты.

Но почему именно нам нужно гарантировать полный порядок изменений представления? Если лидер / первичная реплика выйдет из строя и вызовет изменение представления, разве не будет достаточно отбросить все из предыдущего представления? В какой ситуации фаза фиксации мешает этому решению?

Прошу прощения, если это слишком очевидно. Я новичок в распределенных системах, и я не нашел ни одного источника, который бы прямо отвечал на этот вопрос.


person Gabriel Rebello    schedule 20.07.2020    source источник


Ответы (2)


Для этого есть концептуальная причина. Система представляется клиенту в виде черного ящика. Вся идея этого бокса состоит в том, чтобы обеспечить надежный доступ к некоторому сервису, таким образом, он должен маскировать сбои конкретной реплики. В противном случае, если вы отбрасываете все при каждом изменении представления, клиенты будут постоянно терять свои данные. По сути, ваше решение просто противоречит спецификации. Фаза фиксации нужна именно для предотвращения подобных ситуаций. Если запрос принимается только при наличии 2f + 1 сообщений COMMIT, то, даже если все f реплики неисправны, оставшиеся узлы могут восстановить все зафиксированные запросы, это обеспечивает надежный доступ к системе.

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

Если вы новичок в распределенных системах, я предлагаю вам взглянуть на классические протоколы, допускающие невизантийские сбои (например, Paxos), они проще, но решают проблемы аналогичным образом.

Редактировать

Когда я говорю, что клиенты постоянно теряют свои данные, это немного больше, чем кажется. Я говорю о влиянии конкретного клиентского запроса на систему. Возьмем хранилище "ключ-значение". Клинет A связывает некоторые value с некоторыми key через наш черный ящик. Черный ящик теперь упорядочивает этот запрос по отношению к любым другим параллельным (или просто параллельным) запросам. Затем он реплицирует его на все реплики и, наконец, уведомляет A. Без фазы фиксации нет упорядочивания, и в двух разных представлениях наш черный ящик может выбрать два разных порядка выполнения клиентских запросов. При этом возможно следующее:

  1. одновременно t, A связывает value с key, и поле одобряет это,
  2. в то время t+1, B связывает value_2 с key, и поле одобряет это,
  3. в то время t+2, C читает value_2 из key,
  4. просмотреть изменение (невидимо для клиентов),
  5. в то время t+3, D читает value с key.

Обратите внимание, что (5) возможно не потому, что ящик не знает value_2 (как вы упомянули, само значение может быть повторно отправлено), а потому, что он не знает, что ранее он сначала записал value, а затем перезаписал его с помощью value_2. В новом представлении системе нужно как-то упорядочить эти два запроса, но не повезло, решение не согласуется с прошлым.

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

person vonaka    schedule 22.07.2020
comment
Спасибо за ответ. Я понимаю концептуальную причину и противоречие. Но нельзя ли безопасно отказаться от этой концепции в реальной жизни? Например. Во многих системах на основе блокчейнов информация / транзакции могут быть потеряны, но система адаптируется, отправляя их повторно. Что касается технической причины, я предполагаю, что вы упоминаете результат FLP (groups.csail.mit.edu/tds/papers/Lynch/jacm85.pdf)? Если это так, PBFT обходит его, предполагая возможную синхонию, то есть задержки сообщений в системе ограничены. Следовательно, сбои можно было безопасно обнаруживать с помощью достаточно длительного тайм-аута. - person Gabriel Rebello; 22.07.2020
comment
Извините, мой ответ немного сбивает с толку, проверьте правку. - person vonaka; 23.07.2020

Результатом PBFT должен быть не один журнал для каждого представления, а постоянно растущий глобальный журнал, в который каждое представление пытается внести новые «блоки».

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

Если общий порядок просмотров неодинаков, мы теряем указанное выше свойство.

Фактически, если мы принудительно изменяем представление после каждого порядкового номера в PBFT, это будет очень похоже на блокчейн, но с гораздо более сложным механизмом восстановления / безопасности (отчасти потому, что блоки PBFT не фиксируются в предыдущем блоке, поэтому нам нужно согласовывать по каждому из них индивидуально)

person Vervious    schedule 23.07.2020