【问题标题】:Cassandra - Truncate a table while inserts in progressCassandra - 在插入过程中截断表
【发布时间】:2020-04-23 20:43:22
【问题描述】:

我想了解 truncate 命令在 Cassandra(3.9 版)中的工作原理,以便能够知道在以下情况下会发生什么:

  • 我的生产表中有大约 100GB 的数据需要截断。
  • 我想截断这个表,但同时每秒会有几百个请求同时进行插入。

我试图理解,理论上这将如何发挥作用。

  • truncate 会在继续之前尝试在表上获取某种锁吗?并可能停止插入请求或本身超时?
  • 或者truncate 会在请求进入时按顺序通过,随后的插入请求会创建额外的行,而我最终会在截断后剩下少量行。

我只是想回收空间,所以如果在 truncate 命令之后运行的插入请求中剩余少量数据,我并不特别担心。

我只是想了解您是否希望这会成功完成,否则会失败/超时。

我将尝试在较小的集群上运行类似的场景,但我不确定这是否可以很好地替代了解实际行为。任何输入都会有所帮助。

【问题讨论】:

    标签: cassandra truncate


    【解决方案1】:

    Truncate 向所有节点发送一条消息,请求在执行时删除所有 SSTable,您将只获得在发出 truncate 后收到的那些 upsert 的信息。

    在 Datastax documentation 中声明这是使用 JMX 完成的,但查看此 answer 的 cmets,这是使用 CQL 和消息传递服务完成的。

    如果您尝试回收磁盘空间,请注意如果auto_snapshot 设置为true(true 是默认值),则会使用截断创建快照,因此您需要在执行后删除快照的命令。另请注意,truncate 将要求所有节点都处于启动状态且健康状态才能完成。

    【讨论】:

    • 我认为 cassandra 会刷新表,获取 sstables 列表,拍摄快照,然后删除该列表。我正在寻找代码,但无法找到它。刷新之后的任何内容在截断之后仍然存在,因为它将驻留在内存中,并最终成为一个 sstable,未捕获的内容将被删除。
    【解决方案2】:

    我自己试过这个。在一个 2 节点 Cassandra 集群上,我在后台以每秒大约 160 个请求的速度插入,并对具有大约 200,000 条记录的同一个表运行截断查询。

    • 表被截断,插入继续没有错误。
    • 截断后插入的新行显示在数据库中。

    【讨论】:

    • 你已经用 TTL 更新了记录,它已经完成了 ..
    • Truncate 将立即回收空间(清除快照后)。使用 TTL 更新记录将创建更多数据(墓碑),这将需要完全压缩以回收空间。作为一种主动策略,它是一种使用 TTL(我们正在探索)的好方法——但作为一种回收空间的方法,IMO 截断是一种更好的方法。
    猜你喜欢
    • 1970-01-01
    • 2016-12-31
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2014-09-20
    • 1970-01-01
    • 2016-07-06
    相关资源
    最近更新 更多