Могут ли векторные часы быть больше других, но они не связаны с предками?

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

Взяв пример в документе, последний шаг - согласовать D3 и D4 с D5, но что, если пользователь извлек только D3 (IIUC, это возможно, поскольку в системе есть несколько версий данных, я не гарантирую чтобы получить как D3, так и D4, я даже могу прочитать D1 / D2), и, не зная наличия D4, пользователь обновил D3 до D5, и по совпадению D5 также обрабатывается Sz(который обрабатывал D4). Разве это не делает D5 потомком D4?:

D4([Sx,2],[Sz,1]) против D5([Sx,2],[Sy,1],[Sz,1])

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

Я вижу, что векторные часы несут меньше информации, чем линейный журнал истории, т.е. ([Sx,2],[Sy,1]) не сообщает мне порядок действий, которые имели место, они могут быть расширены до других временных рядов например [Sx, Sy,Sx] или [Sy,Sx,Sx] или [Sx, Sx, Sy]?

2 ответа

Если D5' обрабатывается Sz, то он уже знает о D4, D5 будет ([Sx2,Sz2]) вместо D5([Sx,2],[Sy,1],[Sz,1]).

Если D5" обрабатывается Sy, то он знает о D3, и D5 будет ([Sx2,Sy2])

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

Сами по себе векторных часов недостаточно, чтобы предотвратить описываемое вами несоответствие данных.

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

Например, с протоколом кворума вы можете потребовать, чтобы большинство узлов в системе «наблюдали» за обновлением, чтобы оно было действительным. И если этого не произойдет, запись будет считаться недействительной и отклонена. В сочетании с векторными часами вы получаете распределенную систему, устойчивую к типу проблемы, которую вы показали.

Другие вопросы по тегам