如何为其他 Cassandra 的远程节点复制 Cassandra 的本地节点?

Posted

技术标签:

【中文标题】如何为其他 Cassandra 的远程节点复制 Cassandra 的本地节点?【英文标题】:How do I replicate a Cassandra's local node for other Cassandra's remote node? 【发布时间】:2021-08-10 20:08:02 【问题描述】:

我需要将带有 SimpleStrategy 的本地节点复制到其他 Cassandra 数据库中的远程节点。有人知道我从哪里开始吗?

【问题讨论】:

它们是否在不同的集群中? 是的,他们是。一个在本地机器上运行,另一个在云端运行。 Cassandras 的云将收到比 cassandra 的本地节点更多的信息。例如,我有 2 个应用程序在 cassandra 的本地节点上运行,并且每个月我都需要为 cassandra 的云复制该节点。 云 cassandra 也接收写入吗?还是只读的?你有数据的 TTL 吗? 云 cassandra 接收超出本地节点数据复制的写入和读取。我们还没有数据的 TTL。 还有一个问题——表结构是一样的吗?分区键等? 【参考方案1】:

如果您将数据写入两个集群,这里的主要复杂性是如何避免在本地设置之后覆盖在云中发生更改的数据。有几种方法可以做到这一点:

如果表的结构相同(如果使用用户定义的类型,包括键空间的名称),那么您只需将 SSTables 从本地计算机复制到云端,然后使用sstableloader 重播它们 -在这种情况下,Cassandra 将遵循实际的写入时间,并且不会覆盖更改的数据。此外,如果您要从表中删除,那么您需要在墓碑过期之前复制 SSTable。您可能不会每次都复制所有 SSTables,只复制自上次数据上传以来已更改的文件。但是你总是需要从你上传的所有节点复制 SSTables。

如果结构不同,您可以考虑使用DSBulk 或Spark Cassandra Connector。在这两种情况下,您还需要使用 writetime 导出数据,然后还使用时间戳加载它。请注意,在这两种情况下,如果不同的列具有不同的写入时间,那么您将需要单独加载该数据,因为 Cassandra 允许在更新/插入数据时仅指定一个时间戳。

对于 DSBulk,您可以按照示例 19.4 从 this blog post 导出数据,并按照示例 11.3 进行加载(从 another blog post)。所以这可能需要一些shell脚本。另外,您需要有磁盘空间来保存导出的数据(但您可以使用压缩)。

如果使用 Spark Cassandra 连接器,如果两个节点都可以从 Spark 访问,则您可以在没有中间存储的情况下导出数据。但是您需要编写一些 Spark 代码来使用 RDD 或 DataFrame API 读取数据。

【讨论】:

如果结构相同,使用 sstableloader 进行流式传输可能是最简单的方法 - 请记住在墓碑过期之前复制数据 通常没关系,直到你使用用户定义的类型和 sstableloader... 对于 Cassandra 来说,名字并不重要——关键在于数据结构 不,加载的数据应该会自动出现在那里 当数据未更新时,我只能看到一个问题 - 目标时间戳中的数据具有更新的时间戳

以上是关于如何为其他 Cassandra 的远程节点复制 Cassandra 的本地节点?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 System.out.println 输出着色? [复制]

副本存储在cassandra环中的哪个节点?

如何为 where 子句中的列编写具有不连续值的 Cassandra 查询

Cassandra 组件

Cassandra 集群与每个节点完全复制

如何为单列和双列节点c ++构造模板层次结构