我想了解 truncate
命令在cassandra(版本3.9)中工作,以便能够知道在以下场景中会发生什么:
我在生产中的一个表上有大约100gb的数据,这个表需要被截断。
我想截断这个表,但同时每秒会有几百个请求同时进行插入。
我试图从理论上理解这会是怎样的结果。
会不会 truncate
试着在表上获取某种锁,然后它才能继续?可能会停止插入请求,或者本身会超时?
或者 truncate
当请求传入时,按顺序进行操作,随后的insert请求将创建额外的行,在截断之后,我将得到剩余的少量行。
我只是想回收空间,所以我并不特别关心truncate命令之后运行的insert请求是否还有少量数据。
我只是想知道你是希望它成功完成还是失败/超时。
我将尝试在一个较小的集群上运行类似的场景,但我不确定这是否是理解实际行为的好替代方案。任何输入都会有帮助。
2条答案
按热度按时间watbbzwu1#
我自己也试过。在一个2节点的cassandra集群上,我在后台以大约每秒160个请求的速度进行了插入,并在具有大约200000条记录的同一个表上运行了一个truncate查询。
表被截断,插入操作继续进行,没有出现错误。
截断后插入的新行显示在数据库中。
lxkprmvk2#
truncate向所有节点发送一条消息,请求在执行时删除所有sstable,在发出truncate之后,您将只收到这些upserts的信息。
在datastax文档中,这是用jmx完成的,但是看看这个答案的注解,这是用cql和消息传递服务完成的。
如果您试图回收磁盘空间,请注意,将使用truncate if创建快照
auto_snapshot
设置为true(true是默认值),因此需要在执行命令后删除快照。另外,请注意truncate
需要所有节点都正常运行才能完成。