Репликация пользователей из основной БД в ejabberd
Для обеспечения высокой доступности при минимальной нагрузке оптимальным решением является синхронизация учетных записей пользователей из основной БД в базу ejabberd (mnesia). Ранее я приводил пример авторизации внешним скриптом, но для более-менее серьезного применения это создает лишнюю нагрузку на основную БД, плюс снижает доступность.
См. ejabberdctl should be able to dump to stdout.
Дамп пользователей
Парсер дампа
См. 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 минут.
Comments