在研究可用于更好地管理 P8 环境中的存储的技巧之前,先了解一些关于 P8 Content Engine 如何存储文档的背景知识可能有所帮助。
当在 P8 中创建一个文档时,文档的元数据(与文档相关的一些属性,例如标题、创建者、最近修改日期等)存储在 P8 对象存储数据库中。而文档的内容则存储在一个物理位置,这个物理位置由它的存储区域(storage area)属性描述。文档的存储区域可根据存储策略(storage policy)确定,存储策略允许使用配置的标准选择给定的存储区域。如果 P8 对象存储中有不止一个可用区域,那么这一点比较有用。
接下来将更详细地描述存储区域和存储策略。
存储区域表示 P8 中存储内容的物理位置。有 3 种类型的存储区域:
- 数据库存储区域
- 文件存储区域
- 固定存储区域
数据库存储区域
顾名思义,数据库存储区域中的内容存储在 P8 object store 数据库中的一个表中。每个 P8 object store 有且只有一个数据库存储区域。当 object store 相对于文档数量和文档大小来说不是很大时,数据库存储区域比较有用。与其他存储区域类型相比,大约 10MB 以下的较小文档在数据库存储区域中确实有性能优势。但是,不应该将任何超过 100MB 的文档存储在数据库存储区域中。
如果仅使用数据库存储区域,那么备份要简单得多,因为文档内容是随常规对象存储数据库备份一起备份的。
文件存储区域
当文件数量较多,存入较频繁时,文件存储区域是首选的媒介。文件存储区域使用文件系统上的目录结构来存储文档的内容。文档存储在叶子级目录中,并且通过使用哈希算法,文件被均匀地分布在这些叶子目录中。当使用 IBM FileNet Enterprise Manager(FEM)创建文件存储区域时,可以选择创建小型或大型存储区域。对于小型存储区域,P8 创建一个 2 级深度(23x23)的目录结构,其中在叶子级有 529 个目录。对于大型存储区域,P8 创建一个 3 级深度(23x23x23)的目录结构,其中在叶子级有 12,167 个目录。
在大型文件存储区域中,最佳做法是每个目录不超过 5000 个文档,总量不超过大约 61,000,000 个文档。如果需要更大的容量,应该创建多个文件存储区域。
而且,为确保不产生混淆,P8 没有使用文件系统目录来实现 P8 Content Manager 文件夹。P8 在内部使用文件系统目录优化数据的存储和检索。P8 中的文件夹(也就是您在 Workplace 和 FEM 中看到的文件夹)与文件系统文件夹无关。
固定存储区域
P8 使用固定存储区域与其他 IBM 和非 IBM 文档储存库(例如 IBM FileNet Image Services、IBM Tivoli Storage Manager 等)相联系。固定存储区域与固定内容设备定义一起使用,后者包含与其他外部储存库的连接信息。
固定存储区域可用于将 P8 文档存储到外部储存库。在这种情况下,文档内容由 P8 应用程序单独管理,外部储存库仅用作存储设备。
固定存储区域还可以与 P8 的 Content Federation Services(CFS)特性一起使用。这种情况下,外部储存库中的已有文档与 P8 联合,使 P8 应用程序可以使用它们。但是,这些文档的内容仍然在原始的外部储存库中,由 P8 应用程序和本地储存库应用程序共同管理。
和文件存储区域一样,固定存储区域使用底层文件系统上的目录结构。在使用外部存储设备的情况下,该目录结构主要用作文档传输到外部储存库前文档内容的临时 staging 区域。传输后,文档的内容将从这个 staging 区域中移除。staging 区域还可用作某些类型对象的永久存储。存储在固定内容设备上的文档的注释就存储在这个 staging 区域目录结构中。而且,如果在签入(check in)前将文档保存到 Content Engine,那么文档的内容被保存到这个 staging 区域目录。
在使用 CFS 的情况下,staging 区域用于存储 P8 应用程序创建的新版本的联合文档。在此情况下,这些新版本不传回外部储存库,而是保留在 P8 服务器中,成为本地 P8 文档版本。
存储策略是一种选择机制,用于确定最终存储文档内容的存储区域。一个存储策略有一个或多个存储区域与之关联。也可以将一个存储区域与多个存储策略关联。当在 P8 中创建一个文档时,可以使用存储策略,为这个文档的内容选择一个相关联的存储区域。
有 2 种主要方法可通过存储策略充分利用 P8 环境中的存储资源:
-
通过分布 I/O 负载提高吞吐量。
通过这种方法,文档创建时被同时分布到多个存储区域,如图 1 所示。
图 1. 持续存储可用性
本文的 使用存储策略分布 I/O 负载 一节对这种方法作了详细描述。 -
提供持续存储可用性。
该方法每次只使用一个存储区域,如图 2 所示。直到当前存储区域达到预先确定的大小限制时,才使用下一个可用的存储区域。
图 2. 持续存储可用性
本文的 将存储策略用于持续存储可用性 一节对这种方法作了详细描述。
本文后面将详细描述如何使用这些技巧。但是首先需要看看如何在 P8 中创建存储策略。
使用 Create a Storage Policy 向导创建存储策略
如图 3 所示,当在 FEM 中创建一个新的存储策略时,可使用 Create Storage Policy 向导的 Select Content Storage Method 屏幕中的两个选项,要么选择与该策略关联的可用存储区域,要么使用一个筛选器表达式。
图 3. 选择如何将存储区域关联到策略
![Create Storage Policy 向导的 Select Content Storage Method 屏幕。Select Storage Area from a list 单选按钮被选中。](https://i-blog.csdnimg.cn/blog_migrate/3417e32c4187d31a91160a53bdaad10c.png)
如果选择 Select Storage Areas from a list, 那么可以看到 Specify the Storage Location(s) 屏幕(图 4),可以使用该屏幕从可用存储区域中为策略选择存储区域。
图 4. 为策略选择存储区域
![向导的 Specify the Storage Location(s) 屏幕。Available Storage Areas 列出 Default Database Storage Area、fs1、fs2 和 fs3。](https://i-blog.csdnimg.cn/blog_migrate/2758e4273ba93fcae49170621762a6ef.png)
如果选择 Use a Filter Expression(高级选项),那么可以看到 Specify the Filter Expression 屏幕(图 5),可以使用该屏幕输入筛选器表达式。向导将筛选器表达式与可以存储区域的属性进行匹配。满足表达式的存储区域被关联到这个存储策略。本文后面的 使用存储策略筛选器表达式 一节将更详细地讨论存储策略筛选器表达式。
图 5. 为策略使用筛选器表达式
![向导的 Specify the Filter Expression 屏幕。Filter Expression 文本域中未输入内容。](https://i-blog.csdnimg.cn/blog_migrate/db4cd2a41248207e56c940299ac4029d.png)
使用 Create a Storage Area 向导创建存储策略
也可以在创建新存储区域时创建新存储策略。当使用 Create a Storage Area 向导在 FEM 中创建新存储区域时,通过 Specify Storage Policy 屏幕(图 6),可以创建与新存储区域关联的新存储策略,也可以选择一个或多个已有的存储策略与新存储区域相关联。虽然也可以不将新存储区域与新的或已有的存储策略相关联,但不建议这样做。
图 6. 在创建存储区域时创建存储策略
![Create a Storage Area 向导的 Specify Storage Policy 屏幕。Create Storage Policy 被选中,并且输入了值 fs4_sp。](https://i-blog.csdnimg.cn/blog_migrate/9998512bed1afdbf71515b7f6c5f9c6c.png)
您已经理解了什么是存储区域和存储策略,接下来本节描述如何使用它们来确定将文档的内容存储在哪里。
P8 对象存储的默认存储区域
当使用 FEM 创建 P8 对象时,可以为 object store 指定默认存储区域类型。如果选择数据库存储区域作为默认类型,则使用对象存储数据库来存储文档的内容。如果选择文件存储区域或固定存储区域作为默认类型,则根据向导创建所选类型的存储区域。
当为 object store 选择默认存储区域时,将导致创建一个引用默认存储区域的存储策略。然后将该存储策略指定给基本 P8 文档类型。所以,默认情况下,P8 中创建的新文档存储在这个存储区域中。
用于文档的存储区域
可以为 P8 中创建的任何其他文档类型指定存储区域和/或存储策略。然后,这些规定将覆盖 object store 存储默认设置。可以对 P8 文档类型设置存储区域和存储策略,也可以对 P8 文档本身设置存储区域和存储策略。但是,为获得最大的灵活性,不要 直接对文档或文档类型设置存储区域属性。相反,最好只对文档类型设置存储策略属性。
图 7 显示了 Create a Class 向导的 Specify Content Storage Parameters 屏幕,可以通过该屏幕为新的 P8 文档类型指定存储策略。可以从 Storage Policy 下拉列表选择已有的策略,也可以通过单击 New 启动 Create a Storage Policy 向导,为该类型创建新的存储策略。
图 7. 创建文档类型时选择存储策略
![Create a Class 向导的 Specify Content Storage Parameters 屏幕。Use a Storage Policy for storing documents 选项被选中。](https://i-blog.csdnimg.cn/blog_migrate/a6262e7a3946f313a03b614f04f860ad.png)
如果同时为文档和文档类型设置了存储区域和/或存储策略,那么使用以下优先规则确定将哪个存储区域用于文档的内容:
- 为文档设置的存储区域
- 为文档设置的存储策略
- 为文档类型设置的存储区域
- 为文档类型设置的存储策略
签出(check out)文档时,会创建一个 P8 reservation 对象,该对象继承之前版本的文档的存储属性。由于 P8 文档的存储属性只能在创建那个文档的时候设置,因此不能在签出后更改 reservation 对象的存储区域。这样会产生问题,本文后面的 包含签出文档的 Closed 存储区域 一节对此作了描述。
规避这一问题的一种方法是使用 P8 API 在 checkout 命令上为 reservation 对象指定存储属性。清单 1 显示了这样做的示例 Java® 代码。
清单 1. 在 checkout 动作上指定存储属性
PropertiesImpl reservationProps = new PropertiesImpl();
reservationProps.putValue(PropertyNames.STORAGE_POLICY, myStoragePolicy);
//perform checkout with storage properties
doc.checkout(ReservationType.EXCLUSIVE, null, null, reservationProps);
doc.save(RefreshMode.REFRESH, null);
|
当 P8 创建一个 reservation 对象时,使用以下优先规则确定为该 reservation 选择哪个存储区域:
- reservation checkout 上指定的存储区域
- 之前文档版本的存储区域
- reservation checkout 上指定的存储策略
- 之前文档版本的存储策略
如前所述,有两种方法可通过存储策略充分利用 P8 环境中的存储资源。接下来将详细描述每种方法。
可以使用存储策略建立一个存储区域场,通过分布 I/O 负载提高吞吐量。首先,在单独的磁盘轴或 SAN LUN 上创建场中的每个存储区域。然后,创建一个存储策略,该存储策略均匀地将文档分布在这些存储区域上。在这里,场中的所有存储区域都是活动的,这意味着可以在任何一个存储区域中创建文档。
使用以下步骤创建一个存储场,并分布内容的存储。该过程使用 FEM 创建一个存储策略,并为之指定一个存储区域列表。
- 在 FEM 中,右键单击 Storage Policies 节点,从上下文菜单中选择 New Storage Policy。
- 在 Create Storage Policy 向导的 Name and Describe the Storage Policy 屏幕中(图 8),输入存储策略的名称,输入该策略的简要描述,然后单击 Next。
图 8. 命名和描述存储策略
- 在 Select Content Storage Method 屏幕中(图 9),选择 Select Storage Areas from a list,单击 Next。
图 9. 选择内容存储方法
- 如果还没有定义用于该策略的存储区域, 在 Specify the Storage Location(s) 屏幕(图 10)上单击 New 创建它们。
图 10. 为策略创建新的存储区域
- 使用 Create a Storage Area 向导创建要用于该策略的存储区域。对于这个样例场景,有 3 个存储区域被创建,它们的名称分别为 fs1、fs2 和 fs3。
- Specify the Storage Location(s)屏幕(图 11)现在在 Selected Storage Areas 区显示新创建的存储区域(fs1、fs2 和 fs3)。单击 Next 继续。
图 11. 为新策略指定新的存储区域
- 为新策略创建或选择存储区域后,在 Completion 屏幕上单击 Finish。
图 12. 完成 Create Storage Policy 向导
可以使用存储策略建立一个存储区域场,通过逐个循环使用存储区域,提供持续存储可用性。该方法直到当前存储区域达到大小限制时才使用下一个可用存储区域。因此,每次只有一个存储区域是活动的,其他存储区域不活动。这些不活动的存储区域称作备用存储区域。
该方法和上一节描述的方法类似,也是为存储区域场创建一定数量的存储区域。但是,在这里,每次只使用一个存储区域。为实现这一点,每次提供一个 Open 状态的存储区域,剩下的存储区域则处于 Standby 状态。若当前 Open 存储区域已满,那么 Standby 状态的其中一个存储区域自动转变为 Open 状态,供创建新文档的时候使用。之前的存储区域则自动转变为 Closed 状态,这意味着不再将新文档加入到该存储区域。但是仍然可以检索 Closed 存储区域中的任何文档。
通过观察 Standby 存储区域循环地转变为 Open 存储区域的速度,在利用最后一个备用存储区域之前,可以预测何时需要获得额外的存储。因此,必要时可以不断增加额外的备用区域,确保总有存储可用于新文档。
使用以下步骤创建一个存储场,以提供持续存储可用性:
- 遵循之前 使用存储策略分布 I/O 负载 一节中的步骤创建一个存储策略,并为之指定存储区域。
- 对于创建的每个存储区域,设置这个存储区域的最大限制。可以从每个存储区域的 Properties 对话框的 Statistics 选项卡中进行该设置。 在图 13 显示的例子中,将 fs1 存储区域的 Maximum Number of Elements 设为 6000000。
图 13. 存储区域属性对话框中的 Statistics 选项卡
- 接下来,需要将一些存储区域的状态变为 Standby。 为此,首先访问 FEM 上的 object store 属性。 如图 14 所示,右键单击 object store 节点,从上下文菜单中选择 Properties。
图 14. 访问 object store Properties 对话框
- 从 object store Properties 对话框中,选择 Properties 选项卡。
- 如图 15 所示,选择 Custom & System Properties,找到 Storage Areas 属性,选择要设为备用区域的存储区域。
图 15. 从 object store Properties 对话框中选择存储区域
- 在之前步骤选择的存储区域的 Properties 对话框(图 16)上,找到 Resource Status 属性,将它的值从 0 <Open> 改为 2。(值 2 表示 Standby 状态。)
图 16. 在存储区域 Properties 对话框中更改存储区域的资源状态
- 单击 Apply。Resource Status 的值现在显示为 2 <Standby>。
- 单击 OK 关闭存储区域 Properties 对话框。
- 对于其他要设为备用区域的存储区域,重复步骤 5 到 8。记住至少保留一个存储区域处于 Open 状态,以便用它作为新文档的当前活动存储区域。
在上一节中,您显式地指定了将哪些存储区域用于特定的存储策略。本节描述如何使用存储策略筛选器表达式更具体地选择存储区域。例如,可以使用存储策略筛选器根据存储区域的最大大小来选择存储区域。
在为给定存储策略指定存储区域时,筛选器表达式提供了一种更加灵活的机制。用于存储策略的筛选器表达式与用于 FileNet P8 Event Action 订阅的筛选器表达式一致。请参阅 P8 Content Engine Developer 在线帮助中的 FilterExpression 属性 信息,其中有关于 FilterExpression 属性和语法的讨论。
存储策略筛选器用于检查候选存储区域的属性,确定哪些存储区域满足筛选器表达式。在筛选器表达式中,除了 用于维护存储区域统计信息的属性,还可以使用 StorageArea 或其子类(FileStorageArea、DatabaseStorageArea 或 FixedStorageArea)的任何属性。
下面是存储区域筛选器表达式中不能 使用的 StorageArea 属性:
- ContentElementCount
- ContentElementKBytes
- ContentElementsCreated
- ContentElementsDeleted
接下来将描述一些样例筛选器表达式。这些样例的目的是让您知道如何在您自己的环境中利用该功能。
当需要为不同类型的文档使用不同的存储区域时,根据最大大小选择存储区域的筛选器表达式比较有用。
例如,可以将用于媒体文件的文档类型的存储策略指定给具有大容量的磁盘。如果以后需要增加更多的存储,增加的存储区域只要满足指定的大小需求,就会自动被添加到该存储策略。记住在 FEM 中的 Storage Area Statistics 选项卡上为这些存储区域设置最大大小。
例如,用于选择至少有 1 TB(1024 * 1024 * 1024 KB)大小的存储区域的筛选器表达式为:
MaximumSizeKBytes > 1073741824
|
当添加额外存储区域到已有策略时,根据存储区域名称选择存储区域的筛选器表达式会比较有用。不必显式地将新的存储区域添加到已有策略,相反,可以根据用于给定策略的命名惯例为新的存储区域命名。
例如,如果将命名惯例 “starts with fs” 用于所有应该用于存储策略的存储区域,那么只要创建新存储区域时将它命名为以 “fs” 开头的名称,那么这些存储区域将自动被添加到该存储策略。这个示例的筛选器表达式为:
DisplayName LIKE 'fs%'
|
存储区域 duplicate suppression 筛选器
根据存储区域是否启用 duplicate suppression 来选择存储区域的筛选器表达式便于为文档选择这种类型的存储区域。注意,duplicate suppression 功能是 P8 Content Manager 4.5.1 中为数据库和文件存储区域而增加的。
例如,选择启用了 duplicate suppression 的存储区域的筛选器表达式为:
DuplicateSuppressionEnabled = TRUE
|
根据固定内容设备(例如 Tivoli Storage Manager)的保留期限选择固定存储区域的筛选器表达式可用于轻松地为文档选择这种类型的存储。
例如,选择保留期限为 1 至 5 年(期限以分钟为单位指定)的固定存储区域的筛选器表达式为:
ISCLASS(Source,FixedStorageArea) AND RetentionPeriod >= 525600
AND RetentionPeriod <= 2628000
|
如果已经将存储设备挂载在特定目录路径下,那么根据根目录路径选择文件存储区域的筛选器表达式比较有用。
例如,选择根目录在 /san1 下的文件存储区域的筛选器表达式为:
RootDirectoryPath like '/san1/%'
|
存储区域可处于以下几种 ResourceStatus 状态之一。注意,括号中显示的是与每种 ResourceStatus 状态对应的整数值:
- Open (0)
- Closed (1)
- Standby (2)
- Full (3)
- Unavailable (4)
最后两种状态由 P8 服务器在内部设置。当达到配置的存储区域大小限制时,使用 Full。Unavailable 供索引服务使用。不要尝试手动设置这两种状态。
当存储区域转换为非 Open 状态时,新内容不再添加到该存储区域中。但是,仍然可以从该存储区域检索已有的内容。
当存储区域达到某些条件时,P8 服务器自动转换存储区域的状态。如果达到存储区域最大限制(MaximumContentElements 或 MaximumSizeKBytes),那么该存储区域转换为 Full 状态。如果达到存储区域的关闭日期,那么该存储区域转换为 Closed 状态。
当达到指定的存储区域最大值时,可能不会立即自动转换状态。这是出于性能考虑,存储区域统计信息缓存在每个 P8 服务器中。所以,当场中的多个 P8 服务器添加内容时,每个服务器可能在不同的时间检测达到的限制。因此,内容元素的数量或最大大小实际上可能超过原先指定的最大值。所以,在设置最大值时,应考虑到这一点。
而且,当大量存入内容时,存储区域的状态可能从 Open 自动转换为 Full,这将导致正在进行的内容创建事务失败。这是因为当开始创建内容时,存储区域可能仍然处于 Open 状态。但是,当内容上传完毕准备提交时,原先为它指定的存储区域已转换为 Full 状态。在这种情况下,会有一条 “storage area Full” 错误返回到客户端。
如图 17 所示,可以在 FEM 中,通过右键单击存储区域并在上下文菜单中选择 Enable 或 Disable 来启用和禁用存储区域。存储区域在 Open 状态与 Closed 状态之间的这种转换取决于它的当前状态。
注意,备用存储区域被视作离线状态。所以,不 应该用这种方法手动启用它们。否则,您将创建一个 active-active 存储区域场,而这并非您想要的。
图 17. 重新打开 Closed 存储区域
![在 Content Engine Enterprise Manager UI 中右键单击文件存储区域 fs1 并在上下文菜单中选择 Enable。](https://i-blog.csdnimg.cn/blog_migrate/09c8a74ce0675e4b26cbf2ba6f727e05.png)
还可以根据本文前面 将存储策略用于持续存储可用性 一节描述的过程将存储区域的状态手动转换为任何允许的值。
注意,如果存储区域达到某个属性限制(例如最大大小),那么不能启用该存储区域。如果要这么做,首先必须增加限制值,然后再启用存储区域。
例如,如果存储区域由于达到最大内容元素值而被转换为 Closed 状态;那么首先在 FEM 中在该存储区域属性对话框的 Statistics 选项卡中增加这个值。然后就可以启用该存储区域。
当存储区域转换为 Closed(或 Full)状态时,若要签出文档,可能会遇到问题。如本文前面 用于 reservation 的存储区域 一节所述,签出的文档由 P8 reservation 对象表示,该对象的存储区域和存储策略属性是根据之前的文档版本设置的。如果存储区域当前处于 Closed 状态,那么这些签出文档的用户就无法重新将它们签入存储区域。
规避这一问题的最简单的方法是取消原先的签出,然后重新将文档作为新的 reservation 签出。如果文档的存储策略可以选择另一个 Open 存储区域,那么将另一个存储区域指定给这个新签出的文档。否则,签出失败,并返回 “no Open storage areas” 错误。
除了取消签出外,还有一种方法是预先与 P8 管理员联系,请求他/她临时增加限制值,避免存储区域转换关闭。然后便可以签入文档。于是,P8 管理员可以为这个存储区域增加更多空间,或者调整存储策略,允许选择新的存储区域。如果采取后一种做法,P8 管理员应该手动重新关闭原先的存储区域,以防新文档被存储到该区域。
本文描述了 IBM FileNet Content Manager 的存储管理特性。文中对存储区域和存储策略作了概述,并详细介绍了如何使用 FileNet Enterprise Manager 创建它们。此外,本文描述了两种类型的存储场,还提供了一些存储策略筛选器表达式的示例。最后,本文讨论了存储区域状态的转换,以及如何启用和禁用存储区域。