【问题标题】:Migrate data from one cassandra cluster to another将数据从一个 cassandra 集群迁移到另一个
【发布时间】:2020-03-20 12:04:03
【问题描述】:

您好,我想将数据从我的 cassandra 集群迁移到另一个 cassandra 集群。我看到很多帖子提出了各种方法,但不是很清楚或有局限性。看到的方法如下:

  1. 使用 COPY TO 和 COPY FROM 命令:易于使用,但似乎对可以复制的行数有限制。
  2. 使用 SSTABLELOADER:大多数文章建议使用 sstableloader 将数据从一个集群移动到另一个集群。但是没有得到关于创建 sstables 步骤的明确细节(是否可以使用一些 nodetool 命令或需要创建 java 应用程序?这些是每个节点还是每个集群创建的?如果创建如何移动它们从一个集群到另一个集群?)或创建 snapshots,这很乏味,因为它们是按节点创建的,并且必须转移到另一个集群。还看到了建议使用并行 ssh 为整个集群创建快照的答案,但也没有得到任何示例。

任何帮助将不胜感激。

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    这确实是一个需要更多信息才能提供明确答案的问题。例如,您是否需要保留元数据,例如数据上的 WriteTime 和 TTLs?目标集群是否具有相同的拓扑(节点数、令牌分配等)。

    基本上,您有以下选择:

    1. 使用sstableloader - Cassandra 自带的工具,用于从备份等恢复。要执行数据迁移,您需要创建要加载的表的快照(使用nodetool snapshot),然后运行sstableloader在那个快照上。主要优点是它将保留元数据(TTL/WriteTime)。主要缺点是您需要在源集群的所有节点上执行快照/加载,并且您需要在目标集群中具有完全相同的架构和分区器;
    2. 您可以使用备份/恢复工具,例如medusa,它基本上可以自动拍摄快照和加载数据;
    3. 您可以使用 Apache Spark 通过Spark Cassandra Connector 将数据从一个表复制到另一个表,例如,如blog post 中所述 - 只需读取一个集群的表,然后写入另一个集群中的表。适用于简单的复制操作,并且您可以在必要时执行数据转换,但如果您需要保留元数据,则变得更加复杂。此外,它还需要 Spark;
    4. 使用DataStax Bulk Loader (DSBulk) 将数据导出到磁盘上的文件,然后加载到另一个集群。与cqlshCOPY 命令相比,它针对大量数据的加载/卸载进行了大量优化。它适用于 Cassandra 2.1+ 和大多数 DSE 版本(古代版本除外)。

    【讨论】:

      【解决方案2】:

      如果您能够将目标集群设置为与源集群完全相同的拓扑,那么最快的方法可能是简单地将数据文件从源集群复制到目标集群,因为这样可以避免处理数据的开销数据将其重新分配到不同的节点。为了使其工作,您的目标集群必须具有相同数量的节点、相同的机架配置,甚至分配给每个节点的相同令牌。

      要获取源节点的令牌,您可以运行 nodetool info -T | grep Token | awk '{print $3}' | tr '\n' , | sed 's/,$/\n/'。然后,您可以从输出中复制以逗号分隔的标记列表,并将其粘贴到目标节点的 cassandra.yaml 中的 initial_token 设置中。启动节点后,使用 nodetool info -T 检查其令牌以验证它是否具有正确的令牌。对目标集群中的每个节点重复这些步骤。

      将所有目标节点设置为与源集群完全相同的令牌、DC 和机架后,为源集群上的所需表拍摄快照并将快照复制到相应节点的数据目录目标集群。 DataStax OpsCenter 可以自动化备份和恢复数据的过程,并将直接复制用于具有相同拓扑的集群。看来美杜莎也可以,虽然我之前没用过这个工具。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-09
        • 2018-06-02
        • 2014-06-26
        • 2023-02-14
        • 2018-04-27
        相关资源
        最近更新 更多