Cassandra 不太清楚卡桑德拉';s反模式

Cassandra 不太清楚卡桑德拉';s反模式,cassandra,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('.','T

假设有一个具有以下结构的表:

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个下一个节点。为什么会有热点?从所有副本读取数据的负载不平衡?

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

感谢您的完美解释!不要使用RandomPartitioner。使用较新的分区器。