当删除常规WCM资产时,对基础数据存储记录的引用可以从节点层次中删除,但数据存储记录本身仍然保持。 此未引用的数据存储记录随后变为“垃圾”,无需保留。 在存在大量垃圾资产的情况下,删除这些资产以保留空间并优化备份和文件系统维护性能是有益的。
在大多数情况下,WCM应用程序倾向于收集信息,但不会几乎同样频繁地删除信息。 虽然新映像被添加,甚至取代旧版本,但版本控制系统仍保留旧映像,并支持在必要时还原到旧映像。 因此,我们认为添加到系统的大多数内容都被有效地永久存储。 那么,我们可能想要清理的存储库中典型的“垃圾”来源是什么?
AEM将存储库用作许多内部和家政活动的存储:
当这些临时对象中的任何一个足够大,需要在数据存储中存储时,当该对象最终被淘汰时,数据存储记录本身将保持为“垃圾”。 在典型的WCM作者/发布应用程序中,此类垃圾的最大来源通常是发布激活过程。 在将数据复制到发布时,如果首先以名为“Durbo”的高效数据格式收集到集合中,并存储在/var/replication/data
下的存储库中,则数据将被复制到发布。 数据包通常大于数据存储的临界大小阈值,因此最后作为数据存储记录存储。 复制完成后,将删除/var/replication/data
中的节点,但数据存储记录仍保留为“垃圾”。
可恢复垃圾的另一个来源是包。 与其他所有数据一样,包数据存储在存储库中,因此存储在数据存储中的包大于4KB。 在开发项目过程中或在一段时间内维护系统时,可以多次构建和重建包,每个构建都生成新的数据存储记录,同构前一个构建的记录。
如果存储库已配置了外部数据存储,数据存储垃圾收集将作为每周维护窗口的一部分自动运行。 系统管理员还可以根据需要手动](#running-data-store-garbage-collection)运行数据存储垃圾收集。 [通常,建议定期执行数据存储垃圾收集,但在规划数据存储垃圾收集时应考虑以下因素:
数据存储垃圾收集器在进程开始时首先记录当前时间戳。 然后,使用多通标记/扫描图案算法进行收集。
在第一阶段,数据存储垃圾收集器对所有存储库内容执行全面遍历。 对于每个引用了数据存储记录的内容对象,它都将文件放在文件系统中,执行元数据更新 — 修改“上次修改时间”或MTIME属性。 此时,此阶段访问的文件将比初始基线时间戳更新。
在第二阶段,数据存储垃圾收集器以与“查找”基本相同的方式遍历数据存储的物理目录结构。 它检查了文件的“上次修改时间”或MTIME属性,并作出以下确定:
此方法对于具有私有数据存储的单个节点非常有效。 但是,数据存储可以共享,如果是,则表示不检查其他存储库对数据存储记录的潜在活动实时引用,并且可能错误地删除了活动引用的文件。 在规划任何垃圾收集之前,系统管理员必须了解数据存储的共享性质,并仅在知道数据存储未共享时使用简单的内置数据存储垃圾收集过程。
当在群集或共享数据存储设置(使用Mongo或区段Tar)中执行垃圾收集时,日志可能显示有关无法删除某些Blob ID的警告。 发生这种情况的原因是,在以前的垃圾收集中删除的blob ID被其他没有ID删除信息的群集或共享节点再次错误引用。 因此,在执行垃圾收集时,当它尝试删除在上次运行中已删除的ID时,它会记录警告。 此行为不影响性能或功能。
根据AEM运行的数据存储设置,有三种运行数据存储垃圾收集的方法:
通过Revision Cleanup — 通常用于节点存储清理的垃圾收集机制。
通过数据存储垃圾收集 — 特定于外部数据存储的垃圾收集机制,可在“操作”仪表板中使用。
通过JMX控制台。
如果TarMK同时用作节点存储和数据存储,则“修订清理”可用于对节点存储和数据存储进行垃圾收集。 但是,如果配置了外部数据存储(如文件系统数据存储),则必须显式触发数据存储垃圾收集,而不是“修订清理”。 可通过“操作”仪表板或JMX控制台触发数据存储垃圾收集。
下表显示了需要用于AEM 6中所有受支持的数据存储部署的数据存储垃圾收集类型:
节点存储 |
数据存储 | 垃圾收集机制 |
TarMK | TarMK | 修订清理(二进制文件与区段存储内嵌) |
TarMK | 外部文件系统 | 通过“操作”任务存储垃圾收集仪表板 JMX控制台 |
MongoDB | MongoDB | 通过“操作”任务存储垃圾收集仪表板 JMX控制台 |
MongoDB | 外部文件系统 | 通过“操作”任务存储垃圾收集仪表板 JMX控制台 |
内置的每周维护窗口(可通过操作仪表板访问)包含一个内置任务,用于在周日的上午1点触发数据存储垃圾收集。
如果您需要在此时间之外运行数据存储垃圾收集,则可以通过“操作”仪表板手动触发。
在运行数据存储垃圾收集之前,您应检查当时是否没有运行备份。
通过导航 -> 工具 -> 操作 -> 维护打开“操作”仪表板。
单击或点按每周维护窗口。
选择数据存储垃圾收集任务,然后单击或点按运行图标。
数据存储垃圾收集运行,其状态显示在仪表板中。
只有在您配置了外部文件数据存储时,数据存储垃圾收集任务才会可见。 有关如何设置文件数据存储的信息,请参见在AEM 6中配置节点存储和数据存储。
本节介绍如何通过JMX控制台手动运行数据存储垃圾收集。 如果安装是在没有外部数据存储的情况下设置的,则这不适用于您的安装。 请参阅维护存储库下有关如何运行修订清理的说明。
如果您正在与外部数据存储一起运行TarMK,则需要先运行修订清除,以便垃圾收集有效。
要运行垃圾收集,请执行以下操作:
在Apache Felix OSGi管理控制台中,突出显示Main选项卡,并从以下菜单中选择JMX。
然后,搜索并单击存储库管理器 MBean(或转至https://<host>:<port>/system/console/jmx/org.apache.jackrabbit.oak%3Aname%3Drepository+manager%2Ctype%3DRepositoryManagement
)。
单击startDataStoreGC(boolean markOnly)。
如果需要,请输入“markOnly
”作为true
参数:
选项 | 描述 |
---|---|
boolean markOnly | 在标记和扫描操作中,设置为true可仅标记参照而不扫描。 当在多个不同存储库之间共享基础BlobStore时,将使用此模式。 对于所有其他情况,将其设置为false以执行完全垃圾回收。 |
单击调用。 CRX运行垃圾回收并指示其何时完成。
数据存储垃圾收集不会收集在过去24小时内已删除的文件。
仅当您配置了外部文件任务存储时,数据存储垃圾收集开始才会。 如果尚未配置外部文件数据存储,任务将在调用后返回消息Cannot perform operation: no service of type BlobGCMBean found
。 有关如何设置文件数据存储的信息,请参见在AEM 6中配置节点存储和数据存储。
如果可能,应在系统上负载很少时运行数据存储垃圾收集,例如在上午。
内置的每周维护窗口(可通过操作仪表板访问)包含一个内置任务,用于在周日的上午1点触发数据存储垃圾收集。 您还应检查此时是否未运行备份。 可以根据需要通过仪表板自定义维护窗口的开始。
不同时运行它的原因是,旧(和未使用)数据存储文件也会备份,因此,如果需要回滚到旧版本,二进制文件仍在备份中。
如果您不希望在“操作”仪表板的“每周维护窗口”中运行数据存储垃圾收集,也可以使用wget或curl HTTP客户端自动执行。 以下是如何使用curl自动备份的示例:
在下面的示例中,curl
命令可能需要为实例配置各种参数;例如,主机名(localhost
)、端口(4502
)、管理员密码(xyz
)和实际数据存储垃圾回收的各种参数。
以下是通过命令行调用数据存储垃圾收集的curl命令示例:
curl -u admin:admin -X POST --data markOnly=true https://localhost:4503/system/console/jmx/org.apache.jackrabbit.oak"%"3Aname"%"3Drepository+manager"%"2Ctype"%"3DRepositoryManagement/op/startDataStoreGC/boolean
curl命令会立即返回。
数据存储一致性检查将报告所有缺少但仍被引用的数据存储二进制文件。 要开始一致性检查,请执行以下步骤:
checkConsistency()
链接。一致性检查完成后,将显示一条消息,显示报告为缺失的二进制文件数。 如果数字大于0,请查看error.log
以了解有关缺失二进制文件的更多详细信息。
在下面,您将找到一个如何在日志中报告缺少的二进制文件的示例:
11:32:39.673 INFO [main] MarkSweepGarbageCollector.java:600 Consistency check found [1] missing blobs
11:32:39.673 WARN [main] MarkSweepGarbageCollector.java:602 Consistency check failure intheblob store : DataStore backed BlobStore [org.apache.jackrabbit.oak.plugins.blob.datastore.OakFileDataStore], check missing candidates in file /tmp/gcworkdir-1467352959243/gccand-1467352959243