Cassandra部分复制

时间:2014-01-27 15:32:21

标签: cassandra replication

这是我对Cassandra的4个数据中心的配置:

create KEYSPACE mySpace WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1' : 1, 'DC2' : 1, 'DC3' : 1, 'DC4' : 1};

在此配置(Murmur3Partitioner + 256令牌)中,每个DC存储大约25%的密钥空间。并且这25%在彼此DC上复制3次。这意味着每一行都有4个副本。

例如,如果我的数据库要保留4个完整副本,那么如何配置cassandra以便每个DC只复制一次或两次(而不是DC的总数(x3))。

例如:存储在DC1上的密钥空间的25%我只想在DC2上复制一次。我不是在寻找任何特定的DC用于复制我也不在乎,如果将25%的DC1分成多个DC1,2,3我只想使用NetworkTopologyStrategy但是降低存储成本。

有可能吗?

谢谢 最诚挚的问候

1 个答案:

答案 0 :(得分:1)

您的keyspace命令显示每个DC保存1份数据。这意味着如果每个DC中有1个节点,则每个节点将拥有100%的数据。所以,我不确定你是如何得出结论,你的每个DC只存储25%的密钥,因为很明显它们存储100%。有可能当您运行nodetool命令时,您没有指定密钥空间,因此该命令会显示您基于分配给每个节点的令牌范围的加载,这会误导NetworkTopology设置。尝试使用您的键空间名称运行它,看看您是否注意到差异。

我认为没有办法按照您希望的方式使用任何现有的Snitch在DC周围移动数据。如果你真的想要均匀分布,并且每个DC中的节点数量相等,初始令牌均匀分布,那么你可以使用SimpleSnitch来实现你想要的效果。您可以将Snitch更改为SimpleSnitch并在每个节点上运行nodetool cleanup / repair。请记住,在此过程中,您将遇到一些中断,因为在SnitchChange之后,在修复作业完成之前,某些节点上可能无法使用先前编写的密钥。

NetworkTopology的工作方式是,如果你说你有DC1:1并且你在DC1中有2个节点,它将在2个节点之间均匀分配密钥,从而在每个节点上实现50%的有效负载。考虑到这一点,我认为你真正想要做的是保留3份数据,每份DC 1份。所以,你真的可以丢弃一个DC并省钱。我这样说是因为我认为你拥有的这些DC在你的NetworkTopology的概念中是虚拟的而不是真正的物理DC,因为没有人希望在一个DC中只有25%的数据,因为它不是可用的设置。因此,我建议您将节点分组为虚拟DC,将它们分组为4个机架,并维护1个DC:

DC1:
nd1-ra_1 rack-a
nd1-rb_1 rack-b
nd1-rc_1 rack-c

nd2-ra_2 rack-a
nd2-rb_2 rack-b
nd2-rc_2 rack-c

nd3-ra_3 rack-a
nd3-rb_3 rack-b
nd3-rc_3 rack-c

nd3-ra_4 rack-a
nd3-rb_4 rack-b
nd3-rc_4 rack-c

在这种情况下,如果将复制选项设置为DC1:3,则每个机架a,b和c将拥有100%的数据(每个机架中的每个节点25%)。