Какие существуют алгоритмы аварийного переключения в распределенной системе? - PullRequest
19 голосов
/ 07 марта 2009

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

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

  • Какие существуют алгоритмы для отработки отказа в распределенной системе?
  • Какие существуют алгоритмы для достижения консенсуса в распределенной системе?
  • Как узлы в кластере должны определять, что узел не работает?
  • Как узлы должны определить, какие записи базы данных имели свою главную копию на отказавшем узле во время сбоя, чтобы другие узлы могли восстановить эти записи?
  • Как определить, какой узел (ы) имеет последнюю вторичную копию какой-либо записи?
  • Как решить, что вторичная копия какого узла должна быть переведена в новую мастер-копию?
  • Как с этим справиться, если узел, который должен был быть отключен, внезапно возвращается, как будто ничего не произошло?
  • Как избежать сценариев разделения мозга, когда сеть временно разбивается на две части, и обе стороны думают, что другая сторона умерла?

Ответы [ 5 ]

29 голосов
/ 09 марта 2009
* What algorithms there are for doing failover in a distributed system?

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

* What algorithms there are for consensus in a distributed system?

Вы, вероятно, хотите реализовать Paxos. Простые Паксос не так уж сложно получить право. Если вы пытаетесь сделать это пуленепробиваемым, прочитайте статью Google «Paxos Made Live». Если вы надеетесь сделать его высокопроизводительным, посмотрите на Multi-Paxos.

* How should the nodes in the cluster determine that a node is down?

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

* How should the nodes determine that what database entries had their master copy on the failed node at the time of failure, so that other nodes may recover those entries?
* How to decide that which node(s) has the latest secondary copy of some entry?
* How to decide that which node's secondary copy should be promoted to be the new master copy?

Я думаю, что вы действительно выиграете от чтения статьи Google FileSystem. В GFS есть выделенный главный узел, который отслеживает, какие узлы имеют какие блоки. Эта схема может работать для вас, но ключ в том, чтобы сохранить доступ к этому мастеру минимальным.

Если вы не храните эту информацию на выделенном узле, вам придется хранить ее везде. Попробуйте пометить данные идентификатором основного владельца.

* How to handle it, if the node which was though to be down, suddenly comes back as if nothing happened?

См. Выше, но суть в том, что вы должны быть осторожны, потому что узел, который больше не является мастером, может подумать, что это так. Одна вещь, которую я не думаю, что вы решили: как обновление доходит до мастера - т.е. как клиент узнает, на какой узел отправлять обновление?

* How to avoid split-brain scenarios, where the network is temporarily split into two, and both sides think that the other side has died?

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

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

Не стесняйтесь снимать мне почту в автономном режиме, если вы хотите узнать больше деталей. Мой блог http://the -paper-trail.org посвящен многим из этих вещей.

ура

Генри

10 голосов
/ 07 марта 2009

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

Некоторые мысли:

  • Распределенные системы являются сложными, потому что нет надежных систем для устранения сбоев; в асинхронной системе нет никакого способа убедиться, что узел не работает или есть сетевая задержка. Это может звучать тривиально, но на самом деле это не так.
  • Достижение консенсуса может быть достигнуто с помощью семейства алгоритмов Paxos , версии которых используются в Google Bigtable и других местах.

Вы захотите углубиться в учебник по распределенным системам (или несколько). Мне нравится Распределенные системы Танненбаума: принципы и парадигмы

3 голосов
/ 08 марта 2009

Отличный блог, в котором много говорится о распределенных системах и распределенных алгоритмах, включая реализацию Paxos, - это http://the -paper-trail.org /

2 голосов
/ 07 марта 2009

Эта проблема была решена DEC для VMS с помощью Distributed Lock Manager . Современные решения основаны на этом дизайне. Прочитайте статью Wikipedia для некоторых текущих решений. Вы должны взглянуть на OCFS2 , который теперь является частью ядра Linux.

0 голосов
/ 07 марта 2009

Решая лишь небольшую часть вашего вопроса: в сценарии, который вы описываете, нет никакого способа решить (в резюме), какой узел (ы) имеет последнюю вторичную копию. В лучшем случае некоторые узлы могут опрашивать и определять (после небольшого количества связи), кто из узлов, которые они знают / могут видеть, и которые знают / могут их видеть, и что не может видеть старый мастер имеет самую последнюю копию. Но:

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

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

...