【问题标题】:Partition keys update分区键更新
【发布时间】:2017-08-25 00:52:49
【问题描述】:
  • 使用 cassandra 2.2.8

我的挑战如下。在我的数据库中,我们有一堆包含数百万行的表。不幸的是,由于少数表上的松散设计分区键的大小以千兆字节增长 - 这对系统造成了负面压力,并且正在发生诸如 jvm 内存不足/节点崩溃之类的问题。

我们需要重新设计几个表的分区键。我们需要保留/或迁移到新表的表中的数据。

我正在寻找能够将数据从源表导出到目标表的解决方案(即使用重新设计的复合分区键);我希望这将有助于以更平衡的方式分散分区。

我尝试使用 COPY[tablename(column1,column2...)] 命令,但这是探测节点数,导致系统/堆压力,即影响应用程序。我在这里寻求指导,以了解如何最好地应对这一挑战 - 提前感谢您的帮助。

【问题讨论】:

    标签: cassandra sharding database-partitioning


    【解决方案1】:

    由于您有非常大的表并且已经无法使用 COPY,因此您必须手动导出和导入数据。要执行此类任务,您需要使用TOKEN function

    使用一些小的客户端代码,您可以编写查询来执行完整的表数据提取,例如:

    SELECT * FROM mytable WHERE token(pk) >= MIN_TOKEN AND TOKEN(pk) < MIN_TOKEN + QUERY_INTERVAL;
    SELECT * FROM mytable WHERE token(pk) >= MIN_TOKEN + QUERY_INTERVAL AND TOKEN(pk) < MIN_TOKEN + 2*QUERY_INTERVAL;
    ....
    SELECT * FROM mytable WHERE token(pk) >= MAX_TOKEN - QUERY_INTERVAL AND TOKEN(pk) < MIN_TOKEN;
    

    其中 MIN_TOKEN 和 MAX_TOKEN 都是集群分区器的常量最小值和最大值,QUERY_INTERVAL 是您要查询的范围窗口。 QUERY_INTERVAL 越大,您将在单个查询中获取的数据越多(并且更有可能触发超时)。

    请注意,Cassandra 从不 允许在分区键列说明符的 WHERE 子句中使用范围运算符 (> >=

    我还建议阅读以下内容:

    【讨论】:

    • 谢谢@xmas79 的回复。请原谅我缺乏经验,如果我遗漏了一些明显的东西。在梳理互联网以寻找答案时,我了解到 sstableloader 是加载大量数据的更有效选择 - 特别是链接 [techblogsearch.com/a/… 建议如果我创建 sudo 网络,我可能能够将数据从一个表迁移到另一个表使用稳定加载器。我正在寻找工作示例,看看我如何使它工作!值得一试还是我走错路了?
    【解决方案2】:

    COPY 只是导入/导出到/从一个文件。如果您想重新设计数据模型,最好为您的任务实施专门的工具,这将:

    1. 按部分从源表中读取数据(例如,通过上面描述的@xmas79 的令牌)
    2. 将数据部分转换为新模型
    3. 将数据部分写入新表

    这是一个如何使用 java 和 datastax 驱动程序 read big tables by token ranges 的示例

    【讨论】:

      猜你喜欢
      • 2022-10-04
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多