Cassandra Cql范围查询

3
我们来自关系型数据库背景,我们正在尝试将现有的数据存储迁移到Cassandra,以利用分布式数据库的强大功能。 我们的要求是根据键存储值,可能的键是时间(计划使用epoch时间),并检索键范围内的值。
为了进行测试,我们已经创建了ColumnFamily,并使用cql(通过)插入了数据:
CREATE COLUMNFAMILY Log( KEY int PRIMARY KEY,Val1 varchar,Val2 varchar);

INSERT INTO Log (KEY,val1, val2) VALUES (1,'673153106.00','448768737.33'); 
INSERT INTO Log (KEY,val1, val2) VALUES (2,'673153106.50','448768737.67'); 
INSERT INTO Log (KEY,val1, val2) VALUES (3,'673153107.00','448768738.00'); 
INSERT INTO Log (KEY,val1, val2) VALUES (4,'673153107.50','448768738.33'); 
INSERT INTO Log (KEY,val1, val2) VALUES (5,'673153108.00','448768738.67'); 
INSERT INTO Log (KEY,val1, val2) VALUES (6,'673153108.50','448768739.00'); 
INSERT INTO Log (KEY,val1, val2) VALUES (7,'673153109.00','448768739.33'); 
INSERT INTO Log (KEY,val1, val2) VALUES (8,'673153109.50','448768739.67'); 
INSERT INTO Log (KEY,val1, val2) VALUES (9,'673153110.00','448768740.00'); 
INSERT INTO Log (KEY,val1, val2) VALUES (10,'673153110.50','448768740.33');

但是我们的选择语句未能返回正确的数据。
select * from Log where KEY>4 and KEY<9;

KEY | val1 | val2 | 10 | 673153110.50 | 448768740.33 | 8 | 673153109.50 | 448768739.67 |

这段内容是关于IT技术的,它展示了一个表格。表格中有三列,分别是“KEY”,“val1”和“val2”。接下来的两行是具体的数值数据。这个表格可以用于存储和比较数据。
select * from Log where KEY>4 and KEY<9;

错误请求:起始键的MD5排序在结束键的MD5之后。这是不允许的;在RandomPartitioner下,您可能根本不应该指定结束键。

我们做错了什么吗?有没有办法使用randompartition选择一个键范围内的值?

1个回答

14

卡桑德拉禁止这种查询有很好的理由。目前,所有的日志条目都是通过使用主键的md5值在节点之间平均分布的。支持你的查询意味着卡桑德拉必须查询所有的节点,检索所有的条目并将它们存储在磁盘上并排序。而且每次执行此查询时都需要执行这些操作。

如果您想要执行此查询,您可以使用Order-Preserving-Partioner,但这也不建议,因为如果您按顺序插入数据,则所有查询都会命中单个节点,导致不必要的热点。

通常的解决方案是使用复合主键(例如index_name + timeuuid)。这将确保您的索引使用indexname的md5sum在整个集群中均匀分布。但是访问索引(例如SELECT * FROM log WHERE index_name = ? AND time >= ? AND time < ?)仍然是高效的,因为数据已经按排序顺序存储在负责md5sum(index_name)的节点上。index_name通常是帮助您分区数据的一些关键字,例如user_id或application_id可能是一个很好的选择。

如果您认为单个index_name的索引对于单个节点来说太大了,那么您可以通过将当前年份和月份添加到index_name中来调整前面的模式。有关详细信息,请阅读以下两篇文章:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接