Стратегии восстановления или отработки отказа, когда данные NoSQL становятся противоречивыми - PullRequest
2 голосов
/ 03 августа 2011

NoSQL подчеркивает доступность по согласованности. Иногда это может привести к несогласованности данных в вашем хранилище данных NoSQL.

1) Каковы стратегии выхода из такой ситуации?

2) Каковы стратегии предотвращения такой ситуации, если это возможно?

3) Каковы конкретные стратегии для популярных поставщиков NoSQL, таких как MongoDB, CouchDB, Cassandra и HBase?

1 Ответ

4 голосов
/ 03 августа 2011

Я думаю, что, задав вопрос № 3, вы смешиваете 2 разные проблемы:

A. База данных становится нечитаемой, т. Е. Ее файлы данных повреждены, а данные недоступны или частично доступны

B. Данные приложения, хранящиеся в базе данных NoSQL, становятся несовместимыми (например, произошло некоторое несоответствие ключей) для приложения, которое использует это, и приложение начинает вести себя странно.

Проблема A - это проблема сопровождения базы данных, и каждая база данных обрабатывает ее особым образом (например, MongoDB ). И, по правде говоря, это не только проблема NoSQL. Но в целом ситуация такого рода является скорее чрезвычайной ситуацией, и она не должна возникать, если ядро ​​вашей базы данных работает надежно, имеет хорошее и достаточно аппаратное обеспечение.

Проблема B плохо относится к вашему приложению, и я думаю, что основная стратегия здесь состоит в том, чтобы заставить ваше приложение ожидать, что данные могут быть несовместимыми в какой-то момент, и попытаться обойти это, если это возможно. Также может быть некоторый фоновый процесс, который находит несоответствия в данных. В любом случае это зависит только от вашей модели данных.

РЕДАКТИРОВАТЬ: Обновления данных в базе данных NoSQL не являются транзакционными, но в целом являются атомарными. Таким образом, если один кортеж обновляется двумя разными процессами, вы не получите часть кортежа из одной, а другую часть из другого, вы получите весь кортеж из одного из процессов, который механизм считает «последним». Но если ваше приложение обновляет несколько «зависимых» кортежей, то результат для нескольких потоков обновления, конечно, не предсказуем, потому что нет транзакции вокруг этих нескольких обновлений. Если, конечно, все процессы не помещают одни и те же данные в базу данных. Но если у вас слишком много зависимостей между различными типами кортежей / объектов, я бы сказал, что ваше приложение использует NoSQL неправильно.

РЕДАКТИРОВАТЬ : здесь также интересная дискуссия здесь .

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