如何编写只选择存储在给定节点上的行的CQL 3 DELETE
行规范(WHERE
子句)?如果不可能,是否有SELECT
关系(WHERE
子句)指示哪些行存储在特定节点上?
我想这样做,所以我可以在每个数据存储节点上运行一个管家守护进程(在Java中),该节点从该节点删除旧记录,因此它可以确保其节点不会耗尽磁盘空间。在编写守护程序时,不是执行一次性清理,而是使用nodetool
程序查询存储在节点上的令牌范围是不合适的。
答案 0 :(得分:1)
这是可行的一种方式(但请参阅下面的更好主意)。如果您没有启用vnode,则可以识别令牌范围(从nodetool ring
命令),然后将其用作删除命令的一部分。例如:
delete from MyTable where
token(MyPK) >= Token1 and
token(MyPK) < Token2 and
(your delete logic here)
;
然而,更简单,更安全的方法是让Cassandra弄清楚数据的位置,并从任何节点执行此操作:
delete from MyTable where
(your delete logic here)
;
答案 1 :(得分:0)
nodetool getendpoints告诉您哪个节点拥有分区键:http://www.datastax.com/documentation/cassandra/2.1/cassandra/tools/toolsGetEndPoints.html?scroll=toolsGetEndPoints__toolsGetEndPtEx