EXCHANGE 2013 队列

每当咱在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传输服务生效)。如图:

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

如果手动更改了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\

 

队列速率

 

大多数新手管理员都能理解“队列”是某种系统或者组件的性能指标。比如磁盘I/O队列,CPU队列等等。Exchange 2013中邮件队列的运行效率是通过队列的三个属性来计算的。传入率(IncomingRate)和传出率(OutgoingRate)属性代表邮件进入和离开邮件的速率。速率(Velocity)为传出率减去传入率得到的队列消耗速率值。除了以上三个值,还应当考虑邮件数量(MessageCount)属性,该属性显示一个队列中的邮件数量。管理员应该将这些属性综合起来判断一个队列是否正常。

 

传入率和传出率通过计算最后60秒内每5秒传入/传出邮件的数量的平均值来得出。咱们可以举个例子来帮助理解,下表为过去60秒中,每5秒进入队列和离开队列的邮件数量。

进入队列的数值取平均值,即72/12为6,离开队列的平均值为59/12为4.9,那么这时的队列速率为4.9-6= -1.1,也就是说队列速率为负值,进入队列的量大于离开队列的值,这就会导致该队列永远不会被清空,就像是一个水池里,放水的速度小于灌水的速度,那么这个水池永远不会空。这个时候再加上队列里的邮件数量属性加以考虑,如果队列里已经堆积了一定数量邮件,但是队列速率趋近于0,那么说明该队列虽繁忙,但是一直是有效的在处理邮件。而如果说一个队列的Velocity为很大的负值,而且MessageCount值又特别大的话,那就说明这个队列的邮件流是有问题的。

 

查看队列

一般来说,邮件在Exchange中的处理是非常迅速的,如果队列里出现了十几封甚至几十封邮件排队的情况的时候,就说明该当前服务器或者网络处于一个比较高的负载。这时候你可以使用队列查看器或者是Get-Queue命令来查看单独服务器上的队列,也可以使用Get-QueueDigest汇总查看多台服务器上的队列情况。

Get-Queue

下面是一个Get-Queue命令在一台全角色的Exchange服务器上的输出,按MessageCount按升序排列。如果不在命令后面用-Server指定服务器的话,该命令就只返回当前Powershell连接的服务器的队列信息。
Get-Queues -Server EX01 -Filter {MessageCount -gt 20} -SortOrder: -MessageCount

命令当中-SortOrder后边接的是按那种属性排序,属性前面的“+”号代表以升序排列,如果是“-”号则是以降序排列。还可以使用-Filiter参数来匹配一些过滤条件

Exchange中的队列会在没有邮件进出的情况下被关闭,所以你可能在某工作日的高峰期看到队列里出现数据库队列和一堆SMTP目标域队列,也可能在深夜的时候发现其他的队列全消失,只剩下一个提交队列在那。另一种队列清除的情况就是邮件超时,即默认一封邮件如果超过2天没有传递成功,那么就会发送NDR给发件人,至于为啥默认是两天,微软认为超过两天之久的邮件再进行重试发送就没啥意义了,还不如返回给发件人让发件人以另外的方式联系收件人。

为了保证队列的唯一性,传输系统在建立队列的时候会用服务器名加上一个每次增加的数字以区分每个队列,这个数字会在传输服务重启的时候重置掉。

Get-QueueDigest

这条命令前边儿已经提过了,可以将多台服务器上的队列一起汇总显示,算是一个不错的改进。这里多台服务器可以是同一个林中的服务器,或者是同一DAG、同一AD站点的成员,也可以是指定列表中的多台服务器。用法和简单,在后面带上一些参数开关就可以了(-Forest,-DAG后面可以跟多个DAG名字用逗号隔开,-Server逗号隔开多台服务器,-Site),全都是字面意思,而且还有-Filter开关,可以进行过滤筛选。
-----------------------------------

使用Exchange队列查看器

尽管Exchange 2013的控制中心不再是以前那种基于MMC管理控制台的风格,而变成了网页的EAC,但是也有EAC做不到的事情,比如查看队列内容,Ex2013保留了以前的队列查看器,主要还是从易用性上面考虑,虽然使用起来性能不怎么样,队列查看器的内容每5秒刷新一次。但是时常会看到下边儿写着“X个任务进行中……”

队列状态:

每一个队列都会呈现下面几种状态:

活动:正在传输邮件

连接:正在连接下一跃点

就绪:代表该队列的所有邮件都传输成功,目前队列是空的。

重试:代表该队列正在等待重试连接

挂起:管理员手动挂起该队列,但是新邮件仍然会进入队列,但是邮件不会离开队列。

需要注意一下的是,如果是复杂的DAG环境里,那么邮件会被提交到其他Mailbox服务器进行队列而非是在本地服务器进行队列,这是由于Exchange可以将邮件传递给主要传递组里的任意服务器(当然是基于最小cost)。所以有可能你在当前这台服务器上查不到关于该邮件的队列信息,最好还是使用Get-QueueDigest来查看整个DAG里的队列。

队列优先级

Exchange 2013当中,微软增加了一个“优先队列”的功能,打开它时,被标记为高优先级的邮件会比一般邮件先传送,而被标记为低优先级的邮件则会比一般邮件后传送;开启该功能之后呢,分拣器和路由算法不会受到任何影响,仅仅只是传输服务会在每个投递队列里按照优先级排列邮件。

队列优先级的设置主要通过修改EdgeTransport.exe.config配置文件的键值的方式来进行,首先通过PriorityQueuingEnabled键值设置为True开启该功能,接着按照需要调整下表里的细节选项,调整完成之后需要重启传输服务生效(Restart-Service MSExchangeTransport)

从上面的描述里可以看到,EdgeTransport.exe.config与Set-TransportService里的参数是有一个相互影响关系的。Set-TrasportService命令里的关于邮件Delay和Expiration的设置,则直接就对应EdgeTransport.exe.config里关于Normal邮件优先级的设置。

禁用排队优先级时,将忽略 EdgeTransport.exe.config 配置文件中的所有排队优先级邮件限制。Set-TransportService cmdlet 中的所有邮件限制适用于经过邮箱服务器上传输服务的所有邮件。

启用排队优先级时,EdgeTransport.exe.config 配置文件中的排队优先级邮件限制将覆盖 Set-TransportService cmdlet 中对应的邮件限制。Set-TransportService cmdlet 中的其他所有邮件限制仍适用于经过邮箱服务器上传输服务的低优先级、普通优先级和高优先级邮件。

另外还有一个就是Set-Mailbox命令里的DowngradeHighPriorityMessagesEnabled参数,默认为False,设置为True的话,从该MBX服务器发送的任何高优先级的邮件将自动降级为普通优先级。

管理队列

在日常操作过程当中,有可能会碰到需要手动干预调整队列的情况。一部分操作可以通过Exchange队列管理器的UI界面来完成,EMS也提供了一些命令来让管理员可以完成更详细的针对队列的操作,接下来咱们一块看看。

查看并管理队列中的邮件

考虑这样一个场景,你突然发现队列中出现邮件堆积,而且堆积的数量并不减少,且当前服务器的负载并不高,你想搞清楚为何这些邮件会堆积在队里里面。于是你使用Get-Queue命令获取堆积的那个队列的信息,如下:

posted on 2022-07-22 11:46  遇见阿杜  阅读(307)  评论(0编辑  收藏  举报