Я пробовал MongoDB в конфигурации с набором реплик, чтобы посмотреть, как она масштабируется/работает/справляется.
Я использовал Morphia (слой сопоставления POJO поверх Java-драйверы Mongo) для сохранения 10 000 простых случайных документов в одной коллекции. Я аннотировал свой POJO (MyData
во фрагменте ниже) аннотацией @Entity(concern="REPLICAS_SAFE")
в надежде, что данные, отправленные в базу данных, будут безопасно сохранены.
Мой POJO состоял из поля ObjectId
(тип первичного ключа Mongo), String
случайных символов случайной длины (максимум 20 символов) и long
, сгенерированного с использованием Random.nextLong()
.
Мой код следующий:
for (int i=0;i<10000;i++) {
final MyData data = new MyData();
boolean written = false;
do {
try {
ds.save(data); //ds is of type DataStore
written=true;
} catch (Exception e) {
continue;
}
}
while (!written);
}
Я настроил кластер с набором реплик из четырех узлов, запустил указанную выше программу, а затем начал метафорически вытягивать кабели, чтобы посмотреть, что произошло.
Желаемый результат состоял в том, что программа работала до тех пор, пока все документы не были успешно сохранены в базе данных.
Фактический результат после нескольких подходов был одним из:
- Java сообщает, что он зафиксировал 10 000 записей, но в базе данных было только ‹10 000
- Java сообщает, что она зафиксировала ‹10k, а база данных сообщает либо о том же значении, либо даже меньше
- Все работает нормально
В одном случае узлы, которые были восстановлены, не смогли фактически догнать ОСНОВНОЙ узел, и их пришлось запускать с нуля с удаленной базой данных. И это несмотря на увеличение параметра opfile до 2 гигабайт, которых, как мне казалось, будет достаточно для воспроизведения 10 000 строк очень простых данных.
Другие вещи, которые вы должны знать:
- Все это работает на одном оборудовании (2 гигабайта Pentium D!), кластер работает на двух 32-битных экземплярах Ubuntu Server VirtualBox с 128 мегабайтами оперативной памяти каждый и Java-клиентом, работающим внутри хоста Windows XP. На каждой виртуальной машине выполнялось два
mongod
процесса, а на также одна виртуальная машина. - Часы на двух виртуализированных машинах были отключены на несколько секунд (мне нужно установить гостевые дополнения VirtualBox, чтобы исправить это), но не на большую величину — 10gen говорит, что время не должно быть проблемой для кластеризации, но я подумал, что д упомянуть об этом.
Я знаю об ограничении в 2 гигабайта с Mongo на 32-разрядной машине, о том факте, что у других людей исчезали записи, и я знаю, что машина, на которой я провожу эти тесты, точно не входит в число 500 лучших (именно поэтому данные, которые я выбрал для persist было мало), но когда мои тесты работали, они работали очень хорошо.
Являются ли проблемы, которые у меня были, доказательством того, что Mongo еще не готов к работе в прайм-тайм, или я делаю что-то изначально неправильное?
Я использую 1.6.5.
Любое понимание, подсказки, советы, указатели, объяснения или критика очень ценятся!
ps: я не троллю - мне очень нравится идея NoSQL для тех типов данных, для которых он хорош, поэтому я действительно хочу, чтобы он работал, но пока мне не везет!