分区键更新

时间:2017-03-30 21:52:04

标签: cassandra sharding database-partitioning

  • 使用cassandra 2.2.8

我的挑战如下。在我的数据库中,我们拥有数百万行的表。不幸的是,由于松散的设计,几个表上的分区键大小增加了千兆字节 - 这会对系统造成负面压力,并且会出现jvm内存不足/节点崩溃等问题。

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

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

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

2 个答案:

答案 0 :(得分:1)

由于您有非常大的表并且使用COPY失败,因此您必须手动导出和导入数据。要执行此类任务,您需要使用https://stackoverflow.com/a/35142175

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

$

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

请注意,Cassandra 从不允许在分区键列说明符的WHERE子句中使用范围运算符(>> =< =< lt;)。使用TOKEN功能是个例外。

我也建议这些读数:

答案 1 :(得分:0)

COPY只需导入/导出文件。如果您想重新设计数据模型,那么为您的任务实现专用工具可能会更好,这将是:

  1. 按部分从源表中读取数据(例如,通过Tokens,如上面描述的@ xmas79)
  2. 将数据部分转换为新模型
  3. 将数据部分写入新表
  4. 以下是如何read big tables by token ranges使用java和datastax驱动程序

    的示例