假设有一个具有以下结构的表:
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 :(得分:6)
定义这样的表,分区键是root
,而name
是聚类键。
顾名思义,分区负责分区 - 分区如何工作?
假设你有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)
,当根值为.
时,返回属于节点1的B
- 节点1将存储信息和节点(2, 3)将存储副本。节点4 NEVER 涉及cities
表,由于修复分区键,它不包含任何有关此表的数据(对于不属于概念的提示情况的例外情况)。在此示例中,您使用了大约75%的群集,这可能看起来像一个可接受的情况......让我们在一瞬间说您的应用程序受到影响,因为涉及的3个节点无法处理读/写请求。现在,您可以根据需要向群集添加任意数量的节点,但是使用此数据模型您无法水平扩展,因为其他任何节点都不会涉及到城市表。在这种情况下,我看到解决问题的唯一方法是通过添加更多内存,更强大的CPU和I / O来增加这3个节点的功率(垂直缩放)。创建不允许水平缩放的模式是反模式