Postfix воспринимает базу данных так же, как индексированную карту. Результатом запроса базы данных является Match (вместе со значением, возвращаемым запросом) или No match. Основное отличие между картой–базой данных и индексированной картой состоит в том, что при изменении в базе данных вам не нужно перезапускать демон. Postfix не считает, что единственным, кто может изменять базу данных, является администратор почтовой системы.
Недостаток такого подхода в том, что база данных может не справиться с поступающими запросами, т. к. Postfix должен выполнить как минимум три запроса для каждого поиска в карте (см. пост ниже «Как Postfix обращается к картам»). При высокой нагрузке компьютер базы данных может замедлиться или зависнуть, и ваш почтовый сервер окажется уязвимым для атак типа «отказ в обслуживании» и «саморазрушение» (self induced meltdown). Этот факт не должен препятствовать использованию баз данных, но не забывайте о возможном риске.
Поиск в базе данных может стать проблемой для систем с высокой нагрузкой, но это не единственное, на что следует обратить внимание, – еще одной проблемой может стать задержка. Запросам к базе данных соответствует большая задержка, чем запросам к индексированным картам, т. к. Postfix должен подключиться к компьютеру базы данных, отправить запрос и дождаться результата. При работе с индексированной картой Postfix должен лишь обратиться к данным, которые уже загружены в память.
Если база данных становится вашим «узким местом», а ваша карта не слишком велика, то можно использовать промежуточную карту между базой данных и сервером Postfix. То есть вы можете с помощью полного запроса к базе данных создать индексированную карту, а затем запускать Postfix с полученной картой. Необходимо помнить об обновлении такой карты по мере необходимости, при этом можно использовать демон proxymap для значительного уменьшения количества одно временных соединений.
Определение количества одновременных соединений с базой данных. Демоны Postfix (smtpd, smtp и т. д.) работают с ограничением на количество одновременных процессов (задается параметром default_process_limit), равным 100. При пиковой загрузке получаем 100 действующих одновременно демонов smtpd, каждый из которых обращается к базе данных для одного поиска access(5) (например, если мы используем карту, чтобы проверить, входит ли клиент в наш личный черный список и надо ли запретить ему отправлять нам почту).
Согласно следующему разделу один поиск требует от одного запроса (в случае точного совпадения) и до числа, зависящего от количества «.» (точек) в доменной части (если совпадение не найдено) ключа поиска. Поэтому в среднем можно принять количество запросов равным 3, тогда количество одновременных запросов к базе данных будет равно как минимум default_process_limit * 3 (т. е. 300 запросов с настройками по умолчанию), где default_process_limit – количество одновременных соединений. И это только запросы и соединения для демонов smtpd; другие демоны, такие как local и qmgr, могут заниматься другой работой, увеличивая количество открытых соединений и одновременных запросов.