Я пытаюсь внедрить систему транзакций для Cassandra с помощью ZooKeeper. Поскольку я не думаю, что у меня достаточно опыта в реализации базы данных, я хотел бы знать, будет ли моя идея работать в принципе, или есть какой-то серьезный недостаток.
Вот описание высокого уровня шагов:
- определить все строки (ключи) и столбцы для редактирования. Пусть ключи будут [K0..Kn]
- применить блокировку записи ко всем задействованным строкам (блокировки реализованы в памяти Zookeeper)
- скопировать старые значения в отдельные места в Кассандре, которые однозначно идентифицируются ключом: [K'0..K'n]
- сохранить [K'0..K'n] и сопоставить их с [K0..Kn] в ZooKeeper, используя постоянный режим
- примените обновление к данным
- удалить записи в ZooKeeper
- разблокировать строки
- лениво удаляет записи [K'0..K'n] в потоке обслуживания (удаление cassandra использует временную метку, поэтому K'0..K'n можно использовать повторно для другой транзакции с более новой отметкой времени)
Обоснование:
- если транзакция не удалась на шаге 1-4, изменения не применяются, я могу прервать транзакцию и удалить все, что хранится в zookeeper и резервное копирование в cassandra, если таковые имеются.
- если транзакция не удалась на шаге 5, информация, сохраненная на шаге 3, используется для отката любых изменений.
- если на сервере произошел сбой / сбой / кража уборщиком, при перезапуске перед обслуживанием любого запроса я проверяю, сохранились ли какие-либо ключи в зоопарке с шага 4, если да, я буду использовать эти ключи для получения выполните резервное копирование данных, сохраненных на шаге 3, и поместите эти данные туда, где они были, тем самым откатив все неудачные транзакции.
Одной из моих проблем является то, что произойдет, если некоторые серверы будут отделены от кластера. У меня нет опыта в этой области, моя схема работает вообще? и это работает, если раздел происходит?