Способы организации хранения данных в распределенных системах
В книге Семь баз данных за семь недель обратил внимание на то, как отличается подход к распределенному хранению данных в различных БД.
MongoDB
Данные реплицируются на несколько серверов. Читать актуальные данные и писать можно только на главном сервере. Если главный сервер недоступен — происходят выборы нового главного. Им становится тот сервер, на котором более актуальные данные. Если в результате разрыва связи сеть серверов делится на 2 части, то главного может выбрать только та часть, в которой больше половины серверов. Поэтому кластер обычно состоит из нечетного количества серверов.
CouchDB
Все сервера являются главными и могут работать независимо. Как следствие, при репликации возникают конфликты. Конфликт разрешается автоматически с использованием детерминированного алгоритма, т.е. одинаковые конфликты всегда разрешаются одинаково. При этом сохраняются и проигравшие версии данных, так что пользователь может потом изменить результат решения конфликта.
Riak
Для каждого сегмента данных (сегмент – способ группировки данных) определены следующие параметры:
- N – количество узлов, на которые будет реплицировано значение.
- W – количество узлов, запись на которых должна завершиться успешно для того, чтобы вся операция считалась успешной.
- R – количество узлов, чтение с которых должно завершиться успешно для того, чтобы вся операция считалась успешной.
- DW – аналогично W, но про физическую запись на диск.
Все параметры кроме N можно изменять для каждой конкретной операции.
Данные хранят временную метку, так что операция чтения вернет актуальное значение, если оно было считано хотя бы с одного сервера.
Наборы параметров:
- W=N, R=1 – медленная запись и быстрое чтение.
- W=1, R=N – быстрая запись и медленной чтение.
- W=N/2 + 1, R=N/2 + 1 – усредненный вариант, гарантирующий чтение актуального значения.