2013-07-30 66 views
3

最近我在cassandra中用不同的设计进行了一些性能测试。 我目前使用cassandra作为写密集型项目。但是,我将添加读取密集型部分以使用select语句导出数据。cassandra复合节点,多节点上的复合键

我正在用下表做时间系列;

CREATE TABLE events (
    date text, 
    n int, // it could be 1,2,3 
    id timeuuid, 
    PRIMARY KEY ((date, n), id) 
); 

date|n为分区键。为了提高阅读性能,我试图从宽行的概念中获得杠杆作用。在文件中,据说:

如果分区键是相同的,则它们被插入到同一个物理节点并扩大分区键的行。

因此,我使用n来平均分配行的情况下得到热点,这是here;

但是,在多节点集群中,当我插入以下内容时;

'2013-07-30'|1, some-timeuuid 
'2013-07-30'|1, another-timeuuid 

我看到它们不在同一个物理节点中。

我得到节点信息;

nodetool getendpoint keyspace columnfamily some-timeuuid

所以,不知何故,我想他们是在同一行,以提高读取性能,但不能太宽在找两个十亿列的情况。 (这是列的大小限制)

那么,有什么想法发生了什么?

回答

6

如果我没有记错的话,为了找出在哪些节点的行存储,则需要运行:

nodetool getendpoints keyspace columnfamily 2013-07-30:1

用你(复合分区/)行键,而不是你的栏键。

如果您使用的是SimpleStrategy令牌/副本计算,这将在内部发生:

您计算出密钥的MD5哈希值。创建分配给环中节点的令牌 的排序列表。找到大于 哈希的第一个标记。这是第一个节点。列表中的下一个是取决于RF的复制品 。

(发现这个卡桑德拉邮件列表 http://cassandra-user-incubator-apache-org.3065146.n2.nabble.com/How-to-find-what-node-a-key-is-on-td6202253.html上)

+3

的复合隔膜是(根据评论更新我的答案。),你不应该把引号轮字符串,因为他们将被列入关键。所以第一个例子应该是'nodetool getendpoints keyspace columnfamily 2013-07-30:1'。 – Richard

+1

显然,'nodetool getendpoints'也为不存在的键提供输出。它在密钥上运行算法后输出物理节点ip。你对“getendpoints”的使用是正确的 – aacanakin