« 产生mail loop的原因及解决方案 | Main | Postfix+ldap的性能测试及分析 »

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明。
本文网址:http://www.hzqbbc.com/blog/arch/2003/01/ecper_user_tran.html
 

January 01, 2003

配置per user transport实现用户分布存储

高级Postfix配置

大容量邮件系统的关键之一就在于存储,而存储无外乎集中存储和分布存储。

O 集中存储主要是通过光纤磁盘阵列,SAN或iSCSI等统一存储技术,将邮件数据集中或较为集中的存储在一个地方,应用系统共享使用这些数据,所带来的问题主要是如何解决同时请求一个文件的缩定问题

O 分布存储则将用户数据分布在多个存储设备/机器上,主要的手段是通过一定的算法,将邮件分发到存储的设备或主机上。原理上有点象路由器,邮件被路由到了最终的目的地。所带来的问题是管理比较麻烦,但较少共享缩定的问题。

如何利用Postfix实现分布的用户数据存储呢?这里通过per user transport来实现。

在postfix没有release 2.0.0之前这个per user transport的功能只出现在snapshot里,现在好了可以在正式版里使用了。本文所描述的方法适合于:postfix stable > 2.0.0.0或snapshot version > 1.1.11-200205xx

1.描述
什么是per user transport?有什么用?简单来说就是可以为每个用户设置单独的transport,类似原来1.1.x里的domain transport一样,只不过现在的key可以是user+extension@domain.tld了。好处是什么?好处就是可针对不同用户设置特定的transport,例如有些用户使用默认的local transport,而有些则可以使用病毒过滤或maildrop功能,甚至将用户送到nexthop继续进行处理等。可能的应用:病毒过滤、关键字过滤、垃圾邮件过滤、邮件的物理分布或转发等。

自己的感觉:这个功能就类似qmail里的qmqp(中央队列服务器<-->qmtpd/qmqpd机器)或者类似qmail-ldap里的cluster功能。而且要强大得多!!qmail的qmqp/qmtp协议设计得很好,思路也很不错,不过具体的implemenation就不够好。使用postfix可享受最大的灵活性。

如果postfix能考虑完整的实现qmail的qmqp/qmtp等不错的特性,并吸取qmail的优点话,那么qmail的价值则更加大打折扣了。

2.配置思路

#
#                                    +------+
#          local                     |      |
#          handling                  | MTA1 |
#          layer                     |      | 
#                                    +------+
#                                        ^ foo@lvs.hzqbbc.com
#                                        | 
#                                    +--------+        +------+ 
#                    +------+        |        |        |      | 
#           inbound  |mail  |  ----->|switch  |----->  | MTA2 | bar@lvs.hzqbbc.com
#          email     +------+        |        |        |      | 
#                                    +--------+        +------+
#
#                                     邮件交换         local handling layer 

将不同用户的邮件switch到不同的机器,达到分布的目的。配置方法见下文。

3.配置方法:
在mail switch机器上:
postconf -n

alias_database = hash:/etc/postfix/aliases
alias_maps = hash:/etc/postfix/aliases
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/lib/postfix
debug_peer_level = 2
inet_interfaces = all
local_recipient_maps = unix:passwd.byname $alias_maps $virtual_mailbox_maps
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
mydestination = $myhostname,$mydomain,$transport_maps
mydomain = LVS.hzqbbc.com
myhostname = LVS.hzqbbc.com
mynetworks = 192.168.0.0/16, 127.0.0.0/8
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /etc/postfix/README_FILES
sample_directory = /etc/postfix/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtpd_banner = $myhostname ESMTP $mail_name Mail-Switch ($mail_version)
smtpd_recipient_restrictions = check_relay_domains,reject
transport_maps = hash:/mnt/disk/vmail/maps/transport
unknown_local_recipient_reject_code = 450 

在MTA1和MTA2(这里我定义的机器名字是srv1, srv2)上配置完全一样,除了机器名不同,因此只列出一个srv2的example:
postconf -n

alias_database = hash:/etc/postfix/aliases
alias_maps = hash:/etc/postfix/aliases
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/lib/postfix
debug_peer_level = 2
inet_interfaces = all
local_recipient_maps = unix:passwd.byname $alias_maps $virtual_mailbox_maps
local_transport = virtual
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
mydestination = $myhostname,$mydomain, $virtual_mailbox_domains
mydomain = LVS.hzqbbc.com
myhostname = SRV2.LVS.hzqbbc.com
mynetworks = 192.168.0.0/16, 127.0.0.0/8
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /etc/postfix/README_FILES
sample_directory = /etc/postfix/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
transport_maps = hash:/mnt/disk/vmail/maps/vuser_transport
unknown_local_recipient_reject_code = 450
virtual_gid_maps = static:250
virtual_mailbox_base = /mnt/disk/vmail
virtual_mailbox_domains = lvs.hzqbbc.com
virtual_mailbox_maps = hash:/mnt/disk/vmail/maps/mailbox
virtual_uid_maps = static:250 

之后就是配置了。
/mnt/disk/vmail/maps下有这些文件:
cat mailbox

LVS.hzqbbc.com      anything
hzq@LVS.hzqbbc.com  hzq/Maildir/
ben@LVS.hzqbbc.com  ben/Maildir/
foo@LVS.hzqbbc.com  foo/Maildir/
bar@LVS.hzqbbc.com  bar/Maildir/ 

cat transport

foo@LVS.hzqbbc.com  smtp:[SRV1.LVS.hzqbbc.com]
bar@LVS.hzqbbc.com  smtp:[SRV2.LVS.hzqbbc.com]

cat vuser_transport

foo@LVS.hzqbbc.com  virtual:
bar@LVS.hzqbbc.com  virtual: 

这样,对外部用户只有一个postfix mail-switch/hub。投递给该switch的邮件会转到合适的后端机器(srv1 or srv2)并进行本地投递,整个系统扩容时也特别简单,增加1-n个switch的机器,并增加相应mx记录即可。负载可以比较平均,而不需要使用LVS设备

后端扩充用户及存储也不难,不断增加srvn(n>2)就可以了。这样的体系缺点是效率不够高,耗费机器比较多,但TOC相当低,不需要太多的开发,直接利用postfix的功能并进行合理扩充即可。

Posted by hzqbbc at January 1, 2003 09:27 PM

Comments

Post a comment




Remember Me?

(you may use HTML tags for style)