我正在研究Cassandra,并正在为我正在进行的项目 Build 一个集群 . 考虑这个例子:假设我设置了一个5节点集群,每个集群有200 GB的空间 . 这相当于总共1000 gb(约1 TB)的空间 . 假设我的分区在群集中平均分配,我可以轻松添加节点并实现线性可伸缩性 . 但是,如果这5个节点开始接近SSD限制200 gb怎么办?在这种情况下,我可以添加5个节点,现在分区将分成10个节点 . 但旧节点仍然会写入数据,因为它们是群集的一部分 . 有没有办法让这5个旧节点“只读”?我想在整个集群中拍摄随机读取查询,但不想再写入旧节点(因为它们的上限为200 gb) .
非常感谢帮助 . 谢谢 .
注意:我可以说99%的查询都是写查询,读数为1%或更少 . 该应用程序必须在Cassandra中保留点击事件 .
2 回答
正确理解问题的问题 .
我假设你知道通过添加新的5个节点,一些数据加载将被转移到新节点,因为一些令牌范围将被分配给它们 .
现在,正如您所知,如果您担心旧的5个节点由于达到其限制而无法写入,那么它不会发生,因为新节点已共享数据负载,因此这些节点现在可用于进一步写入 .
将读取和写入节点隔离是完全不同的问题 . 但是,如果您只想将读取隔离到这5个节点并写入新的5个节点,那么最好的方法是在同一个集群下的另一个数据中心添加新的5个节点,然后使用不同的一致性级别进行读取和写入满足您对旧数据中心只读的需求 .
但新数据中心不会从最初减轻数据负载 . 它甚至会对自己承担相同的负荷 . (因此,您需要超过5个节点才能同时完成这两个问题 . 很少有节点可以减轻重量,而其他节点通过创建新的数据中心来隔离读写 . 此外,新数据中心应该有超过5个节点) . 最佳做法是通过添加新节点或增加数据限制来监视数据负载并在此类问题发生之前修复它 .
考虑到这一点,您还需要确保您提供的用于读写的节点应来自不同的数据中心 .
考虑您有以下情况:
现在,为了读取,您提供了节点n1,并为您提供了节点n6的写入
现在可以通过从下面的选项中选择正确的一致性级别来完成读/写隔离:
这些基本上只会将搜索副本限制在本地数据中心 .
请查看这些参考资料以获取更多信息:Adding a datacenter to a cluster和Consistency Levels
通常当集群达到其限制时,我们将新节点添加到集群 . 添加新节点后,旧的
cassandra
集群节点将其数据分发到新节点 . 之后,我们在每个节点中使用nodetool cleanup
来清理分发到新节点的数据 . 整个场景发生在一个DC中 .