Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 当Cassandra集群中的节点达到其极限时,该怎么办?_Database_Cassandra - Fatal编程技术网

Database 当Cassandra集群中的节点达到其极限时,该怎么办?

Database 当Cassandra集群中的节点达到其极限时,该怎么办?,database,cassandra,Database,Cassandra,我正在研究卡桑德拉,并正在为我正在进行的一个项目建立一个集群。考虑这个例子: 假设我设置了一个5节点集群,每个集群有200 gb的空间。这相当于总共1000 gb(约1 TB)的空间。假设我的分区在集群中平均分配,我可以轻松添加节点并实现线性可伸缩性。但是,如果这5个节点开始接近200 gb的SSD限制,该怎么办?在这种情况下,我可以再添加5个节点,现在将分区拆分为10个节点。但较旧的节点仍将写入数据,因为它们是集群的一部分。有没有办法使这5个旧节点成为“只读”节点?我想在整个集群中进行随机读取

我正在研究卡桑德拉,并正在为我正在进行的一个项目建立一个集群。考虑这个例子: 假设我设置了一个5节点集群,每个集群有200 gb的空间。这相当于总共1000 gb(约1 TB)的空间。假设我的分区在集群中平均分配,我可以轻松添加节点并实现线性可伸缩性。但是,如果这5个节点开始接近200 gb的SSD限制,该怎么办?在这种情况下,我可以再添加5个节点,现在将分区拆分为10个节点。但较旧的节点仍将写入数据,因为它们是集群的一部分。有没有办法使这5个旧节点成为“只读”节点?我想在整个集群中进行随机读取查询,但不想再向较旧的节点写入数据(因为它们受到200 gb的限制)

非常感谢您的帮助。多谢各位


注意:我可以说99%的查询是写查询,1%或更少的查询是读查询。应用程序必须在Cassandra中保留单击事件。

正确理解问题时遇到问题

我假设您知道,通过添加新的5个节点,一些数据负载将被传输到新节点,因为一些令牌范围将被分配给它们

现在,正如您所知,如果您担心旧的5个节点由于达到其限制而无法写入,则不会发生这种情况,因为新节点已经共享了数据负载,因此这些节点现在有进一步写入的可用空间

隔离对节点的读写是完全不同的问题。但是,如果您只想将读取隔离到这5个节点,而将写入到新的5个节点,那么最好的方法是在同一集群下的另一个数据中心中添加新的5个节点,然后使用不同的读写一致性级别,以满足您将旧数据中心设为只读的需要

但新的数据中心不会从一开始就减轻数据负载。它甚至会给自己带来同样的负担。(因此,您需要5个以上的节点来同时完成这两个问题。少数节点可以减轻重量,其他节点可以通过创建新的数据中心来隔离读写。此外,新的数据中心应该有5个以上的节点)。最佳实践是通过添加新节点或增加数据限制来监控数据负载并在此类问题发生之前进行修复

考虑到这一点,您还需要确保为读写提供的节点应该来自不同的数据中心

假设您有以下情况:

dc1(n1、n2、n3、n4、n5)

dc2(n6、n7、n8、n9、n10)

现在,对于节点n1提供的读取和节点n6提供的写入

现在,可以通过从以下选项中选择正确的一致性级别来实现读/写隔离:

当地法定人数

本地一号

这些基本上只会将副本搜索限制在本地数据中心

有关更多信息,请参阅这些参考资料: 和

通常当集群达到极限时,我们会向集群添加新节点。添加新节点后,旧的
cassandra
集群节点将把它们的数据分发到新节点。然后,我们在每个节点中使用
nodetool cleanup
来清理分发到新节点的数据。整个场景发生在一个DC中

例如:

假设在
DC1
中有3个节点
(A、B、C)
,在
DC2
中有1个节点
(D)
。您的节点正在达到其极限。因此,决定向DC1添加一个新节点
(E)
。节点
A
B
C
将其数据分发到节点
E
,我们将在
A
B
C
中使用
nodetool cleanup
来清理空间


谢谢你的回复。我的理解是:如果我将一个节点添加到集群中,旧节点中的数据将保持原样,但是使用cassandra的vnodes和一个合适的分区策略,新数据将被发送到新节点,旧节点也将继续获取数据。你是说通过添加一个节点,Cassandra会从旧节点获取一些数据,将其传输到新节点,然后从旧节点删除这些传输的数据吗?我的意思几乎是一样的。如果将节点添加到同一数据中心,则会为其分配一些令牌范围,以增加总体数据负载(将通过闲聊通知其他节点)。与此令牌范围对应的数据将由该新节点保留。因此,一些旧节点将释放其自身的一些负载。此外,此新的数据分布将不均匀。但通过运行nodetool修复,这可能是平衡的。PS。其nodetool CleanUploy****。太棒了。谢谢。