понедельник, 17 января 2011 г.

MongoDB. Реализация транзакции между двумя коллекциями.

Привычной SQL-транзакции в mongodb нет. Однако есть атомарные команды для изменения документа (одного!). Что позволяет реализовать двойную бух-запись.

Пример: есть коллекция организаций и журнал сумм на списание с организаций.

Получается такая реализация:

Вместо выполнения всей sql-транзакции - в коллекцию журнала добавляется запись о списании суммы с организации. Всё. Остальное - делает робот-скрипт (в этом примере - он работает строго в один поток!)

Что делает робот:
1. Находит не обработанную запись в коллекции журнала
2. В коллекции организаций у соответствующей организации за одну команду изменяется баланс и лог-поле (типа LogId + TimeStamp) Важно!: предварительно нужно проверить - не совпадает ли идентификатор журнальной записи с LogId. Если совпало - то значит скрипт запущен после сбоя, и уменьшать баланс не надо!
3. В коллекции журнала записи добавляется флаг "Обработана"=true

На 2 и 3 шаге нужно проверять getLastError(safe-mode) - если произошла ошибка - можно повторить шаг (только не бесконечно, а, например, 10 раз. если все плохо - то нужно как-то оповестить админа или программиста).

Это - очень упрощенный вариант. Только для понятия логики.

пятница, 14 января 2011 г.

MongoDB + Munin = графики

На сайте mongodb оказалась не работающая (для меня) инструкция. Покопав гугл нашел решение:

Плагины нужно скопировать в /usr/share/munin/plugins
и сделать симлинки по пути /etc/munin/plugins
потом проверить конфиг ноды:

munin-node-configure
...
mongo_btree                | yes  |
mongo_conn                 | yes  |
mongo_lock                 | yes  |
mongo_mem                  | yes  |
mongo_ops                  | yes  |
...

перезапустить ноду:
sudo /etc/init.d/munin-node restart

Вот теперь на веб-странице графиков появилась группа mongodb.

P.S.: https://github.com/erh/mongo-munin/