Exchange Server 中的托管存储

托管存储是信息存储 (也称为 2016 Exchange Server 2016 Exchange Server 2019 Exchange Server的存储) 进程的名称。 Exchange Server 2013 中引入的托管存储使用控制器/辅助进程模型,可提供存储进程隔离和更快的数据库故障转移。 托管存储还使用静态数据库缓存机制,该机制替换 Exchange 早期版本中的动态缓冲区算法。

托管存储使用的多进程模型由邮箱服务器上的以下进程组成:

  • 整个 Exchange 服务器 (Microsoft.Exchange.Store.Service.exe 的单个存储服务控制器进程,也称为 MSExchangeIS) 。

  • 每个装载的数据库 (Microsoft.Exchange.Store.Worker.exe) 的一个工作进程。 装入数据库时,新的工作进程被实例化为仅服务该数据库。 当数据库被卸除时,则该数据库的工作进程将终止。

例如,如果在邮箱服务器上装载了 40 个邮箱数据库,则托管存储将运行 41 个进程:每个数据库各运行一个进程,一个进程用于存储服务进程控制器。 存储过程控制器监视服务器上所有存储工作进程的运行状况。 强制或意外终止 Microsoft.Exchange.Store.Service.exe 会导致服务器上的所有活动数据库副本立即故障转移。

托管存储还与 Microsoft Exchange 复制服务 (MSExchangeRepl.exe) 和活动管理器紧密集成。 控制器进程、辅助进程和复制服务协同工作,以提供更高的可用性和可靠性,如以下列表所述:

  • Microsoft Exchange 复制服务进程 (MSExchangeRepl.exe)

    • 负责向应用商店发出装载和卸载操作。

    • 针对存储、可扩展存储引擎 (ESE) 和托管可用性响应者报告的存储或数据库故障启动恢复操作。

    • 检测意外的数据库故障。

    • 为管理任务提供管理界面。

  • 存储服务进程/控制器 (Microsoft.Exchange.Store.Service.exe)

    • 根据从复制服务收到的装载和卸载操作管理每个工作进程生存期。

    • 处理来自 Windows 服务控制管理器的传入请求。

    • 在检测到存储工作进程问题时记录失败项, (例如挂起或意外退出) 。

    • 终止响应故障转移事件中的存储工作进程。

  • 存储工作进程 (Microsoft.Exchange.Store.Worker.exe)

    • 负责对数据库上的邮箱执行 RPC 操作。

    • 工作进程中的 RPC 终结点实例是数据库 GUID。

    • 为数据库提供数据库缓存。

静态数据库缓存算法

与以前版本的 Exchange 中使用的 动态缓冲区分配 相比,托管存储使用简单直接的算法来确定数据库缓存。 为每个数据库缓存分配的内存 (即,每个存储工作进程) 基于本地数据库副本数和 Set-MailboxServer cmdlet 上 MaximumActiveDatabases 参数的配置值, (默认值为$null或空白) 。 如果 MaximumActiveDatabases 的值大于当前数据库副本数,则根据数据库副本数计算缓存。

静态算法根据服务器中安装的物理 RAM 量,为每个存储工作进程的 ESE 缓存分配内存。 这称为数据库 的最大缓存目标 。 服务器总内存的 25% 分配给 ESE 缓存,称为 服务器缓存大小目标

注意

可以重写服务器缓存大小目标,因此,通过使用 msExchESEParamCacheSizeMax Active Directory 中 InformationStore 对象的 属性,分配给 ESE 缓存存储的内存量 (配置的值为要跨所有存储进程分配的 32 KB 页数) 。

此缓存的静态量分配到主动和被动副本。 仅当为活动数据库副本提供服务时,才会为存储工作进程分配最大缓存目标。 20% 的最大缓存目标分配给被动数据库副本。 存储保留剩余部分,并在数据库从被动转为主动时将剩余部分分配给工作进程。

只在启动存储时计算最大缓存目标。 因此,如果添加或删除数据库或数据库副本,则必须重启存储控制器服务 (MSExchangeIS) 以对缓存进行相应调整。 如果未重启服务,则新数据库的缓存大小目标将小于上次服务启动之前存在的数据库。 在此方案中,在重新启动 MSExchangeIS 之前,数据库缓存大小目标的总和可能会超过服务器缓存大小目标。

示例数据库缓存计算

下面是基于邮箱服务器的内存和数据库配置的示例数据库缓存计算。

示例 1

邮箱服务器配置:

  • 48 GB 内存

  • 两个主动数据库和两个被动数据库

  • MaximumActiveDatabases 参数:未配置

每个活动数据库复制工作进程的数据库缓存量为 3 GB,每个被动数据库复制辅助进程为 0.6 GB。 下面是这些值的计算方式:

  • 服务器缓存大小目标:内存量的 25%:48 GB * 0.25 = 12 GB

  • 数据库最大缓存目标:将服务器缓存大小目标除以主动和被动数据库总数:12 GB/4 个数据库 = 3 GB

  • 用于被动数据库副本的内存:数据库最大缓存目标的 20%:3 GB * 0.20 = 0.6 GB

分配给服务器缓存大小目标的 12 GB 内存中:

  • 数据库工作进程将使用 7.2 GB。

  • 信息存储将为两个被动数据库副本保留 4.8 GB,以防它们成为活动副本。 如果发生这种情况,他们将使用其最大缓存目标 3 GB。

示例 2

邮箱服务器配置:

  • 48 GB 内存

  • 两个主动数据库和两个被动数据库

  • MaximumActiveDatabases 参数:2

每个活动数据库复制工作进程的数据库缓存量为 5 GB,每个被动数据库复制工作进程为 0.2 GB。 下面是这些值的计算方式:

  • 服务器缓存大小目标:内存量的 25%:48 GB * 0.25 = 12 GB

  • 数据库最大缓存目标:将服务器缓存大小目标除以以下项之和:

    • 活动数据库的数量

    • 被动数据库数的 20%

    12 GB/ (2A + (2P * 0.20) ) = 5 GB

  • 用于被动数据库副本的内存:数据库最大缓存目标的 20%:5 GB * 0.20 = 1 GB

分配给服务器缓存大小目标的 12 GB 内存中:

  • 数据库工作进程将使用 12 GB

  • 信息存储不会为两个被动数据库副本保留任何内存,因为它们不能成为活动副本, (MaximumActiveDatabases 配置为值 2,并且服务器上已有 2 个活动数据库副本) 。