2014-09-02 84 views
3

假设,存在结构如下表:不太清楚有关Cassandra的反模式

create table cities (
    root text, 
    name text, 
    primary key(root,name) 
) with clustering order by (name asc); -- for getting them sorted 

insert into cities(root,name) values('.','Moscow'); 
insert into cities(root,name) values('.','Tokio'); 
insert into cities(root,name) values('.','London'); 

select * from cities where root='.'; -- get'em sorted asc 

在指定的3复制因子的密钥空间和使用RandomPartitioner,将有3个副本每个行在3个节点上:主节点确定用于存储该行的散列值和2个下一个散列值。为什么应该有一个热点?从所有副本读取不是负载平衡?

+0

请勿使用RandomPartitioner。使用更新的Murmur3Partitioner。 – 2014-09-02 18:17:38

回答

5

定义这样一个表的分区键是rootname是一个集群键。 顾名思义,分区负责分区 - 分区如何工作? 假设你有4个节点簇 - 我们有一个散列函数,它只生成8个键(A,B,C,D,E,F,G,H) - 散列在簇中的分布方式

节点1 - (A,B)
节点2 - (C,d)
节点3 - (E,F)
节点4 - (G,H)

每个节点将作为副本的以下2,所以节点1的副本是(2,3),节点2的副本是(3,4),节点3的副本是(4,1),并且最终节点4的副本是(1, 2)。

假设我们的函数hash(root),当根值是.返回B属于节点1-节点1将存储信息和节点(2,3)将存储副本。节点4是从不涉及到cities表中,因为修复分区键,它不会包含任何有关此表的数据(对于不属于该概念的提示情况的例外)。在这个例子中,您使用了大约75%的群集,这看起来像是一个可接受的情况......让我们假设您的应用程序受到影响,因为涉及的3个节点无法处理读/写请求。现在,您可以根据需要添加尽可能多的节点,但使用此数据模型将无法水平缩放,因为没有其他节点将涉及到城市表。我看到在这种情况下解决问题的唯一方法是通过增加更多内存,更强大的CPU和I/O来增加这3个节点的功耗(垂直缩放)。创建不允许水平缩放的架构是反模式

+1

谢谢你的完美解释! – ejq11827 2014-09-02 07:39:22