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

时间:2017-02-28 10:44:10

标签: database cassandra

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

非常感谢帮助。谢谢。

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

2 个答案:

答案 0 :(得分:1)

正确理解问题的问题。

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

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

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

但是新数据中心不会首先减轻数据负载。它甚至会对自己承担相同的负荷。 (因此,您需要超过5个节点才能同时完成这两个问题。很少有节点可以减轻重量,而其他节点可以通过创建新数据中心来隔离读写。此外,新数据中心应该有超过5个节点)。最佳做法是通过添加新节点或增加数据限制来监控数据负载并在此类问题发生之前修复它。

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

请考虑您有以下情况:

  

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

     

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

现在,为了读取,您提供了节点n1和用节点n6提供的写入

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

  

LOCAL_QUORUM

     

     

LOCAL_ONE

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

请查看以下参考资料: Adding a datacenter to a clusterConsistency Levels

答案 1 :(得分:1)

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

  

例如:

     

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