| a_bettik ( @ 2006-09-12 12:02:00 |
| Current mood: |
Эврика!
Придумал схему репликации для нашего мэйл-кластера!
На данный момент есть: N т.н. maildir-серверов, на каждом qmail-ldap + courier-ldap + slapd-slave (реплицируется с мастера), все машины балансируются через LVS (который прописан как MX в DNS'е). При доставке мыла LVS перекидывает письмо на любой из N серверов, сервер смотрит в ldap на запись юзверя и переправляет письмо на нужный хост (через qmail-qmqp). Логины в IMAP работают так же, с той лишь разницей, что для аутентификации используется imap_auth (из qmail-ldap), который переправляет IMAP session на нужный хост.
Со стороны SMTP ситуация контролируется полностью, т.к. доставка идёт через скрипт, который фильтрует почту и пихает её либо в /dev/null либо в qmail-forward либо в qmail-inject (где она напрямую пишется в maildir пользователя), т.е. в этот же скрипт можно было воткнуть репликатор который асинхронно писал бы "transaction logs" (отдельный процесс их бы потом отрабатывал и сливал на backup host). Но вот со стороны IMAP'а всё намного хуже - там за всё отвечает courier, и если пользователь например удалит мыло из папки, то нет никакой возможности отреагировать на это событие (написать transaction log)... были идеи насчёт всякой лабуды типа inotify, попытки подвязать внешнюю библиотеку через LD_PRELOAD или просто брутально переписать соответствующий кусок courier'а, но это всё как-то не серьёзно.
Теперь я понял, что dovecot спасёт отца русской демократии. Во первых в dovecot можно добавлять дополнительные namespaces и прятать их от квоты и LIST, что есть решение давней задачи клиента о реализации ОСОБЫХ писем которых не видно в нормальном клиенте (вообще-то конечно видно, если знаешь как этот namespace называется, security блин through obscurity) и которые не влияют на квоту. Это раз. Во вторых у dovecot'а есть готовая инфраструктура под написание плагинов.
Сама идея репликации проста как валенок: пишем плагин который при каждой IMAP операции (кроме read-only, типа EXAMINE или NAMESPACE) обновляет transaction log. Таким образом полностью контролируется сторона IMAP'а. Для SMTP переделывается фильтрующий скрипт так, чтобы он вместо qmail-inject использовал IMAP APPEND. Всё.
Надо только погонять пару тестов, а то мне что-то подсказывает, что IMAP APPEND будет малость тормозить...