我最近在cassandra做了一些不同设计的性能测试。
我目前正在使用cassandra作为写密集型项目。但是,我将使用select
语句添加读取密集型部分来导出数据。
我正在使用下表做时间序列;
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
所以,不知何故,我希望它们在同一行中以提高读取性能,但在获得20亿列时不会太宽。 (这是列的大小限制)
那么,任何想法在这里发生了什么?
答案 0 :(得分:7)
如果没有弄错,为了找出存储行的节点,您需要运行:
nodetool getendpoints keyspace columnfamily 2013-07-30:1
使用(复合分区/)行键而不是列键。
如果您使用SimpleStrategy进行令牌/副本计算,这将在内部发生:
您计算密钥的MD5哈希值。创建令牌的排序列表 分配给环中的节点。找到大于的第一个标记 哈希。这是第一个节点。列表中的下一个是副本, 这取决于RF。
(在cassandra邮件列表中找到了这个 http://cassandra-user-incubator-apache-org.3065146.n2.nabble.com/How-to-find-what-node-a-key-is-on-td6202253.html)
(根据评论更新了我的答案。)