建立分布式的Qmail邮件系统

2024-04-22 06:18

本文主要是介绍建立分布式的Qmail邮件系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一. 设计目的

  适应多用户、大容量的邮件系统,易扩展,提供mail服务冗余特性。

  二. 配置环境

  我的测试环境采用了三台PC Server,均采用RedHat 6.2,openldap2.0.7和qmail-1.03 以及qmail-ldap,分别运行smtp/pop3服务,具体配置如下。
  192.168.0.19 omni1.i100.com.cn 主smtp/pop3 server,dns MX记录,邮件存储主机,qmqp server
  192.168.0.5 cocoon.i100.com.cn LDAP server,邮件存储主机
  192.168.0.2 gw2.i100.com.cn 邮件存储主机,qmqp server,同时是次smtp/pop3 server
  在192.168.0.19的/data/vuser/目录下,存储johnny的邮件。
  在192.168.0.5的/data/vuser/目录下,存储jacky的邮件。
  在192.168.0.2的/var/qmail/vuser/目录下,存储denny的邮件。

  以上配置在实践中,可以配置成邮件存储和ldap以及smtp server分别位于不同机器。

  三. 软件


  openldap-2.0.7.tgz
  qmail-1.03.tar.gz
  qmail-ldap-1.03-20010301.patch
  ucspi-tcp-0.84.tar.gz

  编译qmail的时候,记得把对cluster的支持编译进去。Edit the Makefile to reflect your setup. You can change the following values: QLDAP-CLUSTER

  Compiles the clustering code in. Note: this doesn't mean clustering is on, it just means you _can_ turn on clustering. 缺省qmail是支持cluster结构的。
四. LDAP和qmail的安装

  关于LDAP和qmail的安装,在这里,我给出我的LDAP的ldif文件:

  dn: dc=i100, dc=com, dc=cn
  objectclass: top
  objectclass: orgnization

  dn: cn=Manager, dc=i100, dc=com, dc=cn
  uid: Manager
  objectclass: qmailUser
  mail: johnnys@cn.solution100.com

  dn: cn=johnny, dc=i100, dc=com, dc=cn
  cn: johnny
  sn: johnny
  objectclass: top
  objectclass: person
  objectclass: inetOrgPerson
  objectclass: qmailUser
  mail: johnny@i100.com.cn
  mailhost: omni1.i100.com.cn
  mailalternateaddress: johnnys@i100.com.cn
  mailmessagestore: /data/vuser/johnny/
  mailquota: 51200
  uid: johnny
  userpass word: hSAMdaZcsdAOI

  dn: cn=jacky, dc=i100, dc=com, dc=cn
  cn: jacky
  sn: jacky
  objectclass: top
  objectclass: person
  objectclass: inetOrgPerson
  objectclass: qmailUser
  mail: jacky@i100.com.cn
  mailhost: cocoon.i100.com.cn
  mailalternateaddress: jacky@i100.com.cn
  mailmessagestore: /data/vuser/jacky/
  mailquota: 51200
  uid: jacky
  userpassword: hSAMdaZcsdAOI

  dn: cn=denny, dc=i100, dc=com, dc=cn
  cn: denny
  sn: denny
  objectclass: top
  objectclass: person
  objectclass: inetOrgPerson
  objectclass: qmailUser
  mail: denny@i100.com.cn
  mailhost: gw2.i100.com.cn
  mailalternateaddress: denny@i100.com.cn
  mailmessagestore: /var/qmail/vuser/denny/
  mailquota: 51200
  uid: denny
  userpassword: hSAMdaZcsdAOI
以上大家可以看到,我把三个用户的邮件分别存到了不同的机器上。如果用户多,可以把a-n和o-z开头的用户分别存储到不同的机器上。

  五. 基本系统配置

  在三台机器上分别install qmail with qmail-ldap patch.

  需要特别配置的是/var/qmail/control下的相关文件。

  ldapuid ldapgid 这是可以读写用户邮件目录的系统用户的uid和gid,在不同的机器上,会有不同的配置;确保此用户有读写用户邮件目录的权限。

  lda pserver 此文件指定LDAP服务器的ip地址;如果您想ldap有冗余作用,在主LDAP server down了的时候,启用次LDAP server,可以在该文件中指定。

  如:ldap1.i100.com.cn:389 ldap2.i100.com.cn:389 :)

  ldapserver 此文件内容是0或者1,表示是否启动qmail cluster模式。我们当然要启动了。

  echo 1 > /var/qmail/control/ldapserver

  六. Qmail Cluster工作原理

  在允许cluster的邮件环境中,每台主机都可以处理该cluster声明的域的邮件;当一个mail到达主smtp server的时候,Qmail查询LDAP server中有关该用户的mailhost属性,如果mailhost属性指定的不是此server的/var/qmail/control/me中定义的的主机,此邮件被通过qmqp协议转发到mailhost定义的主机上。

  注:所有主机名必须是合法的dns主机名。

  七. 详细配置

  在每台运行qmail的系统上运行qmail-qmqpd进程,才可实现邮件转发。需要设置tcp.qmqp

  文件,此文件中定义可信任的mailhost.

  如: 192.168.0.:allow

  :deny

  然后用tcprules生成tcp.qmqp.cdb文件。
 运行 /usr/local/bin/tc pserver -v -x /var/qmail/control/tcp.qmqp.cdb
  -u 502 -g 501 0 628 /var/qmail/bin/qmail-qmqpd 2>&1   /var/qmail/bin/splogger qmqpd &

  启动qmail-qmqpd进程,监听在628 port。

  在客户端,使用oe将pop3 server设置为主smtp/pop3 server地址(这里是192.168.0.19),就可以收到存储在192.168.0.5和192.168.0.2上用户的邮件。 :)

  八. 有关qmail-qmqpd server

  以上实现了邮件的分布式存储,但是随着用户的增加,主smtp/pop3 server会成为整个系统的瓶颈;而且一旦主smtp/pop3 server down机,整个系统将不再有效。

  解决办法是增加qmqpd server。

  现在主smtp/pop3 server是192.168.0.19,我测试环境是把192.168.0.2同时也作为qmqpd server;由此,一旦192.168.0.19 down机,192.168.0.2仍然可以继续提供smtp/pop3服务。

  我简单的采用手工down掉192.168.0.19,而把pop3和smtp server设置成192.168.0.2的方式,以证实此方法的可行性;并且192.168.0.2并不是此域声明的MX记录。

  以上需要在两台qmqpd server的/var/qmail/control目录中,增加qmqpservers文件,在其中每行写入一台qmqpd server的ip地址。 :)

  九. 其他

  如果需要webmail功能,可以和sqwebmail进行整合。此方案不提供对pop3存储的冗余措施,如果可能,可以采用Raid、NFS或者SAN的解决方案。

这篇关于建立分布式的Qmail邮件系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/924993

相关文章

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

《Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)》本文主要介绍了Golang分布式锁实现,采用Redis+Lua脚本确保原子性,持可重入和自动续期,用于防止超卖及重复下单,具有一定... 目录1 概念应用场景分布式锁必备特性2 思路分析宕机与过期防止误删keyLua保证原子性可重入锁自动

基于MongoDB实现文件的分布式存储

《基于MongoDB实现文件的分布式存储》分布式文件存储的方案有很多,今天分享一个基于mongodb数据库来实现文件的存储,mongodb支持分布式部署,以此来实现文件的分布式存储,需要的朋友可以参考... 目录一、引言二、GridFS 原理剖析三、Spring Boot 集成 GridFS3.1 添加依赖

Redis实现分布式锁全解析之从原理到实践过程

《Redis实现分布式锁全解析之从原理到实践过程》:本文主要介绍Redis实现分布式锁全解析之从原理到实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、背景介绍二、解决方案(一)使用 SETNX 命令(二)设置锁的过期时间(三)解决锁的误删问题(四)Re

Gradle下如何搭建SpringCloud分布式环境

《Gradle下如何搭建SpringCloud分布式环境》:本文主要介绍Gradle下如何搭建SpringCloud分布式环境问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Gradle下搭建SpringCloud分布式环境1.idea配置好gradle2.创建一个空的gr

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

redis+lua实现分布式限流的示例

《redis+lua实现分布式限流的示例》本文主要介绍了redis+lua实现分布式限流的示例,可以实现复杂的限流逻辑,如滑动窗口限流,并且避免了多步操作导致的并发问题,具有一定的参考价值,感兴趣的可... 目录为什么使用Redis+Lua实现分布式限流使用ZSET也可以实现限流,为什么选择lua的方式实现

Seata之分布式事务问题及解决方案

《Seata之分布式事务问题及解决方案》:本文主要介绍Seata之分布式事务问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Seata–分布式事务解决方案简介同类产品对比环境搭建1.微服务2.SQL3.seata-server4.微服务配置事务模式1

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求