建立分布式的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

相关文章

Eureka高可用注册中心registered-replicas没有分布式注册中心

自己在学习过程中发现,如果Eureka挂掉了,其他的Client就跑不起来了,那既然是商业项目,还是要处理好这个问题,所以决定用《Spring Cloud微服务实战》(PDF版在全栈技术交流群中自行获取)中说的“高可用注册中心”。 一开始我yml的配置是这样的 server:port: 8761eureka:instance:hostname: 127.0.0.1client:fetch-r

[分布式网络通讯框架]----Zookeeper客户端基本操作----ls、get、create、set、delete

Zookeeper数据结构 zk客户端常用命令 进入客户端 在bin目录下输入./zkCli.sh 查看根目录下数据ls / 注意:要查看哪一个节点,必须把路径写全 查看节点数据信息 get /第一行代码数据,没有的话表示没有数据 创建节点create /sl 20 /sl为节点的路径,20为节点的数据 注意,不能跨越创建,也就是说,创建sl2的时候,必须确保sl

1,Bochs 建立自己的配置文件

1,安装bochs 2.6.9时,附带安装dlxlinux,在安装目录存在dlxlinux文件夹:包含bochsrc.bxrc文件和hd10meg.img; 打开bochsrc.bxrc文件,这里面有2个重要的地方# what disk images will be used floppya: 1_44=floppya.img, status=inserted floppya.img就是要加

[分布式网络通讯框架]----ZooKeeper下载以及Linux环境下安装与单机模式部署(附带每一步截图)

首先进入apache官网 点击中间的see all Projects->Project List菜单项进入页面 找到zookeeper,进入 在Zookeeper主页的顶部点击菜单Project->Releases,进入Zookeeper发布版本信息页面,如下图: 找到需要下载的版本 进行下载既可,这里我已经下载过3.4.10,所以以下使用3.4.10进行演示其他的步骤。

分布式事务的解决方案(一)

前言应用场景 事务必须满足传统事务的特性,即原子性,一致性,分离性和持久性。但是分布式事务处理过程中, 某些场地比如在电商系统中,当有用户下单后,除了在订单表插入一条记录外,对应商品表的这个商品数量必须减1吧,怎么保证? 在搜索广告系统中,当用户点击某广告后,除了在点击事件表中增加一条记录外, 还得去商家账户表中找到这个商家并扣除广告费吧,怎么保证? 一 本地事务 以用户A

分布式锁实现方案-基于Redis实现的分布式锁

目录 一、基于Lua+看门狗实现 1.1 缓存实体 1.2 延迟队列存储实体 1.3 分布式锁RedisDistributedLockWithDog 1.4 看门狗线程续期 1.5 测试类 1.6 测试结果 1.7 总结 二、RedLock分布式锁 2.1 Redlock分布式锁简介 2.2 RedLock测试例子 2.3 RedLock 加锁核心源码分析 2.4

分布式,容错:10台电脑坏了2台

由10台电脑组成的分布式系统,随机、任意坏了2台,剩下的8台电脑仍然储存着全部信息,可以继续服务。这是怎么做到的? 设N台电脑,坏了H台,要保证上述性质,需要有冗余,总的存储量降低为1/(H+1)。例如: H=1,随机坏1台,总容量变为1/2; H=2,随机坏2台,总容量变为1/3; 特别地,H=0,总容量不变; H=N-1,总容量变为1/N,这时,每台电脑都储存着全部信息,保证任意坏了N-1台

视频讲解|【双层模型】分布式光伏储能系统的优化配置方法

1 主要内容 该讲解视频对应的程序链接为【双层模型】分布式光伏储能系统的优化配置方法,模型参考《分布式光伏储能系统的优化配置方法》,分为上下层求解方式,上层采用粒子群算法确定储能的选址和容量方案,以全年购电成本、网络损耗、光伏运行成本、储能充放电和投资成本为目标;下层采用混合整数规划算法(默认求解器为cplex,也可替换成gurobi),以IEEE33节点配电网为研究对象,通过二阶锥模型求解,以

利用阿里云服务器建立简单的个人博客

感谢阿里云9.9服务器学生计划,让我有机会实现自己小时候的梦想。为了能够写出这篇教程,我就默默把服务器(Ubuntu14.04 64位)重置了,从头开始。你可以查看下网页效果。 克隆git远程库 由于服务器刚刚重置,属于全新的,所以没有装git。 ~# sudo apt-get update #获取最新软件包~# sudo apt-get upgrade # 执行更新操作。~# sudo

【java问答小知识19】一些Java基础的知识,用于想学习Java的小伙伴们建立一些简单的认知以及已经有经验的小伙伴的复习知识点

Java中的"java.util.concurrent.locks.StampedLock"的"tryConvertToReadLock()"方法如何工作? 回答:尝试将当前的写锁转换为读锁,并返回一个表示锁定状态的戳记。 Java中的"java.util.concurrent.locks.StampedLock"的"tryConvertToWriteLock()"方法有什么特点?