在 Cassandra 中将数据从一个集群传输到另一个集群
Posted
技术标签:
【中文标题】在 Cassandra 中将数据从一个集群传输到另一个集群【英文标题】:Transferring data from one cluster to another in Cassandra 【发布时间】:2018-06-02 00:18:56 【问题描述】:我有一个想要摆脱的旧 Cassandra 集群,并且想要将数据从旧集群中的几个选定表传输到我创建的新表。
我曾尝试在有大约 1500 万行(每行大约 20 列)的表上使用 Cassandra 的 COPY
命令。当我尝试将 csv 文件中的数据导入新集群中的同一张表时,我不断收到此响应:
无法导入 20 行:WriteTimeout - 来自服务器的错误:code=1100 [Coordinator 节点超时等待副本没有 des' 响应] message="操作超时 - 仅收到 0 个响应。" info='received_responses': 0, 'required_resp onses': 1, 'consistency': 'ONE',稍后重试,尝试 1 of 5
显然,这种方法行不通。有没有一种方法可以只将一些表从一个集群流式传输到另一个集群?请注意,尽管我们有数百万行,但数据并没有那么大。我拥有的最大表约为 2.5 GB。
他们的键空间当前配置为使用 SimpleStrategy。使用 NetworkTopologyStrategy 会有帮助吗?我应该指出,我只想从几个表中流式传输数据,而将其他表排除在外。
【问题讨论】:
【参考方案1】:我建议使用sstableloader 来完成这项工作。仅供参考,您还可以使用nodetool snapshot 来制作您想要的表格的副本,并在您需要它们的地方使用 scp。
另一方面,在任何类型的生产中使用简单策略都不是一个好主意。 NetworkTopologyStrategy 是一个不错的选择。
【讨论】:
获取nodetool快照,scp到另一台服务器,然后? 这就是 sstableloader 的用武之地。该文档已在帖子中链接。 我已成功拍摄快照并传输,并使用 nodetool refresh 将数据加载到新集群。现在两个集群中的键数相同,但是当我尝试查询数据时,我发现数据丢失了。我们是否需要在每个节点上拍摄 nodetool 快照?我有一个 RF = 1 的 3 节点集群。这是否意味着我需要在 2 个节点上拍摄快照? 如果您使用的是 RF=1,那么是的,因为数据分为三个节点的三分之一。如果您的 RF=3,那么一个节点就足够了。【参考方案2】:我已经成功地使用了您用于将数据从一个集群复制到另一个集群的策略。
一般建议从快照恢复。但是当用例不是将整个数据恢复到一个新的集群,而只是传输几个不太大的表时,COPY FROM 然后 COPY TO 是简单有效的策略。
坚持你的策略,只关注你遇到的错误。
我建议尝试使用较小的批量大小。
cqlsh $host -e "use $keyspace; COPY $keyspace.$table FROM '$file' WITH MAXBATCHSIZE='1'";【讨论】:
以上是关于在 Cassandra 中将数据从一个集群传输到另一个集群的主要内容,如果未能解决你的问题,请参考以下文章
将时间序列数据从 PySpark 传输到 Cassandra
如何在 Flutter 中将数据从一个函数传输到另一个函数?具体这种情况