четверг, 24 марта 2011 г.

MongoDB обновление множества записей

Обнаружил неприятную особенность. При частом использовании:

update(
    query={Field:{$in:[x],$nin:[y]}},
    update={$addToSet:{Field:z}},
    multi=true
}

монго плодит кучу под-процессов (и соединений) и сильно лочит коллекцию. Что приводит к 90% локу и зависанию скрипта.

Скрипт - в цикле обновляет поля.

Помогает использование вместо мулти-обновления - обновления каждой записи по одной (под-цикл в скрипте).

Gitolite - удобно!

Очень советую использовать на сервере с git-репозиториями gitolite. Инструкция. Обязательно ставить под пользователем git.

Gitosis у меня не заработал - при push выдавал неизлечимую ошибку.

четверг, 10 февраля 2011 г.

Clodo.ru - не оправдывает моих надежд

Вчера (9.02.2011) была последняя капля. LA достиг 10 и машина умерла. В панели весело отображалось 2ТБ из 15 ГБ диска. Это интересно как???

Кроме того, когда я поднял минимум памяти с 512 до 1,5 ГБ и перезапустил сервер - ничего не изменилось. Как было 512 так и осталось (т.е. выше никак не росло).

Сегодня опять мой скрипт довел сервер до la 8.

Срочно уползаю на selectel.ru! Там la нормально держится на 3-4 и память честно выделяется...

среда, 9 февраля 2011 г.

Clodo.ru - обязательно ставьте fail2ban.

Сегодня слегка озадачился - а не атакуют ли мой сервер (который вообще то никак не фигурирует в интернете)?

sudo cat /var/log/secure* | grep 'Failed password' | grep sshd | awk '{print $1,$2}' | sort | uniq -c

232 Feb 1
800 Feb 2
 15 Feb 4
 15 Feb 7
238 Feb 8

Ого!!! Срочно ставлю fail2ban!

Шаги такие:
1. поставить пакет (yum install fail2ban)
2. настроить конфиг (ssh jail, проверьте правильность имени файла лога!)
3. прописать емаил для рута (sudo vi /etc/aliases)
4. включить fail2ban (/etc/init.d/fail2ban start)
5. добавить его в init.d (chkconfig fail2ban on)

P.S.: проверьте - установлен ли sendmail (/usr/sbin/sendmail)!

четверг, 3 февраля 2011 г.

YML и СЕОшные развлечения

По работе столкнулся с интересной ситуацией - многие интернет магазины используют трюк с подменой символов в названии товаров. Т.е. есть слово "cумка". Они заменяют букву "с" на английскую "c".

Зачем? Да вот какой-то гений понял, что это даст больше уникального контента для поискового робота. Ладно. Всё по-умному - заменяют только в названии товара, а в описании обязательно дублируют слово в правильном виде.

Кому интересно - вбейте в поисковики (советую гугл) "сумка" (и замените первую букву). Результат вас поразит.

Но всё бы хорошо, но эти горе-сеошники совсем не понимают, что они портят контент сайта. Почему? Да потому что, когда интернет-магазин вдруг решит работать с Яндекс-Маркетом... Да, да! Название товара то - уникальное... И кривое.

Хотя возможно яндекс это знает и заменяет обратно. Но вот мне дают xml-файл. Я его обрабатываю и вижу битые слова. И мне приходится как то это решать!

П.С.: Намного проще было бы сео-умникам пнуть своих программистов, что бы те написали ма-а-аленький скрипт...

понедельник, 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/