信息存储的责任
上一次修改主题: 2005-05-23
Exchange 存储的主要责任是维护 Exchange 数据库并管理事务,以便为其他服务和邮件客户端提供对邮箱和公用文件夹的访问支持。Exchange 存储另外还负责空间管理(管理物理数据库文件)和缓冲管理(管理 Store.exe 进程的内存使用情况)。
与其他 Exchange 服务交互
Exchange 存储与很多其他服务一前一后配合工作,以执行典型的 Exchange 操作。下表是典型的 Exchange 操作所必需的服务摘要。注意,哪些服务在特定 Exchange 服务器上可用取决于服务器的配置。
Exchange Server 2003 操作必需的服务
服务名 | 描述 |
---|---|
Distributed Transaction Coordinator |
对分布在跨多个数据库、邮件队列和文件系统的事务进行协调。 |
Event Log |
将 Exchange Server 和其他应用程序发出的事件信息、警告和错误消息记录在日志中。 |
IIS Admin Service |
允许在 IIS 管理单元中管理 Exchange HTTP 虚拟服务器。 |
Microsoft Exchange Event |
监视文件夹并生成 Exchange Server 5.5 应用程序的事件。 |
Microsoft Exchange IMAP4 |
提供 Exchange IMAP4 服务。 |
Microsoft Exchange Information Store |
管理 Exchange 信息存储。 |
Microsoft Exchange MTA Stacks |
提供 Exchange X.400 服务。 |
Microsoft Exchange POP3 |
提供 Exchange POP3 服务。 |
Microsoft Exchange Routing Engine |
处理 Exchange 邮件路由和链路状态信息。 |
Microsoft Exchange Site Replication Service |
在组织中复制 Exchange 信息。 |
Microsoft Exchange System Attendant 服务 |
监视 Exchange 并提供必需的服务。 |
网络新闻传输协议 (NNTP) |
跨网络传输新闻组邮件。 |
简单邮件传输协议 (SMTP) |
跨邮件网络传输电子邮件。 |
World Wide Web Publishing 服务 |
为 Exchange Server(Microsoft Outlook Web Access、Microsoft Outlook Mobile Access 和 Microsoft Exchange ActiveSync)以及 Internet 信息服务 (IIS) 提供 HTTP 服务。 |
空间管理
数据库文件中的两种空间类型是已拥有的空间和可用空间。每个表、索引和长值 B 树都有自己的一列已拥有的页和可用页。可用空间是可以用来存储新数据的一系列页。可用空间始终是已拥有的空间的子集。
- 已拥有的空间 ESE 在三级层次结构中组织已拥有的空间。这些级别是数据库根、表以及索引和长值。数据库根拥有数据库中的所有空间。表请求空间块,然后拥有这些空间块(像数据库根一样)。索引和长值树从表请求空间,而表又从数据库根拥有空间块。若要减少请求数和避免空间出现碎片,需要以块(通常 16 页或 64 KB)为单位请求更多空间。
- 可用空间 可用空间略微不同。页可以在数据库根、表级别或作为索引或长值可用。页只在一个级别可用。
数据库碎片整理
碎片整理是 ESE 遍历每个 B 树数据库的底部页(叶页)的过程。ESE 确定它是否可以将相邻页的字符串合并成单个页。这将释放页并让它们返回到表的可用空间中。相关页在数据库文件内部的位置和连续性会被尽可能最佳化。
碎片整理可以按两个模式执行:
- 联机碎片整理 该模式作为系统维护过程(默认情况下在 1:00 A.M. 和 6:00 A.M. 之间)的一部分运行。如果 ESE 无法处理完整个数据库,它会通知您它在哪里停止,并在下一次 Exchange 存储维护窗口发生时从该点继续。
联机碎片整理有以下限制:- 数据库文件 (.edb) 内部的可用空间不会返回给文件系统。而是在联机碎片整理完成之后,由 Microsoft Exchange Information Store 服务在应用程序事件日志中记录一个事件(事件 ID 1221),该事件将指示可用的空闲数据库空间的数量。在物理数据库文件增长之前,如果需要,将使用该可用空间。
- 数据库中的可用空间采用的形式是可以用来存储新数据的一组页。可用空间称为空间树。空间树是作为 B 树占用的,只要需要将新数据块添加到数据库中,就会对该 B 树进行搜索。在联机碎片整理期间不会删除空间树,空间树将保持碎片状态,直到执行脱机碎片整理。
- 不回收被删除的列 ID 和长值 ID。
- 将辅助索引重新排列但不重建它(如果有索引损坏,不会修复它)。
- 不支持数据库文件 (.edb) 中的垂直合并(不折叠树级别)。
- 脱机碎片整理 这是由管理员通过运行针对其数据库的 ESEUTIL 实用程序来完成的手动过程。Eseutil.exe 是位于 \Program Files\Exchsrvr\Bin 目录中的命令行实用程序。
注意: 如果邮箱或公用文件夹存储是在您试图使用 ESEUTIL.exe 来压缩它的数据库时装入的,那么将返回错误代码 -1032 (JET_errFileAccessDenied)。记住,在对数据库进行脱机碎片整理之前和之后都要执行完整备份。
缓冲管理
ESE 的基本设计目标是避免磁盘访问。为了这样做,ESE 使用了一个全面的缓冲管理器。缓冲管理器执行以下两个作业:
- 它决定缓冲缓存应当使用多少内存。这是使用称为动态缓冲分配 (DBA) 的内部功能来完成的。
- 它决定了哪个页应当留在缓冲缓存中。由一个叫做 LRU-K 的算法做出该决定。
动态缓冲分配
动态缓冲分配 (DBA) 是在 Exchange Server 5.5 中首先引入的功能,它已经成为管理 Microsoft Exchange Information Store 服务内存使用情况的主要因素。ESE 连续监视缓存状态。它确认系统的要求,并在需要时对缓存大小做出调整。
动态缓冲分配使用四个规则来管理缓存应当有多大或多小:
- 可用内存越多,Exchange 存储的工作集增长得越快。
- 缓存内存越多,Exchange 存储的工作集收缩得越快。
- 内存负载越高,Exchange 存储的工作集增长得越快。
- 可用内存负载越高,Exchange 存储的工作集收缩得越快。
DBA 使用专利公式来确定缓冲缓存大小应当随时间推移如何增长或收缩。
LRU-K 替换算法
DBA 管理缓冲区的大小。随着时间的推移,将在缓冲区中填充所缓存的数据库页。为了给更多页留出空间,必须从缓存中删除更早的页。DBA 提供的一个机制可以确定哪些页留在缓存中。数据库系统传统上使用最近最少使用 (LRU) 算法,这种算法由 Denning 在 1968 年首先描述(P. J. Denning,“Resource Allocation In Multiprocess Computer Systems”,Massachusetts Institute of Technology,Cambridge,MA,1968 年)。当需要缓冲空间时,LRU 会从内存缓冲区中丢弃最长时间未被访问的页。
但是,LRU 算法也有缺点。它仅仅根据最后引用的时间来决定从内存中丢弃哪一页。具体地说,LRU 无法区分有相对频繁引用的页和有非常少引用的页。例如,某一页可能已被访问了 100 次,它后面的另一页则只被访问了一次。按照 LRU,被访问了 100 次的页会被丢弃,而不管该页比只被访问一次的另一页更受欢迎这一事实。
为了优化数据库磁盘缓冲,1993 年引入了 LRU-K 算法(Elizabeth J. O'Neil、Patrick E. O'Neil、Gerhard Weikum,“The LRU-K Page Replacement Algorithm For Database Disk Buffering”。SIGMOD 会议 1993 年)。该算法通过区别对待频繁引用的页和很少引用的页,从而超越了传统缓冲算法。Exchange Server 2003 使用 LRU-K 算法。
LRU-K 算法跟踪最后一次对内存页进行 K 引用的时间(ESE 将 K 的默认值设置为 2),并按照所期望的未来行为,使用该统计信息对页进行等级排序。基于该统计信息,ESE 可以决定要丢弃哪个内存驻留页,以便为必须读入内存中的最近访问过的页腾出空间。因为有关被引用的页的统计信息被经常收集,因此 LRU-K 算法可以实时地适应不断更改的访问模式。该算法相当简单,因此几乎不会带来多少簿记开销。它使用每个页的最后两个引用或更多的引用(通常是最后一个 K 引用,在这里,K 大于或等于 2)来决定应当丢弃哪个页。