Я планирую создать распределенную систему баз данных, используя общедоступную архитектуру и multiversion concurrency control. Резервирование будет достигнуто с помощью асинхронной репликации (это позволило потерять некоторые недавние изменения в случае сбоя, если данные в системе остаются согласованными). Для каждой записи базы данных один node имеет главную копию (только для node есть доступ на запись к ней), в дополнение к которой один или несколько узлов имеют вторичные копии записи для целей масштабируемости и избыточности (вторичные копии только для чтения). Когда основная копия записи обновляется, она присваивается по времени и отправляется асинхронно узлам со вторичными копиями, чтобы, наконец, получить последнюю версию записи. node, у которого есть главная копия, может измениться в любое время - если другой node должен записать эту запись, он запросит у текущего владельца основной копии указание, что node является собственностью этой основной копии записи, и после получения права собственности, что node может записать запись (все транзакции и записи являются локальными).
В последнее время я думал о том, что делать, когда node в кластере идет вниз, и какую стратегию использовать для перехода на другой ресурс. Вот несколько вопросов. Я надеюсь, что вы знаете доступные альтернативы, по крайней мере, некоторым из них.
- Какие существуют алгоритмы для выполнения отказоустойчивости в распределенной системе?
- Какие существуют алгоритмы для консенсуса в распределенной системе?
- Как узлы в кластере определить, что a node не работает?
- Как узлы будут определять, какие записи базы данных имели свою главную копию при неудавшемся node во время сбоя, чтобы другие узлы могли восстановить эти записи?
- Как решить, что node (s) имеет последнюю вторичную копию какой-либо записи?
- Как решить, какая дополнительная node вторая копия должна стать новой главной копией?
- Как справиться с этим, если node, который должен был быть опущен, внезапно возвращается, как будто ничего не произошло?
- Как избежать сплит-мозговых сценариев, когда сеть временно разделяется на две части, и обе стороны считают, что другая сторона умерла?