В последнее время я использую RAFT для создания распределенной системы, реализация простой функции заключается в репликации записи журнала на каждый сервер для сохранения согласованности данных, поэтому мой вопрос заключается в том, как безопасно удалить журнал истории в RAFT, когда все узлы регистрируют записи были совершены.
Я не уверен, что ваш вопрос достаточно полон, чтобы дать исчерпывающий ответ, но обычно этот вопрос задается в терминах постоянных конечных автоматов. Если Raft просто используется для линеаризации и репликации клиентских запросов, а записи сохраняются отдельно (например, сохраняются в базе данных) после фиксации, правильный подход состоит в том, чтобы периодически сохранять термин и индекс lastApplied
для каждого узла и удалять все записи до этот момент.
Однако обратите внимание, что при перезапуске узла все еще будет некоторое воспроизведение журналов, что технически неизбежно, поскольку применение записей и сохранение индекса lastApplied
не может выполняться атомарно, поэтому воспроизведение записей журнала все еще необходимо учитывать в постоянном конечном автомате. .
Еще одна сложность связана с поиском новых узлов или узлов, отставших от индекса lastApplied
. В этом случае вы должны отправить постоянное состояние в виде снимка, чтобы догнать узел.
См. Раздел о машинах с постоянным состоянием в диссертации Raft.
Независимо от того, является ли это именно тот вариант использования, с которым вы сталкиваетесь, общий подход к обеспечению безопасности системы для записей, которые могут быть немедленно удалены, остается неизменным.