2017-09-05 46 views
0

我的项目需要阅读是这样的。我们使用多数据中心(DC)cassandra集群。在写入集群期间,我只希望LOCAL DC在其节点上执行写操作,因为我们已经根据写入启动的源,将写请求路由到所需的DC。所以,我只需要LOCAL DC来处理写操作,而不需要其他DC来在其节点上执行写操作。但后来凭借跨DC的节点之间的复制,我希望跨数据中心复制写入的数据。当我首先限制写入只有一个DC时,是否可以跨DC进行这种复制?我想为此使用DCAwareRoundRobin策略。如果我在写入操作期间没有打开连接到位于不同DC中的REMOTE主机的连接,稍后可能会在DC之间进行数据复制。为什么我肯定需要在所有DC中复制数据是因为在从群集读取数据期间,我们希望从读取请求的任何DC读取数据,而不一定是本地数据。卡桑德拉多相DC:需要写在本地和从任何DC

回答

2

是的,这是绝对有可能。前缀为“LOCAL_”的一致性级别允许将数据写入单个数据中心并将其异步复制到其他数据中心。但是在这种情况下,只能保证最终的一致性,这意味着由于异步复制,写入的数据不会立即出现在其他数据中心。如果您需要数据中心之间的强一致性,那么您应该将一致性级别与前缀“EACH”一起使用,但这会显着影响延迟。

如果您需要单一数据中心的写入请求具有较强的一致性,则应满足以下规则(nodes_written + nodes_read)> number_of_replicas,例如,如果每个数据中心中有3个副本,则应执行读取和写入请求与LOCAL_QUORUM一致性级别(2 + 2> 3)。如果最终一致性足够,则可以使用LOCAL_ONE。

There is类似的案件在“地理地区情况”一节。

+0

感谢您的回答尼基塔。再一次澄清。我在多相DC集群中使用LOCAL_QUORUM读一致性三个区议会 - DC1,DC2,DC3在每个DC用3.复制因子三个节点在读,让我们假设在请求DC1的节点上首次土地。该节点已经失败并且DC1中的第二个节点被联系等等,并且假定DC1中的所有节点都失败了。然后,集群将查找DC2还是DC3以满足LOCAL_QUORUM,即,查找是否从任一DC(DC2或DC3)获得两个一致读取的确认,如果是,读取是否会被视为成功? –

+0

如果LOCAL_QUORUM在本地数据中心无法成功,CQL查询不会触及其他数据中心。但是司机你提到使用DCAwareRoundRobinPolicy实现这样的功能,但目前看来,这是[不推荐](https://medium.com/@foundev/cassandra-local-quorum-should-stay-local-c174d555cc57)。也[本文](https://medium.com/@foundev/cassandra-how-many-nodes-are-talked-to-with-quorum-also-should-i-use-it-98074e75d7d5)可以是有帮助选择适当的一致性水平。 –