AEM 6中的AEM平台基于Apache Jackrabbit Oak开发。
Apache Jackrabbit Oak旨在实现可扩展且高性能的分层内容存储库,以用作现代世界级网站和其他要求苛刻的内容应用程序的基础。
它是Jackrabbit 2的继承者,并被AEM 6用作其内容存储库CRX的默认后端。
Apache Jackrabbit Oak 1.4.14 已于 2017年3月 0 日发布,Apache Jackrabbit 是由 Apache Foundation 提供的 JSR-170 的开放源码实现。
设计原则和目标
Oak实现了JSR-283(JCR 2.0)规范。其主要设计目标是:
- 更好地支持大型存储库
- 多个分布式群集节点以实现高可用性
- 更好的性能
- 支持许多子节点和访问控制级别
架构概念
存储
存储层的目的是:
- 实现树模型
- 使存储可插入
- 提供集群机制
Oak核心
Oak Core为存储层添加了几个层:
- 访问级别控制
- 搜索和索引
- 观察
Oak JCR
Oak JCR的主要目标是将JCR语义转换为树操作。它还负责:
- 实现JCR API
- 包含实现JCR约束的提交相关
此外,现在非Java实现变成了可能,并且是Oak JCR概念的一部分,也就是非Java语言也能够作为开发语言。
存储概述
Oak存储层为内容的实际存储提供了抽象层。
目前,AEM6中有两种存储实现:Tar Storage 和MongoDB Storage。
Tar储存
Tar存储使用tar文件。它将内容存储为较大段中的各种类型的记录。日记帐用于跟踪存储库的最新状态。它围绕着几个关键的设计原则:
- 不可变的细分
内容存储在最大可达256KiB的段中。它们是不可变的,这使得缓存经常访问的段很容易,并减少可能损坏存储库的系统错误。
每个段由唯一标识符(UUID)标识,并包含内容树的连续子集。此外,细分可以引用其他内容。每个段都保留其他引用段的UUID列表。
- 局部性
节点及其直接子节点等相关记录通常存储在同一段中。这使得搜索存储库的速度非常快,并且避免了每个会话访问多个相关节点的典型客户端的大多数缓存未命中。
- 紧凑
记录的格式化针对大小进行了优化,以降低IO成本并尽可能多地在缓存中容纳内容。
Mongo存储
MongoDB存储利用MongoDB进行分片和群集。存储库树保存在一个MongoDB数据库中,其中每个节点都是一个单独的文档。它有几个特点:
- 修订
对于内容的每次更新(提交),都会创建一个新修订。修订版基本上是一个由三个元素组成的字符串:
- 从生成的计算机的系统时间派生的时间戳
- 用于区分使用相同时间戳创建的修订的计数器
- 创建修订的群集节点标识
- 分行
支持分支,允许客户端进行多个更改并通过单个合并调用使其可见。
- 以前的文件
MongoDB存储在每次修改时都会向文档添加数据。但是,如果明确触发清理,它只会删除数据。当满足特定阈值时移动旧数据。以前的文档只包含不可变数据,这意味着它们只包含已提交和合并的修订。
- 群集节点元数据
有关活动和非活动集群节点的数据保留在数据库中,以便于集群操作。
使用MongoDB存储的典型AEM群集设置:
有什么不同于Jackrabbit 2?
由于Oak设计为向后兼容JCR 1.0标准,因此用户级别几乎不会发生任何变化。但是,在设置基于Oak的AEM安装时需要考虑一些明显的差异:
- Oak不会自动创建索引。因此,需要在必要时创建自定义索引。
- 与Jackrabbit 2不同,其中会话始终反映存储库的最新状态,使用Oak会话反映了从获取会话时的存储库的稳定视图。这是由于Oak所基于的MVCC模型。
- Oak不支持同名siblings(SNS)。