转自 http://www.ibm.com/developerworks/cn/lotus/inotes-avail/
Mail 是关键企业应用,用户和管理员都希望邮件 24x7 可用。利用 IBM Lotus Notes 和 Lotus Domino,可获取具有 Lotus Domino 集群化和邮件文件副本特性的高可用性。Lotus Notes 客户端包括明确的代码来处理这样的场景:该客户端正与之通信的 Lotus Domino 服务器不再可用。
在短暂的延迟(它需要等待一个连接或通信完成尝试)后,Lotus Notes 客户端通知用户,服务器不再可用,并要求用户确认切换到另一个已知的副本服务器。
然而,对于 Lotus iNotes ,想实现高可用性,需要一些额外基础设施的辅助,比如 Application Delivery Controller (ADC),ADCs 为数据中心提供很多好处,包括:
- 提高应用可用性(通过应用监控和负载均衡)
- 增强安全性(应用防火墙)并提高速度(TCP 和 UDP 优化)
- 从计算密集型任务中卸载服务器:例如,安全套接字层(SSL)加密
Lotus Domino 包含称为 Internet Cluster Manager 的技术,通过该技术能够基于应用,将初始的 URL 重定向到后端邮件服务器。如果在一个会话开始后,实际的邮件服务器变得不可用,然而,不存在恢复与切换到保存有邮件文件副本的其他可用服务器的机制。
正常配置后,负载平衡器能为用户提供无缝的故障转移体验。用户绝不会意识到正与他们交互的原始服务器已不可用;负载平衡器会无缝地检测出这个问题,并向其他合适的服务器发出请求。
有基于软件的负载平衡器和特定的、提供此能力的硬件(比如 ADC)。硬件产品通常会贵一些,但是能够提供更优的性能和能力,并能节约后端服务器的资源。
本文讨论恰当实现 Lotus iNotes 负载均衡的一些问题,并提供特定的、有关行业领先的 F5 Networks BIG-IP Local Traffic Manager (LTM) Advanced ADC 的例子。
我们还将探索创建可支持大多数 Lotus iNotes 邮件部署的 BIG-IP LTM 配置,然后考虑通过使用 BIG-IP LTM ,来提高 Lotus Domino 服务器和用户的性能。
Lotus Domino 邮件文件通常有子目录(例如,mail)和文件名(例如,juser.nsf)。 为实现负载均衡,每个服务器中的任何邮件文件的路径应当是相同的,当到达负载均衡器时,邮件文件的完整路径必须是唯一的(明确的)。
我们来讨论一些能够用于获取高可用性的配置方案。
这一配置方案最简单。采用服务器的全镜像、集群化设置,并且所有的邮件文件都位于一个集群中。两个或三个服务器采用相同的目录架构和邮件文件集,并开启所有服务器的集群复制功能(见图 1)。
图 1 .集群 A 中的两个镜像服务器
![集群 A 中的两个镜像服务器](https://i-blog.csdnimg.cn/blog_migrate/cfbdee8b535dc63ce052956c88e4add2.png)
在本方案中,对于负载均衡器,任何 Lotus iNotes 相关的请求能递交给集群中的任何服务器。
更复杂的级别是有多个类似于配置 1 当中的 Lotus Domino 邮件集群,并且负载平衡器需要将收到的请求发送给合适的后端服务器集(那些处于同一集群的)。
有多种可能的方法来完成这件事:
- 在第一种方法中,每个集群使用一个独特命名的子目录来存储邮件文件,这意味着普通 URLS 包含一个清楚指明集群的段(见图 2 )。更新负载均衡器中的规则来切断这些名称,并关联合适的后端服务器。
图 2. 两台处于不同集群的服务器,每个集群有独特的子目录名称
这些独特集群子目录名称和后端 Lotus Domino 服务器的硬编码列表,必须针对任何对于服务器集群的更改随时更新。 - 在第二种方法中,Lotus iNotes 重定向应用被配置为返回服务器的 Lotus Domain Name System (DNS) 的主邮件服务器主机名部分,作为针对邮件文件生成的 URL 中的一个附加段(就在路径之前)。负载平衡器使用这一附加段来查找 Lotus Domino 集群和相关的后端服务器。
此方法的有个问题,Lotus iNotes 会产生后续的 URLs,其中不再包含段名称。因此,集群标识符必须存储在一个 cookie 当中,这样如果不存在该段时,负载平衡器就会观察该值。 - 在第三种方法中, Lotus Domino 服务器中增加负载平衡器协助代理,通过负载平衡器查询,来动态生成包含该邮件文件副本的相关 Lotus Domino 服务器列表(见图 3 )。
图 3. 处于不同集群的两台服务器
在本方案中,不必在负载平衡器规则中硬编码特定集群名称或者后端 Lotus Domino 服务器 IP 地址。
更加复杂的级别是在 Lotus Domino 集群中有多个服务器的方案,但不是集群中的每个服务器中都存储所有邮件文件。相反地,用户邮件文件稀疏地分布在集群内的部分服务器中。
此方案可能是用于支持负载平衡器的最复杂配置,但它是 Lotus Domino 配置的常用部署方法。这里有一些完成此配置的可能方法:
- 每个驻留有特定邮件文件的、独特的服务器组合,在独特的、邮件文件所驻留的子目录名称中,以某种方式反映出来(见图 4 )。这种组合意味着,通常的 URLs 实际上标识了邮件文件所驻留的集群和服务器子集。
负载平衡器利用这一信息将需求发送给相应的服务器子集。
图 4. 在集群 A 中的三个非镜像服务器 - 另外,Lotus Domino 服务器中增加负载平衡器协助代理,通过负载平衡器查询,来动态生成包含该邮件文件副本的相关 Lotus Domino 服务器列表(见图 5 )。
图 5. 在集群 A 中的三个带有重定向器的非镜像服务器
因此,正如我们对前面选项的讨论所示,最通用的解决方案包括增加 Lotus Domino 服务器来传递有关哪个后端服务器可创建用于平衡当前所收到请求的动态池的信息,同时不需要使用特定路径名来传递相关故障转移信息。
现在,我们来探索有关创建用于实施这一解决方案的通用服务的更多细节,这同样需要负载平衡器能够进行动态查询并使用查询结果。
F5 Networks BIG-IP LTM 提供精密的、基于 Tool Command Language(TCL)的脚本语言,该语言可用于创建 iRule 。每个 iRule 使用一个容易学习的脚本语法,来定制 BIG-IP LTM 如何截获、检查、转换和指示入站或出站应用传输。
利用这一方法,负载均衡环境可智能地将 HTTP 传输路由到正确的 Lotus Domino 服务器。
Lotus Domino 将关于一个特殊集群中的独特 NSF 文件的信息存储在集群数据库目录(cldbdir.nsf)中;然而,该数据库只在特定集群中是独特的。同一域内其他集群的目录数据库包含完全不同的信息。
确定某个独特 NFS 文件是否在特定集群中的方法是,检查最初收到请求的服务器上的集群目录,来确定路径是否已找到。如果是,那就一切顺利。会返回相应的服务器集,并且用户的主服务器会处于所返回列表的最前面,来优先展示。
然而,如果服务器的集群目录内没有该路径, 负载平衡器必须在不同的集群中查询服务器。为了帮助它向正确的集群发送请求,要在 Lotus Domino 目录 names.nsf 中查找信息,在当前用户邮件文件所驻留的集群中定位服务器集。
为完成这一查询,该服务为当前已验证用户查找主邮件服务器,然后查找该服务器所属集群的 ClusterName 。 可在($Clusters)视图中查找该集群,来获取属于该集群的服务器。
我们使用 Notes Formula 语言来创建协助服务,并将关键代码放入 Lotus iNotes 重定向器模板中的表单 ServersLookup 。 当负载均衡器发出请求时,表单 ServersLookup 以 X-Domino-xxxxx 格式,返回两个 HTTP 响应头中的一个,每个都包含由逗号分隔的服务器列表。
当服务器在自己的集群中发现相关路径时,返回 X-Domino-ReplicaServers , 然而,只有当邮件服务器属于其他集群时,才返回 X-Domino-ClusterServers 。
本文中提供了表单 ServersLookup(见附录)。下面的性能检测没有采用协助代理,只检测配置 1 。
DWA85 工作负载施加在两个集群化 Lotus Domino 邮件服务器上,同时进行服务器的复制。每个服务器上有 4000 个并发用户和 2000 个活动用户,采用 Microsoft® Windows® 64 位操作系统和 Lotus Domino 8.5.1 的 32 位版本。
所有测试中,服务器的每个 Lotus Domino 目录都定义了 4000 个用户。测试开始时,每个用户拥有一个大约 256 MB 的非压缩文档,在收件箱文件夹里有 3000 条消息。
在这些测试中,通过启用 Favor Runtime 设置,可得到 Lotus Domino 事务日志,Mail Journaling 也设置为记录所有本地消息。针对消息传递和 Server Operating System 的 Domino Domain Monitoring (DDM) 探测器已启用,所有用户都有用于阻止 10 个外部用户邮件的邮件规则,来用于测试。
利用 Lotus Domino 8.5.1 ,我们在邮件数据库中启动文档压缩功能,这就将所需空间从 250 MB 减少到大约 170 MB 。另外,在一些测试中,在邮件数据库创建之后,启用 Domino Attachment and Object Store (DAOS) 数据库属性,还在邮件箱和邮件日志数据库中启用 DAOS 。
在第一个测试中,针对两台 Lotus Domino 邮件服务器的 SSL 端口,模拟 4000 个 NotesBench DWA85 用户, 在客户端与服务器之间没有部署 BIG-IP LTM 代理。在本测试中,每个服务器有 2000 个活动 DWA 用户。
在第二个测试中,有 4000 个 NotesBench DWA85 模拟用户,经过 BIG-IP LTM 代理,然后访问邮件服务器。在本测试中,禁用了 Lotus Domino 邮件服务器的响应缓存和 GZIP 压缩,采用如下的 Notes.ini 设置:
Notes_wa_GZIP_Disable=1HTTPDisableUrlCache=1
也禁用了 Lotus Domino 目录服务器文档中 HTTP 服务器的 SSL 端口。在测试过程中,BIG-IP LTM 代理服务器负责处理缓存、GZIP 压缩和 SSL 加密。
表 1-3 总结了所有的硬件规范
表 1. 服务器 1 的硬件配置
硬件 | 规范 |
---|---|
型号 | Intel 64 位平台 |
测试用处理器/速度 | Intel® Xeon MP configured as 2 quad-core processor /3.67 GHz |
内存 | 8 GB |
活动物理驱动器 | 42 |
活动逻辑卷 | 3 |
操作系统 | Microsoft Windows 2003 X64 |
Lotus Domino 版本 | Lotus Domino 8.5.1,32 位应用 |
当 BIG-IP LTM 卸载 SSL/gzip 时使用的 Notes.ini 设置 | iNotes_wa_GZIP_Disable=1 HTTPDisableUrlCache=1 |
表 2. 服务器 2 的硬件配置
硬件 | 规范 |
---|---|
型号 | Intel 64 位平台 |
测试用处理器/速度 | Intel Xeon MP configured as 2 quad-core processor /3.06 GHz |
内存 | 12 GB |
活动物理驱动器 | 42 |
活动逻辑卷 | 3 |
操作系统 | Microsoft Windows 2003 X64 |
Lotus Domino 版本 | Lotus Domino 8.5.1, 32 位应用 |
当 BIG-IP LTM 卸载 SSL/gzip 时使用的 Notes.ini 设置 | iNotes_wa_GZIP_Disable=1 HTTPDisableUrlCache=1 |
表 3. 服务器 3 的硬件配置
硬件 | 规范 |
---|---|
型号 | 6900 |
2x dual-core | |
内存 | 8 GB |
活动闪存驱动器 | 8 GB |
活动硬件驱动器 | 2 x 320 GB |
操作系统 | 10.1 |
图 6 显示配置基线。
图 6. 配置基线
![配置基线](https://i-blog.csdnimg.cn/blog_migrate/3ee2efceb3117b4a2d378c134807f211.png)
采用两台配有双 3.6 GHz Xeon 处理器,8 GB 物理内存的 IBM 3850s 服务器,每个服务器连接一个配有 42 块光纤盘的 DS4300 ,采用 Microsoft Windows 2003 Server Enterprise 64-bit Edition 操作系统(见图 7 )。Linux® 服务器的 NotesBench 驱动加载系统具有处理 4000 DWA85 模拟用户的能力。
图 7. 对 BIG-IP LTM 6900 进行测试配置
![对 BIG-IP LTM 6900 进行测试配置](https://i-blog.csdnimg.cn/blog_migrate/a1aabf1e44d8b0f35b4ac9acd68274e8.png)
以下是对 BIG-IP LTM 的设置:
- SNAT: Set to Automap
- Nagle: Disabled
- SSL: Enabled
- Send buffer: 262144
- Recv window: 262144
- HTTP Profile:
- Defaults from http-wan-optimized-compression-caching
- Compress: Enabled
- Compress GZIP level: 5
- RAM cache size: 200 MB
Lotus Notes 的设置为:
- SSL: Disabled
- HTTP Caching: Disabled
- GZIP: Disabled
表 4 展示了两个配置的关键度量值。
表 4. 关键结果
测试 | 基线 | BIP-IP LTM | 提高百分比 |
---|---|---|---|
事务/分钟 | 6028 | 6044 | -0.27% |
响应时间(单位:秒) | 0.338 | 0.083 | 75.44% |
处理器忙 | 29.4 | 20.9 | 28.91% |
磁盘 I/O Ops/秒 | 525 | 530 | -0.95% |
磁盘 Kbytes/秒 | 4406 | 4308 | 2.22% |
在 Lotus Domino 服务器中,显示有意义的单个请求响应时间和处理器繁忙级别的区别。通过正确部署 BIGIP ADC ,平均响应时间提高了 75%(见图 8 )。
换句话说,经过该设备比直接连接 Lotus Domino 服务器的响应速度快四倍。这一提高的原因之一是 ADC 持续打开到 Lotus Domino 服务器的连接,并能更高效地使用这些通道来进行后续的请求。
而且,Lotus Domino 服务器上处理器的繁忙级别少于未使用 ADC 时的 28% ;更低的处理器繁忙级别允许 Lotus Domino 服务器能保持更多的并发用户。
图 8. 性能提高百分比
![性能提高百分比](http://www.ibm.com/developerworks/cn/lotus/inotes-avail/image008.gif)
注意:我们还模拟与邮件客户端进行一些关键互动的低速连接,来度量客户端响应时间。 当带宽成为关键限定因素时, 我们不度量我们所计时的关键用户操作的任何有意义的提高。
想获取 Lotus iNotes 的高可用性,需要使用软件负载均衡器或者硬件 ADC 结合 Lotus Domino 集群化,以及包含镜像配置和稀疏集群的拓扑。
支持全镜像集群相对简单,但正确使用稀疏集群比较复杂。我们还介绍一些新的服务器端逻辑,来帮助理解稀疏集群拓扑。
这样当集群中的一台服务器宕机时,稀疏集群能够在集群中将负载平均地分配给剩余的服务器,因此不必在集群内的每台服务器上为每个用户保留邮件文件的副本。
性能运行还展示了,部署 ADC 后,明显节省了 Lotus Domino 服务器的处理器资源。此外,该测试证实了,对于各种请求的响应时间有明显的优化,也因此缩短了具有合理带宽的连接用户的响应时间。
对于想采用更以 Web 为中心的解决方案的组织,在软件负载均衡器或者硬件 ADC 方面的投资,能够明显提高 Lotus Domino 邮件服务器的用户响应时间并降低处理器负载。
表单 ServersLookup 有一个称为 $$HTMLHead 的,文本类型的 “Computed for display” 字段。该字段包含此处所展示的公式。 其中增加了调试语句,这样,如果在浏览器中手动打开该表单,就可以看到公式的结果。
要手动打开表单,发起如下请求:
http://mail.acme.ibm.com/iwaredir.nsf/ServersLookup?OpenForm&nsfpath=mail\jsmith.nsftmpDebug := ""; tmpNSFPath := @ReplaceSubstring(@URLDecode ( "Domino"; @UrlQueryString("nsfpath") );"/";"\\"); tmpServers := @DbLookup( "":"" ; "":"cldbdir.nsf" ; "($Pathname)" ; tmpNSFPath; "CanonicalServername"); tmpServers:=@If(@IsError(tmpServers);"";tmpServers); REM {Lookup home mail server }; tmpHomeServer:=@Name([Canonicalize];@NameLookup( [NoUpdate]; @UserName; "MailServer" )); REM {Is Home Mail server in list of servers, then move this up to the front of the list}; tmpServers := @If(@IsMember(tmpHomeServer;tmpServers); tmpHomeServer : @Transform(tmpServers;"x";@If(x=tmpHomeServer;@Nothing;x)) ;tmpServers); tmpDebug := tmpDebug + "ReplicaServers:" + @Implode(tmpServers;","); tmpDNSNames := ""; tmpClusterName := ""; tmpClusterServers := ""; REM {If no servers found, then db is in a different cluster, return list of cluster servers, with home server in front of list}; tmpServers := @If(tmpServers="" | @Elements(tmpServers)=0; @Do( tmpDebug := tmpDebug + "Looking for cluster servers;"; tmpClusterName := @Subset(@DbLookup("":""; "":"names.nsf"; "($ServersLookup)"; tmpHomeServer; "ClusterName"); 1); tmpClusterServers := @DbLookup( "":""; "":"names.nsf"; "($Clusters)"; tmpClusterName; "$0"); tmpClusterServers := @Transform(tmpClusterServers;"x"; @If(x=tmpHomeServer;@Nothing;@Name([Canonicalize];x))); tmpClusterServers := @If(@IsMember(tmpHomeServer;tmpClusterServers); tmpHomeServer : @Transform(tmpClusterServers;"x"; @If(x=tmpHomeServer;@Nothing;x));tmpClusterServers); tmpClusterServers); tmpServers); tmpLimit:=@Elements(tmpServers)+1; @For(n:=1; n0;tmpDNSNames+",";"") + @LowerCase(@If (tmpHTTPHostNameALT!="";tmpHTTPHostNameALT;tmpServerFQDN)) ); @If(tmpClusterName="";@SetHTTPHeader("X-Domino-ReplicaServers";tmpDNSNames); @SetHTTPHeader("X-Domino-ClusterServers";tmpDNSNames)); @SetHTTPHeader("Cache-control";"no-store"); @If(tmpDebug="";"";"") |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14751907/viewspace-665641/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/14751907/viewspace-665641/