2

背景

我们知道可以设置一个 devops 管道,通过使用 crx2oak 将内容从旧环境迁移到新环境,通过蓝/绿方法将更新部署到 AEM。为什么超出了这个问题的范围。

这种方法的问题在于,随着 JCR 中内容量的增长,内容复制操作可能会花费大量时间。其他减轻这种情况的想法表示赞赏。

我们还知道 AEM 可以有一个 S3 数据存储,它将二进制内容卸载到 S3 存储桶中,在蓝/绿部署期间不会重新构建,如下所示:

https://helpx.adobe.com/experience-manager/6-3/sites/deploying/using/storage-elements-in-aem-6.html#OverviewofStorageinAEM6

Adobe 的文档中不清楚是否可以跨 AEM 实例(即蓝/绿实例)共享同一个 S3 存储桶。也许只是我的google fu失败了......

问题)

当一个新的 AEM 实例被配置为使用 S3 数据存储时,该数据存储中已经包含旧实例中的内容,当使用 crx2oak 迁移内容时,新实例是否能够访问现有内容?

是否有任何文章/博客描述了这种方法可能节省的时间?

是的,我可以做一个实验,并且将来可能会这样做来回答我自己的问题。我正在寻找已经这样做过的人的信息?我是一名工程师,所以如果其他人这样做了,我不会重新发明轮子。

4

2 回答 2

4

您当然可以在实例之间共享同一个 S3 存储桶 - 事实上,这通常与来自 author->publisher(s) 的无二进制复制一起使用,并且是一种经过验证的真实配置。

甚至可以在完全不同的环境(例如 DEV/STAGE 或 BLUE/GREEN 在您的情况下)之间共享同一个存储桶。要注意的主要“问题”是关于 DataStore 垃圾收集 (DSGC),因为很可能会有一些仅由共享存储桶的一些实例引用的 blob,因此在清除未使用的 blob 时,这需要考虑到。

虽然这都是设计的一部分,并且有一个专门为此目的设计的标志,它告诉 DSGC 只执行 GC 的第一阶段(“标记”阶段),并跳过第二个“扫描”阶段,直到所有实例已标记他们希望保留/丢弃的 blob。一旦所有实例都完成了,那么可以运行扫描阶段以清除任何使用存储桶的实例不需要的 blob。

有关更详细的说明,请参阅 Oak 文档: https ://jackrabbit.apache.org/oak/docs/plugins/blobstore.html#Shared_DataStore_Blob_Garbage_Collection_Since_1.2.0

我发现它有助于理解几乎所有的数据存储实现都是根据它们的校验和存储 blob,因此添加两次上传的同一个文件只会在数据存储中存储一个副本,并且会有两个段存储引用同一 blob 的记录。同样,共享同一个存储桶的多个 AEM 实例将能够找到给定的 blob,而不管哪个实例首先将它放在那里。

FileDataStore您可以通过找到一个 blob 并'ing 它轻松地观察到这sha256一点 - 例如(此示例在 OS X 上,Linux/Windows 上的校验和命令会略有不同):

$ shasum -a256 crx-quickstart/repository/datastore/0c/9e/40/0c9e405fc8d0f0405930cd0044611cfbf014938a1837ae0cfaa266d7732d1002

0c9e405fc8d0f0405930cd0044611cfbf014938a1837ae0cfaa266d7732d1002  crx-quickstart/repository/datastore/0c/9e/40/0c9e405fc8d0f0405930cd0044611cfbf014938a1837ae0cfaa266d7732d1002

在那里您可以看到 a) 文件名是校验和,b) 它使用该校验和中的前 3 对字符嵌套,因此您可以通过仅知道哈希值以及存储相同的二进制文件来定位文件,即使如果名称或 JCR 元数据不同,则引用的 blob 将是磁盘上的相同文字文件。

从内存 S3 数据存储使用前缀而不是目录嵌套,因为这样性能更好,但原理是一样的。

最后,需要考虑的几点是:

1) S3 存储相对便宜(实际上是无限的),因此有一个论点是,除非您真的想省钱,否则没有必要执行常规 DSGC。

2) 如果您确实运行 DSGC,则需要考虑这将如何与您用于 AEM 实例的任何备份策略一起工作。例如,如果您在运行 DSGC 后不久回滚段存储,您可能必须恢复其中一些已清除的 blob。您可以使用版本控制和/或生命周期规则来帮助解决此问题,但它可能会显着增加恢复过程的复杂性和时间。

如果您选择简单地跳过 DSGC 并将 blob 无限期留在那里,最好确保 AEM 使用的访问密钥或 IAM 角色没有DeleteObject存储桶的权限,以确保流氓 GC 进程不能删除任何东西。

希望这可以帮助。

编辑 在我忘记实际回答您的问题的所有内容中 - 是的,在大多数情况下它会节省一些克隆时间。您仍然需要同步段存储(显然),并且有多种方法可以做到这一点。crx2oak肯定是一个 - 您将在文档中看到使用 S3 的特定选项,您可以在其中提供配置文件(基本上是.config与 Felix/OSGi 一起使用的序列化文件)。

您还可以使用类似rsync的方法简单地复制 TAR 文件(至少目标 AEM 已停止。Oak 通常是原子的,因此理论上可以从源进行热复制,但 YMMV)。

最后,您显然可以使用 Mongo 并以这种方式对分段存储进行集群,但所有常见的成本/复杂性/性能问题都适用)。

蓝/绿字体即将出现的另一个有趣的发展是CompositeNodeStore- 2017 年的 adaptTo() 会议上有一个很好的讨论,讨论了这个:

https://adapt.to/2017/en/schedule/zero-downtime-deployments-for-the-sling-based-apps-using-docker.html

于 2018-06-19T10:13:13.897 回答
3

外部数据存储将有很大帮助,因为通常二进制资产使用最多的空间。真人输入的纯内容要少得多。

在我当前的项目中(很小,但关系应该是正常的):

  • 存储库总共 4.8 GB(4.1 GB 段存储,780 MB 索引)
  • 文件数据存储总共 222 GB

如果你想这样做,我有以下评论:

  1. 有不同的数据存储可用。对于测试,我将从File DataStore开始。

  2. S3 DataStore仅在我看来才有意义,前提是您仍然在 Amazons AWS 上托管。Adobe Managed Services 正在这样做,因此 S3 对他们来说很有意义。但也只有当您拥有超过 500 GB 的资产时。

  3. 如果您使用绿色/蓝色方法,请小心 DataStore 垃圾收集(只需手动进行)。共享数据存储适用于具有相同内容的多个发布者。例如,您可能遇到以下情况:您的编辑器删除了一些资产,您运行了 DataStore GC,最后您回滚了您的环境。这意味着资产仍在内容存储库中,但二进制文件已从 DataStore 中清除。


为了使用共享文件数据存储,您需要执行以下操作:

  1. 解包快速入门java -jar AEM_6.3_Quickstart.jar -unpack
  2. 为文件数据存储创建一个目录(crx-quickstart 文件夹之外的任何位置)
  3. install在提取的crx-quickstart文件夹中创建一个目录
  4. org.apache.jackrabbit.oak.plugins.blob.datastore.FileDataStore.cfg在此安装文件夹中创建一个名为的文件
  5. 该文件仅包含 1 行path=<path to file datastore>(请参阅https://jackrabbit.apache.org/oak/docs/osgi_config.html
  6. 在数据存储目录中放置一个reference.key文件。第一次将自动创建。但是,如果您始终使用相同的键,则所有环境中的所有数据存储都会使用相同的哈希值。这也是“无二进制复制”功能的先决条件(因此二进制只会在作者和出版商之间第一次复制)

亲切的问候,亚历克斯

于 2018-06-19T08:51:59.133 回答