升级Adobe Experience Manager的一个关键挑战是执行就地升级时与作者环境相关的停机时间。 内容作者在升级过程中将无法访问环境。 因此,最好尽量缩短执行升级所花费的时间。 对于大型存储库,特别是AEM Assets项目,它通常拥有大型数据存储和每小时高级别的资产上传,重新索引Oak索引需要相当大比例的升级时间。
本节介绍如何在执行升级之前使用Oak-run工具重新索引存储库,从而减少实际升级期间的停机时间。所显示的步骤可应用于版本AEM 6.4及更高版本的Lucene索引。
新版AEM在功能集扩展时对Oak索引定义进行了更改。 升级AEM实例时,对Oak索引所做的更改会强制重新索引。 资产部署需要重新索引,因为会提取和索引资产(例如pdf文件中的文本)中的文本。 使用MongoMK存储库,数据会通过网络持久保存,从而进一步增加重新建立索引所需的时间。
大多数客户在升级过程中遇到的问题是减少停机时间。 解决方案是在升级过程中跳过重新索引活动。这可以通过创建新的插件之前执行升级,然后在升级过程中直接导入来实现。
其构思是在升级之前,使用Oak-run工具根据目标AEM版本的索引定义创建索引。 上图显示了脱机重新索引的方法。
此外,这是方法中所述步骤的顺序:
要在AEM中启用完整索引,将提取来自二进制文本(如PDF)的文本并将其添加到索引中。 这通常是索引过程中一个昂贵的步骤。 文本提取是一个优化步骤,尤其是在资源存储库存储大量二进制文件时,它们应重新索引。
系统中存储的二进制文本可以使用tika库中的oak-run工具进行提取。 可以在升级前克隆生产系统,并可用于此文本提取过程。 然后,此过程将通过执行以下步骤创建文本存储:
1. 遍历存储库并收集二进制文件的详细信息
此步骤将生成一个CSV文件,其中包含二进制元组,其中包含路径和blob ID。
从要从中创建索引的目录中执行以下命令。 以下示例假定存储库主目录。
java java -jar oak-run.jar tika <nodestore path> --fds-path <datastore path> --data-file text-extraction/oak-binary-stats.csv --generate
其中nodestore path
是mongo_ur
或crx-quickstart/repository/segmentstore/
使用--fake-ds-path=temp
参数而不是–fds-path
加快进程。
2.重用现有索引中可用的二进制文本存储
从现有系统转储索引数据并提取文本存储。
您可以使用以下命令转储现有索引数据:
java -jar oak-run.jar index <nodestore path> --fds-path=<datastore path> --index-dump
其中nodestore path
是mongo_ur
或crx-quickstart/repository/segmentstore/
然后,使用上述索引转储填充存储:
java -jar oak-run.jar tika --data-file text-extraction/oak-binary-stats.csv --store-path text-extraction/store --index-dir ./indexing-result/index-dumps/<oak-index-name>/data populate
其中oak-index-name
是全文索引的名称,例如“lucene”。
3.使用上述步骤中缺失的二进制文件的tika库运行文本提取进程
java -cp oak-run.jar:tika-app-1.21.jar org.apache.jackrabbit.oak.run.Main tika --data-file text-extraction/oak-binary-stats.csv --store-path text-extraction/store --fds-path <datastore path> extract
其中datastore path
是二进制数据存储的路径。
将来可以更新创建的文本存储并重复使用,以重新为场景建立索引。
有关文本提取过程的详细信息,请参阅Oak-run文档。
在升级之前脱机创建Lucene索引。 如果使用MongoMK,建议直接在MongoMk节点之一上运行它,因为这避免了网络开销。
要脱机创建索引,请执行以下步骤:
1.为目标AEM版本生成Oak Lucene索引定义
转储现有索引定义。 使用AdobeAEM版和oak-run的目标Granite存储库捆绑生成了经过更改的索引定义。
要从source AEM实例转储索引定义,请运行以下命令:
有关倾销索引定义的详细信息,请查阅Oak文档。
java -jar oak-run.jar index --fds-path <datastore path> <nodestore path> --index-definitions
其中datastore path
和nodestore path
来自源 AEM实例。
然后,使用目标版本的Granite存储库包从目标 AEM版本生成索引定义。
java -cp oak-run.jar:bundle-com.adobe.granite.repository.jar org.apache.jackrabbit.oak.index.IndexDefinitionUpdater --in indexing-definitions_source.json --out merge-index-definitions_target.json --initializer com.adobe.granite.repository.impl.GraniteContent
仅从oak-run-1.12.0
版本开始支持上述索引定义创建过程。 定位是使用Granite存储库捆绑com.adobe.granite.repository-x.x.xx.jar
完成的。
上述步骤创建名为merge-index-definitions_target.json
的JSON文件,它是索引定义。
2.在存储库中创建检查点
在生产source AEM实例中创建具有长生命周期的检查点。 应在克隆存储库之前执行此操作。
通过位于http://serveraddress:serverport/system/console/jmx
的JMX控制台,转至CheckpointMBean
并创建具有足够长生命周期的检查点(例如,200天)。 为此,调用CheckpointMBean#createCheckpoint
(以毫秒为单位)作为生命周期的参数。17280000000
完成此操作后,复制新创建的检查点ID并使用JMX CheckpointMBean#listCheckpoints
验证生命周期。
稍后导入索引时,将删除此检查点。
有关详细信息,请参阅Oak文档中的检查点创建。
为生成的索引定义执行脱机索引
Lucene可以使用oak-run脱机完成重新索引。 此过程在indexing-result/indexes
下的磁盘中创建索引数据。 它不写入存储库,因此不需要停止运行的AEM实例。 创建的文本存储将输入到此过程中:
java -Doak.indexer.memLimitInMB=500 -jar oak-run.jar index <nodestore path> --reindex --doc-traversal-mode --checkpoint <checkpoint> --fds-path <datastore path> --index-definitions-file merge-index-definitions_target.json --pre-extracted-text-dir text-extraction/store
Sample <checkpoint> looks like r16c85700008-0-8
—fds-path: path to data store.
--pre-extracted-text-dir: Directory of pre-extracted text.
merge-index-definitions_target: JSON file having merged definitions for the target AEM instance. indexes in this file will be re-indexed.
--doc-traversal-mode
参数的使用对于MongoMK安装很方便,因为它通过将存储库内容假脱机到本地平面文件,大大缩短了重新索引时间。 但是,它需要额外的磁盘空间,多次存储库的大小。
对于MongoMK,如果此步骤是在离MongoDB实例更近的实例中执行的,则可以加速此过程。 如果在同一台计算机上运行,则可避免网络开销。
有关索引的oak-run文档中可找到其他技术详细信息。
对于AEM 6.4和更高版本,AEM具有内置功能,可在启动序列时从磁盘导入索引。 文件夹<repository>/indexing-result/indexes
在启动过程中会监视是否存在索引数据。 在升级过程中,您可以先将预创建的索引复制到上述位置,然后再从新版本的目标 AEM jar开始。 AEM将其导入存储库并从系统中删除相应的检查点。 因此,完全避免了重新索引。
在下面,您将找到一些有用的提示和疑难解答说明。
建议克隆生产系统并使用克隆创建脱机索引。 这消除了对生产系统的任何潜在影响。 但是,生产系统中需要存在导入索引所需的检查点。 因此,在获取克隆之前创建检查点至关重要。
建议先准备Runbook并执行一些试用版,然后再在生产中运行升级。
脱机索引需要对整个存储库进行多次遍历。 在MongoMK安装中,通过网络访问存储库会影响索引过程的性能。 一种方法是在MongoDB副本本身上运行脱机索引建立过程,这将消除网络开销。 另一个选项是使用doc遍历模式。
通过将命令行参数—doc-traversal
添加到oak-run命令以进行脱机索引,可应用文档遍历模式。 此模式将本地磁盘中整个存储库的副本作为平面文件假脱机,并使用它运行索引。