关于队列的内容较多,咱得多分几部分来讲,讲到哪是哪吧。

每当咱在Exchange里查看队列的时候,我们会看到队列分成好几个组,每个邮箱数据库都有自己的目标队列,DAG、AD站点也是,AD林也是一个队列,最后最多的就是外部SMTP域队列。

当传输服务处理队列里的邮件时,它首先会尝试投递队列里的第一封邮件,如果邮件投递成功,传输服务会去告诉传输高可用系统(后边的章节里会介绍到)这封邮件投递成功。如果不成功,那么邮件会留在队列里,然后过段时间进行重试。当重试次数打到某个预设值时,或者是重试的间隔超时,这封邮件就被视为未送达,然后返回发送者一个NDR报告。

Exchange不同版本之间的队列行为各有千秋,但是基本目的都差不多,邮件进入队列直到它们被其他组件检索和处理投递完成。

队列类型:

不同的队列类型对应不同的作用,所以Exchange有多种队列类型也并不奇怪。首先是三种永久性队列

提交队列(Submission Queue):提交队列里保存并组织邮件等待分拣器处理,任何刚刚抵达服务器的邮件都会被放到这个队列里,然后分拣器对此队列中检索邮件,确定收件人的位置和路由,再重定向给相应的合适的其他队列。

无法送达队列(Unreachable Queue):包含着无法路由给目的地的邮件,比如发一封邮件给一个没有MX记录的SMTP域,那么这封邮件就会出现在无法到达队列里,发送给无效收件人的邮件也会出现在这里。Exchange会周期性的重试这个队列里的邮件,当检测到路由更改的时候,也会进行重试。所以这里面的邮件要么就是退回一封NDR,要么就会被成功发送。每台服务器上只有一个无法送达队列,且该队列在平常没有内容的时候是不可见的(EMS和EAC都看不到,除非里头有东西)。

病毒邮件队列(Poison Message Queue):病毒邮件队列也通常为空且不可见,它里边儿保存(隔离)了一些被视为是病毒的邮件(废话),这些邮件通常会导致传输服务崩溃。病毒邮件队列里的邮件不会自动尝试重新提交,管理员需要手动去删除或者恢复它们。

然后是另外三种队列:

传递队列(Delivery Queue):最常用的队列,保存着通过使用SMTP传递到本地或者远程目标的邮件。每个目的地都会有一个传递队列,如果目标服务是传输代理类型的连接器,那么非SMTP目标也会使用传输队列。每个队列中的邮件传递完毕之后,该队列会空置一段时间,然后被自动删除,这个时间可以由Set-TransportService命令里的QueueMaxIdleTime参数来控制,默认为3分钟。

卷影冗余队列(Shadow Redundancy Queues):卷影队列在邮件传输时会保留邮件的冗余副本。

Safety Net:保留传输服务器成功传递的邮件备份。管理工具无法访问Safety Net队列。

关于最后两种负责传输系统冗余的队列,我们在后面传输的高可用里会详细讲到,这里就暂且不提。

队列数据库

在Exchange 2010当中,所有队列信息被存储在一个ESE(Extensible Storage Engine)数据库中,默认位于%ExchangeInstallPath%\TransportRoles\Data\Queue中。使用ESE格式作为队列数据库,而不是面对一堆文件,所以队列数据库(Mail.que)也和邮箱数据库一样,有ESE事务日志文件(Trn*.log),检查点文件(Trn*.chk),以及保留日志文件(Tnres0001.jrs Tnres0002.jrs)。

Exchange 2013的队列数据库与Ex2010和Ex2007的不同之处在于邮件消息是如何存放到队列数据库中的,Ex2007和Ex2010针对每封邮件单独进行操作,邮件量变大意味着大量对数据库里的表的增删操作,而Exchange 2013则将每个小时的邮件聚集到一张表中,比如说在上午9点到10点钟到达的邮件归类到一张表中,10点准的时候,服务器会新建一张表,然后将后续邮件再放进去;如果前面的邮件都发送成功了,就把9点的那张表给删除掉。

EdgeTransport.exe.config文件中可以配置队列数据库的存放位置,你可以通过修改这个来将队列数据库移动到更合适的地方(重启Microsoft Exchange传输服务生效)。如图:

p_w_picpath

下表列出了图中常用几个参数的配置意思,这些参数不是最完全的,可以参照Technet给出的全表(https://technet.microsoft.com/zh-cn/library/bb125022%28v=exchg.150%29.aspx?f=255&MSPPError=-2147217396#QueueDBFiles),对config文件里添加需要的项目并赋值以达到配置目的:

参数

含义

QueueDatabasePath

指定队列数据库的默认位置,如果你要修改该位置,那么到目标位置创建好文件夹,然后停止传输服务,将队列数据库拷贝过去,然后重启传输服务即可

QueueDatabaseLoggingPath

指定队列数据库事务日志文件的存放位置,不一定要和队列数据库放在一起

QueueDatabaseLoggingBufferSize

指定在将事务记录写入到事务日志文件之前用于缓存它们的内存。默认为5MB。

QueueDatabaseLoggingFileSize

指定事务日志文件大小。默认为5M

QueueDatabaseOnlineDefragEnabled

是否为队列数据库打开在线碎片整理(Exchange里翻译为联机……)默认情况下这个选项不存在config文件里,如果要关闭该功能则需要手动添加该项。

QueueDatabaseOnlineDefragSchedule

队列数据库在线碎片整理计划任务开始时间,默认为凌晨1点

QueueDatabaseOnlineDefragTimeToRun

指定在线碎片整理任务的最长时间,默认为3个小时。


如果手动更改了EdgeTransport.exe.config文件之后,每次安装CU之前都记得备份一下自定义的项目,因为CU和SP的更新里都会覆盖这些配置。其他的config文件也是这个道理。

另外,针对队列数据库的移动,Exchange在Scripts文件夹里提供了一个脚本“Move-TransportDatabae.ps1”,可以直接使用这个脚本来进行移动,需要目标文件夹所在磁盘有2GB的空间。打比方我现在要将队列数据库移动到D:\Exchange\Queues文件夹里,那么我就可以这么输入:

.\Move-TransportDatabae –QueueDatabasePath D:\Exchange\Queues\ –QueueDatabaseLoggingPath D:\Exchange\Queues\

今天就先聊到这里,关于队列后边还有很多内容。下一节我们会讲讲队列的处理效率,还有如何去查看队列。下次见!