当复制因子= =簇大小时,Cassandra分区如何工作?

时间:2015-04-14 18:59:56

标签: cassandra replication partitioning distributed-system

背景:

我是Cassandra的新手,仍然试图围绕内部工作进行思考。

我正在考虑在一个只有少量节点(少于10个,最常见的是3个)的应用程序中使用Cassandra。理想情况下,我的集群中的每个节点都将拥有所有应用程序数据的完整副本。所以,我正在考虑将复制因子设置为簇大小。添加其他节点时,我会更改键空间以增加复制因子设置(nodetool修复以确保它获取必要的数据)。

我将使用NetworkTopologyStrategy进行复制,以利用有关数据中心的知识。

在这种情况下,分区实际上如何工作?我已经读过在Cassandra中形成环的节点和分区键的组合。如果我的所有节点都对每个数据“负责”而不管分区器计算的哈希值,我是否只有一个分区键的环?

这种类型的Cassandra部署是否有巨大的挫折?我猜测会在后台进行大量的异步复制,因为数据会传播到每个节点,但这是设计目标之一,所以我没关系。

读取的一致性级别通常可能是“一个”或“local_one”。

写入时的一致性级别通常为“2”。

要回答的实际问题:

  1. 复制因子==群集大小是一个常见的(甚至是合理的)部署策略,除了一个群集的明显情况之外?
  2. 我是否真的有一个分区的响铃,分区器生成的所有可能值都转到一个分区?
  3. 每个节点都被认为对每行数据都“负责”吗?
  4. 如果我使用“one”的写一致性,Cassandra是否总是将数据写入客户联系的节点?
  5. 这个策略还有其他我不知道的垮台吗?

2 个答案:

答案 0 :(得分:5)

  

我实际上是否有一个分区的环,其中包含所有可能的值   由分区程序生成的转到一个分区?

     

每个节点都被认为对每行数据都“负责”吗?

     

如果我的所有节点都对每条数据“负责”,无论如何   分区器计算出的哈希值,我只有一个响铃   一个分区键?

不完全是,C *节点仍然具有令牌范围,而c *仍然将主要副本分配给“负责”节点。但是所有节点也将具有RF = N的复制品(其中N是节点数)。所以本质上暗示与你描述的一致。

  

这种类型的Cassandra部署是否有巨大的挫折?   我不知道这个战略还有其他垮台吗?

不是我能想到的,我猜你可能比不平均数据更容易受到影响,所以使用C *的反熵机制来解决这个问题(修复,读修复,提示切换)。

一致性级别法定人数或所有会开始变得昂贵,但我发现您不打算使用它们。

  

复制因子==簇大小是常见的(甚至是合理的)   部署策略除了一个群集的明显情况之外?

这种情况并不常见,我猜您正在寻找超高可用性,并且所有数据都适合放在一个盒子上。我认为我从来没有见过使用RF>的c *部署。 5.远射和宽射频= 3。

  

如果我使用“一”的写一致性,Cassandra总是如此   将数据写入客户端联系的节点?

这取决于驱动程序的负载平衡策略。通常我们选择令牌感知策略(假设您正在使用其中一个Datastax驱动程序),在这种情况下,请求会自动路由到主副本。您可以在您的情况下使用循环法并具有相同的效果。

答案 1 :(得分:0)

当您添加节点时,主要的垮台将增加协调员级别的写入成本。写入I的最大副本数大约为8(其他数据中心为5,本地副本为3)。

实际上,这意味着在执行大写或批量写入(大于1mb)或每个节点写入TPS较低时稳定性会降低。

主要优点是你可以做很多通常很糟糕且不可能完成的事情。想要使用二级索引?可能会运行得相当好(假设基数和分区大小不会成为你的瓶颈)。想要添加一个可以进行GroupBy的自定义UDF,或者使用非常大的IN查询,它可能会起作用。

正如@Phact提到的不是常见的使用模式,我主要看到它与DSE Search一起用于低写入吞吐量用例,这些用例需要单个节点'来自Solr的功能,但对于纯Cassandra的相同用例,您可以在读取方面获得一些好处,并且能够执行在更分散的群集中通常无法进行的昂贵查询。