Нарушения линейзуемости при миграции между дата-центрами #3
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проблема
Реализация в crossdc_migrator.go обеспечивает асинхронную миграцию данных между дата-центрами с использованием Change Data Capture (CDC). Однако в процессе миграции может нарушаться линеаризуемость операций. На этапе синхронизации дельт клиенты могут читать разные версии документов из разных дата-центров: источник возвращает новую версию, а целевой дата-центр — старую.
После завершения миграции порядок операций может нарушаться из-за асинхронного применения изменений, что потенциально приводит к сценариям потерянных обновлений. Механизм валидации (validateDocument) проверяет только контрольные суммы, не верифицируя порядок операций или причинно-следственные связи.
Если порядок применения изменений в DC2 нарушен, документ может сначала получить обновление до значения 2, а затем быть перезаписан значением 1. Это нарушает свойство линеаризуемости системы, поскольку чтение после записи всегда должно возвращать значение самой последней записи или более новое значение.
Архитектурная проблема
Как гарантировать линеаризуемость операций в распределённой системе при асинхронной миграции между дата-центрами?
Предлагаемые направления исследований
Соответствующие файлы с исходным кодом
internal/cluster/crossdc_migrator.gointernal/cluster/crossdc_migrator.go(validateDocument, строки 400–450)internal/cluster/crossdc_migrator.go(applyChange, строки 300–350)