RPC 客户端访问跨站点连接性更改

原文发布于 2012 年 5 月 30 日(星期三)

大概两年前,我出席了 TechEd 2010 北美大会的一个题为高可用性设计考虑事项(该链接可能指向英文页面)的会议。会议期间,我介绍了我们在邮箱移动和跨站点数据库事件后 MAPI 连接应如何发生方面所做的改动。很遗憾,在我那次讲演后,由于我们需要介绍的更改太复杂,加之在 Service Pack 1 发布之前没来得及对更改进行测试,因此我们只好将这一功能忍痛割爱。后来尽管我竭力将这项工作提到优先地位,但我们还是未能使这些更改包含在 Service Pack 2 中。

遗憾的是,并非每个功都能像做外科手术那样被切除得干干净净,仍有一部分代码更改实际留在了 SP1 中。例如,您可能已经注意到 Set-DatabaseAvailabilityGroup cmdlet 有一个名为 AllowCrossSiteRPCClientAccess 的属性。您可以将该布尔属性切换为您心目中的内容,但遗憾的是,它不会影响产品中的任何行为更改(我知道…这就是为什么我觉得这张图出奇切题的原因了):

untitled

跨站点 RPC 客户端访问连接性行为(RTM、SP1、SP2 至 SP2-RU2)

不过我跑题了。首先,我们来谈点基本情况。

在 Exchange 2010 中,主要的变化体现在客户端连接和访问邮箱相关数据的方式。与以往的版本不同,客户端不再直接连接到邮箱服务器角色上的信息存储来访问邮箱数据。相反,客户端使用 MAPI RPC,从代表连接用户的邮箱服务器连接到客户端访问服务器 (CAS) 角色上的一组服务以及 CAS 角色访问邮箱数据内的服务。可以把它看作一个抽象层。

基本上,我们做了一个简单更改,使所有邮箱相关的 MAPI 连接都经历客户端访问服务器角色上的 RPC 客户端访问服务。为了方便这一抽象层,我们还做了其他更改,使数据库对象不再是邮箱服务器的子对象。我们在邮箱数据库中添加了一个新属性 RPCClientAccessServer,该属性定义应用于访问特定数据库的 legacyExchangeDN。该属性将 FQDN 作为其值。为确保当发生 CAS 失败时,您仍具有高可用性和容错能力,此值应是负载平衡 CAS 阵列的 FQDN。此负载平衡 FQDN 就是我们称作 RPC 客户端访问服务器阵列的东西。

有关详细信息,请参阅 Brian Day 的文章“揭密 CAS 阵列对象”第 1 部分第 2 部分

典型 Outlook 体验

所有 Outlook 版本在一个数据中心(或一个 Active Directory 站点)场景内具有一致的行为。Outlook 配置文件的 RPC 终结点是 RPC 客户端访问服务器阵列(或者是一个特定 CAS,假如出于某种原因您本应创建而未创建阵列,而如果您不明白我为什么要重申这一点,则请阅读 Brian 的文章)。每当 DGA 内发生故障(数据库故障、服务器故障等)时,RPC 终结点不变,于是 Outlook 继续连接同一 RPC 客户端访问服务器阵列。每当 CAS 阵列中发生故障(CAS 故障、负载平衡器故障等)时,RPC 终结点不变,于是 Outlook 继续尝试连接到 RPC 客户端访问服务器阵列。

所有 Outlook 版本在数据中心切换场景中也具有一致的行为,假定您遵循我们的指导。为什么是这样?好,我来解释一下。在数据中心切换中,您更改了主数据中心 RPC 客户端访问服务器阵列 DNS 条目的 IP 地址,它现在指向备用数据中心的 RPC 客户端访问服务器阵列。自动发现继续将主数据中心 RPC 客户端访问服务器阵列作为 RPC 终结点来分派。现有的 Outlook 客户端无需任何重新配置。一旦客户端上的 DNS 缓存更新,客户端只需连接到现在驻留在备用数据中心的终结点即可。为了充分理解这为什么行得通的道理,您需要领悟到无论客户端还是 CAS 都不真的关心 CAS 存在于哪个站点,它们只是接受它们能够连接以及客户端所连接的 CAS 能够提供对邮箱的访问这些事实。

跨站点数据库行为

若要理解此场景,重要的是理解当您配置多站点 DAG 时,给定数据库的 RPCClientAccessServer 属性通常与具有最低激活首选项值的邮箱数据库的副本在同一 AD 站点中的 RPC 客户端访问服务器阵列关联。例如:

跨站点 DAG-1

图 1:数据库可用性组在两个 Active Directory 站点间拓展

         

当数据库的一个副本在备用数据中心激活时,用户将继续利用 RPC 客户端访问服务器阵列(来自具有最低激活首选项值的邮箱数据库所在的 AD 站点)作为其连接终结点。

跨站点 DAG-2

图 2:MDB1 数据库已在备用 Active Directory 站点激活

如果您查看源 RPC 客户端访问服务器阵列上的 RPC 客户端访问日志,您会看到:

2012-05-06T15:44:29.001Z,67,112,/o=E2010/ou=Exchange Administrative Group (FYDIBOHF23SFPDLT)/cn=Recipients/cn=userded,,OUTLOOK.EXE,14.0.6025.1000,Classic,,,ncacn_ip_tcp,,OwnerLogon,0,00:00:00.0468822,"Logon: Owner, /o=E2010/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=userded in database mdb1 last mounted on MBX-C.contoso.com at 5/6/2012 3:43:23 PM, currently Mounted; LogonId: 5",

当用户不再能够访问具有最低激活首选项值的邮箱数据库所在的 AD 站点中的 RPC 客户端访问服务器阵列时,Outlook 客户端将无法连接到他们的位于对立数据中心的邮箱。换言之,发生了数据中心停机事件,需要执行数据中心切换过程。

查看此行为的更简单的办法是,Outlook 始终连接到配置的 RPC 终结点(假定可以访问它),不管数据库的 RPCClientAccessServer 属性值如何。

系统曾自动更改 RPCClientAccessServer 值吗?

唯一一次系统更改数据库上的 RPCClientAccessServer 值发生在管理员更改激活的数据库副本上的 ActivationPreference 值之时,其结果是它现在具有最低值(即它变成了首选副本),如图 3 所示。

跨站点 DAG-3

图 3:MDB1 数据库已在备用 Active Directory 站点中激活,并且 RPCClientAccessServer 属性已更改

但是,具有现有 Outlook 配置文件的 Outlook 客户端将继续使用旧的 RPC 终结点,而不是新的 RPC 终结点(即使自动发现检测到了变化)。这是因为旧的 RPC 终结点不会将 ecWrongServer 响应返回到客户端。RPC 终结点接受连接;因此,Outlook 会忽略自动发现响应,因为它有一个工作连接。如果旧的 RPC 终结点变得不可访问,Outlook 2007/2010 将更新其设置(但 Outlook 2003 不会更新其设置,因为它不利用自动发现)。任何时候,您都可以通过强制配置文件修复来强制 Outlook 使用新的 RPC 终结点。

如果在跨站点数据库事件后管理员手动更新了 RPCClientAccessServer 值,会发生什么情况?

回到图 2,如果 MBX-C 上的邮箱数据库副本被激活(其 ActivationPreference 值大于 1)后管理员将 RPCClientAccessServer 值手动更新为指向 MDB1 的 cas-sec.contoso.com,则只要旧的 RPC 终结点还可用(配置文件修复会更正此问题),具有现有配置文件的 Outlook 客户端就将继续使用旧的 RPC 终结点,而不是新的 RPC 终结点。RPCClientAccessServer 值更改后创建的 Outlook 配置文件将使用新的 RPC 终结点。

在 Active Directory 站点间移动邮箱

在 Exchange 2010 之前,如果在服务器间移动邮箱,Outlook RPC 终结点会更新为指向承载有包含邮箱的数据库的邮箱服务器(或群集邮箱服务器实例)。邮箱移动完成后,Outlook 客户端用户会收到提示对话框“Exchange 管理员已进行更改,要求您退出并重新启动 Outlook”。重新启动 Outlook 后,客户端将连接到新的 RPC 终结点。

在 Exchange 2010 中,您可能已经注意到,当您在 AD 站点之间移动邮箱时,用户没有收到此对话框。另外,您还可能注意到,用户也没有更新他们的 RPC 终结点来反映与邮箱现在所在的 AD 站点中的邮箱数据库相关联的 RPC 客户端访问服务器阵列。原因在于,旧的 RPC 终结点不会将 ecWrongServer 响应返回到客户端。RPC 终结点接受连接;因此,Outlook 会忽略自动发现响应,因为它有一个工作连接。如果旧的 RPC 终结点变得不可访问,Outlook 将更新其设置(另一方面,Outlook 2003 不会更新其设置,因为它不利用自动发现)。任何时候,您都可以通过强制配置文件修复来强制 Outlook 使用新的 RPC 终结点。

现在,我相信您已理解了上面那张波斯猫图。

未来…SP2 RU3 以及更高版本

我永远不会放弃解决这些问题的希望。我们当中有些人退却了,但 RPC 客户端访问开发团队、Exchange 服务团队和我仍不懈地努力让这两个必要的更改融入产品中。首先是当一个邮箱仅在不同 AD 站点中的数据库间移动时,修正 Outlook 配置文件,其次是跨站点数据库导致 Outlook 使用的 CAS 不是当前激活的数据库位置的最佳选择时,修正 Outlook 配置文件。

邮箱移动

默认情况下,一旦您安装了 SP2 RU3,当您在 AD 站点之间移动邮箱时,所有版本的 Outlook 都会得到重新启动以及 Outlook 配置文件的 RPC 终结点将更新的提示。

如果您查看源 RPC 客户端访问阵列上的 RPC 客户端访问日志,您会看到:

2012-05-06T14:43:03.875Z,37,1,/o=E2010/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=userded,,OUTLOOK.EXE,14.0.6025.1000,Classic,,,ncacn_ip_tcp,,OwnerLogon,1144 (rop::WrongServer),00:00:00.0156267,"Logon: Owner, /o=E2010/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=userded in database mdb2 last mounted on MBX-C.contoso.com at 5/5/2012 9:44:05 PM, currently Mounted; Redirected: this server is not in a preferred site for the database, suggested new server: /o=E2010/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Configuration/cn=Servers/cn=cas-sec.contoso.com",RopHandler: Logon:

请注意,RPC 操作 (ROP) 是 WrongServer(也称 ecWrongServer)。这将强制 Outlook 客户端执行配置文件发现并基于在目录内发现的新信息更新配置文件。该配置文件将更新,并且如果客户端重新启动,客户端就会建立与新的 RPC 终结点的连接。

而既然将问到这个问题,那么哪些其他条件将保证“Exchange 管理员已进行更改,要求您退出并重新启动 Outlook”对话框?

  1. 当您在 New-MoveRequest 上指定 DoNotPreserveMailboxSignature属性时
  2. 当源和目标邮箱数据库有一个不同的公用文件夹层次结构存储区时。
  3. 当您从旧版本的 Exchange 向 Exchange 2010 移动您的邮箱时。

跨站点数据库事件

跨站点数据库事件的行为将取决于 DAG 属性AllowCrossSiteRPCClientAccess 的值。如果将 AllowCrossSiteRPCClientAccess 属性值设置为 $true,则我在上一节中描述的行为就是默认行为。如果数据库在备用数据中心激活,用户将继续利用具有最低激活首选项值的邮箱数据库所在的 AD 站点中的 RPC 客户端访问服务器阵列作为其连接终结点。

如果将 AllowCrossSiteRPCClientAccess 属性值设置为 $false(该属性的默认值是 $false),则 Outlook 配置文件的 RPC 终结点将更新为位于激活和安装此数据库的同一 AD 站点中的 RPC 客户端访问服务器阵列。请注意,RPCClientAccessServer 属性不会更新,因为它定义首选站点。

跨站点 DAG-4

图 4:MDB1 数据库已在备用 Active Directory 站点激活,Outlook 配置文件已自动更新

如果您查看源 RPC 客户端访问服务器阵列上的 RPC 客户端访问日志,您会看到:

2012-05-06T15:12:42.958Z,47,7,/o=E2010/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=userded,,OUTLOOK.EXE,14.0.6025.1000,Classic,,,ncacn_ip_tcp,,OwnerLogon,1144 (rop::WrongServer),00:00:00.0156262,"Logon: Owner, /o=E2010/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=userded in database mdb1 last mounted on MBX-C.contoso.com at 3/6/2012 2:59:30 PM, currently InTransitSameSite; Redirected: this server is not in a preferred site for the database, suggested new server: /o=E2010/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Configuration/cn=Servers/cn=cas-sec.contoso.com",RopHandler: Logon:

像在移动邮箱场景中一样,WrongServer ROP 强制 Outlook 客户端执行配置文件发现并基于在目录内发现的新信息更新配置文件。该配置文件将更新,并且如果客户端重新启动,客户端就会建立与新的 RPC 终结点的连接。

结论

至此,您应该清楚了,使用 SP2 RU3(或更高版本),您可以确保在 AD 站点之间移动的邮箱会正确更新它们的配置文件。此外,在跨站点数据库场景中,您可以控制是否允许跨站点 RPC 连接,或强制 Outlook 客户端使用与激活和安装的数据库位于同一 AD 站点中的 RPC 客户端访问服务器阵列(默认行为)。我想,用下面这张图来结束本文或许很合适吧:

Happy-Lolcat

Ross Smith IV
首席项目经理
Exchange 客户体验

这是一篇本地化的博客文章。请访问 RPC Client Access Cross-Site Connectivity Changes 以查看原文