【问题标题】:Cassandra Cql Range SelectCassandra Cql 范围选择
【发布时间】:2012-08-30 06:42:30
【问题描述】:

我们来自 RDBMS 背景,我们正在尝试做的是将现有的数据存储移植到 cassandra,以利用分布式数据库的强大功能。 我们的要求是存储一个键的值,可能键是时间(计划使用纪元时间)并检索键范围之间的值

对于测试,我们创建了 ColumnFamily 并使用 cql 插入数据(通过cqlsh):

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;

钥匙| val1 | val2 | 10 | 673153110.50 | 448768740.33 | 8 | 673153109.50 | 448768739.67 |

select * from Log where KEY>4 and KEY<9;

错误请求:开始键的 md5 排序在结束键的 md5 之后。这不是 允许;您可能根本不应该指定结束键,在 随机分区器

我们是不是做错了什么?有什么解决方案可以使用随机分区在键范围之间选择值

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    Cassandra 禁止此类查询是有充分理由的。目前,您的所有日志条目都使用主键的 md5 和均匀分布在您的节点上。支持您的查询意味着 Cassandra 必须查询所有节点、检索所有条目、将它们存储在磁盘上并对其进行排序。每当您执行此查询时,都需要这样做。

    如果您希望能够执行此查询,您可以使用 Order-Preserving-Partioner,但也不建议这样做,因为如果您按顺序插入数据,您的所有查询都将命中单个节点,从而导致不必要的热斑点。

    通常的解决方案是使用复合主键(例如 index_name + timeuuid)。这将确保您的索引通过使用索引名称的 md5sum 均匀分布在整个集群中。但是访问索引(例如SELECT * FROM log WHERE index_name = ? AND time &gt;= ? AND time &lt; ?)仍然很有效,因为数据已经按排序顺序存储在负责md5sum(index_name)的节点上。 index_name 通常是一些可以帮助您对数据进行分区的键 - user_id 或 application_id 可能是一个不错的选择。

    如果您认为单个 index_name 的索引对于单个节点来说可能太大,那么您可以通过将当前年份和月份添加到 index_name 来调整以前的架构。请阅读以下两篇文章了解更多信息:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 2013-01-02
      • 2016-04-14
      • 2014-03-23
      • 2013-08-14
      • 2018-02-21
      • 2014-01-03
      相关资源
      最近更新 更多