суббота, 22 мая 2010 г.

Репликация пользователей из основной БД в ejabberd

Для обеспечения высокой доступности при минимальной нагрузке оптимальным решением является синхронизация учетных записей пользователей из основной БД в базу ejabberd (mnesia). Ранее я приводил пример авторизации внешним скриптом, но для более-менее серьезного применения это создает лишнюю нагрузку на основную БД, плюс снижает доступность.

См. ejabberdctl should be able to dump to stdout.

Дамп пользователей
sudo ejabberdctl dump_table /tmp/dump passwd

Парсер дампа
#!/usr/bin/tclsh8.5

proc K {arg args} {set arg}
proc << name {K [read [set f [open $name]]] [close $f]}

array set jusers {}
set lines [split [<< /tmp/dump] \n]
foreach line [lrange $lines 1 end] {
    set user [string map {, " " \{ "" \} ""} [string range $line 0 end-1]]
    set name [lindex $user 1]
    set host [lindex $user 2]
    set pass [lindex $user 3]
    lappend jusers($host) $name $pass
}

puts $jusers(kuban)
В результате для каждого виртуального хоста получаем список формата {nickname password}, далее сравниваем с аналогичной записью в основной БД и для отличающихся обновляем через ejabberdctl или любым удобным нам способом. Скрипт разумно запускать от имени пользователя ejabberd, подкладывая ему в заранее определенное место дамп пользователей из основной базы или настроив доступ на чтение к основной базе. Дамп 3000 пользователей из ejabberd занимает около 0,25 с, обновление учетной записи одного пользователя около 0,1 с. Так что репликацию можно выполнять хоть раз в минуту, ничуть не нагружая при этом сервер. На мой взгляд, разумно ограничиться интервалом 5 минут.

Комментариев нет:


(C) Alexey Pechnikov aka MBG, mobigroup.ru