【问题标题】:How to migrate data from Cassandra cluster of size N to a different cluster of size N+/-M如何将数据从大小为 N 的 Cassandra 集群迁移到大小为 N+/-M 的不同集群
【发布时间】:2011-10-10 12:03:01
【问题描述】:

我正在尝试弄清楚如何将数据从一个 cassandra 集群迁移到另一个环大小不同的 cassandra 集群……比如从 5 节点集群迁移到 7 节点集群。

我开始研究 sstable2json,因为它为特定 cassandra 节点上的 SSTable 创建了一个 json 文件。我的想法是为环中每个节点上的列族执行此操作。所以在一个 5 节点环上,这会给我 5 个 json 文件,一个文件用于存储在每个节点上的列族中的数据。

然后我将 json 文件合并到一个文件中,并使用 json2sstable 导入一个新的集群,其大小可以说是 7。我希望 cassandra 然后在节点之间均匀地复制/平衡数据戒指,但我刚刚读到 SSTables 一旦写入就不可变了。因此,如果我按照刚才提到的方式进行操作,我最终会在一个节点上得到一个包含列族中所有数据的环。

那么谁能帮我弄清楚将数据从一个集群迁移到不同环大小的不同集群的过程?

【问题讨论】:

    标签: cassandra migrate


    【解决方案1】:

    您可以执行以下步骤: 1. 将 7 个节点加入 5 个节点集群,并为每个节点设置自己的环令牌。此时,您可能有一个包含 12 个节点的集群。 2. 在步骤 1 中从新集群中删除 5 个节点。 3.在自己移动5个节点后,为每个节点设置令牌环。 4.修复7节点集群。

    【讨论】:

      【解决方案2】:

      更好:在旧环的 sstable 上使用 bin/sstableloader 流式传输到新环。

      通常 sstableloader 的使用顺序如下:

      1. 使用 SSTableWriter 在本地创建 sstables
      2. 使用 sstableloader 将 sstables 中的数据流式传输到正确的节点(bin/sstableloader path-to-directory-full-of-sstables)。目录名称假定为键空间,如果您将其指向现有的 Cassandra 数据目录,就会出现这种情况。

      由于您希望将数据从现有集群 A 流式传输到新集群 B,因此您可以直接跳到针对集群 A 中每个节点上的数据运行 sstableloader。

      更多关于在this blog post中使用sstableloader的细节。

      【讨论】:

      • 如果我直接写入 sstable,cassandra 会将数据复制到其他节点吗?另外,如果我将环中所有节点的所有数据文件放在一个文件夹中,并在其上运行 sstableloader,我最终会不会得到重复的数据,因为数据是在原始集群中的 3 个节点之间复制的?
      • 是的,您最终会得到重复的数据。压缩会解决这个问题,所以这不是问题。另外:无需“将所有数据文件放入一个文件夹”,只需就地执行即可。 (编辑澄清。)
      • 嗨 jbellis,感谢您提供的信息。我认为这是要走的路。为了添加有关我的场景的更多信息,我在 ec2 上使用 hadoop 来生成数据模型并将其保存在 cassandra 上,也在 ec2 上。然后在构建模型时,我会将 cassandra 数据拉到我的网络中。我将在 ec2 上创建一个相当大的 cassandra 环,以便在生成模型时获得一些可扩展性优势。但是我网络中的目标环会更小,可能是一半。所以我的计划是将数据文件从 ec2 拉到我的网络,然后导入数据。更多下一条评论...
      • 天哪!在阅读了 sstableloader 的代码之后,我现在知道它会将数据写入集群(即所有节点),而不仅仅是像 json2sstable 这样的特定节点。那是我的困惑。这使任务变得非常容易!我不必担心复制或任何事情。它看起来就像它写入每条数据一样,它像任何普通的 cassandra 写入一样对待它并为我进行复制。亲爱的!
      • 所以 - 如果我想将数据从 3 个节点复制到新集群。我可以将所有 sstables 捆绑在一个目录中,还是必须为每个要加载的表运行 sstableloader 3 次?
      【解决方案3】:

      您不需要使用 sstable2json。如果你有空间,你可以:

      1. 从旧环上的所有节点获取所有 sstables
      2. 将它们全部放在每个新服务器上(重命名任何具有相同名称的服务器)
      3. 在新环中的每个节点上运行 nodetool cleanup,它们会丢弃不属于它们的数据。

      【讨论】:

      • 如果两个戒指的尺寸不同,这会起作用吗?说原环是12个节点,新环是5个节点?
      • 是的。但是@jbellis 在他的回答中提到的 sstableloader 脚本更好。对当前节点进行快照,然后从每个快照目录运行 sstableloader 到新集群。
      【解决方案4】:

      我敢说这并不像看起来那么大。

      1. 根据http://wiki.apache.org/cassandra/Operations#Token_selection,创建您的新环并为每个节点适当定义令牌
      2. 将数据导入新环。
      3. 戒指将根据您定义的令牌自行平衡http://wiki.apache.org/cassandra/Operations#Import_.2BAC8_export

      【讨论】:

      • 两个问题。当您说将数据导入新环时,具体我该怎么做?什么工具?新戒指的尺寸是否与原戒指不同有关系吗?
      • 链接不再起作用。第二点含糊无用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 2016-06-28
      相关资源
      最近更新 更多