在Cassandra中,我们能否“修复”某个特定分区键所在的节点以优化获取?
这是对特定键空间和表的优化,其中一个数据中心编写的数据永远不会被不同数据中心上的客户端读取。如果一个特定的分区键只在特定的数据中心中被查询,那么是否有可能通过将其“固定”到写入它的同一数据中心的节点来避免网络延迟呢?
换句话说,这是一个用例,模式在所有数据中心都是通用的,但数据从来没有跨数据中心访问过。这样做的一种方法是将数据中心id作为分区键。但是,特定数据中心的数据需要/不应该放在其他数据中心。我们是否可以通过指定cassandra作为数据中心映射的分区键来进行优化?
自定义分区器是这种用例的解决方案吗?
发布于 2014-07-15 00:13:17
数据容量太大,无法在所有数据中心复制。因此,我诉诸于为每个数据中心创建一个密钥空间。
CREATE KEYSPACE "MyLocalData_dc1"
WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'dc1' : 3, 'dc2' : 1, dc3:0, dc4: 0};
CREATE KEYSPACE "MyLocalData_dc2"
WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'dc1' : 0, 'dc2' : 3, dc3:1, dc4: 0};这样,由数据中心1生成的MyLocalData在数据中心2中有一个备份,由datacenter2生成的数据被备份在数据中心3中,数据在它被写入和访问的数据中心中被“固定”。避免了网络延迟。
发布于 2014-07-11 10:52:21
你应该能够使用卡桑德拉的“数据中心意识”来解决这个问题。您将无法让它在行级别强制执行这种意识,但您可以在键空间级别执行。因此,如果您有特定的键空间,您知道只有特定的位置(并由特定的数据中心提供服务)才能访问这些密钥空间,那么您可以配置您的密钥空间来进行相应的复制。
在cassandra-topology.properties文件中,您可以定义哪些节点位于哪个机架和数据中心中。然后,确保您使用的是一个告密者(在您的cassandra.yaml中),它将尊重拓扑条目(例如: propertyFileSnitch)。
然后,在创建密钥空间时,可以根据每个数据中心定义复制因子:
CREATE KEYSPACE "Excalibur"
WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'dc1' : 3, 'dc2' : 2};要使客户端应用程序只访问某些数据中心,可以指定一个LOCAL 读一致性 (例如:LOCAL_ONE或LOCAL_QUORUM)。这样,您的客户端应用程序在一个领域将只从一个特定的数据中心读取。
特定数据中心的数据需要/不应该放在其他数据中心。
虽然这个解决方案不能解决问题的这一部分,但是,除非您有磁盘空间问题(在当今时代,您不应该这样做),否则在紧急情况下拥有额外的数据副本可以拯救您的生命。如果要丢失特定数据中心中的一个或所有节点,并且必须重新构建它们,则群集范围内的修复将恢复数据。否则,如果保持数据分离真的很重要,那么您可能需要考虑将数据中心拆分成不同的集群。
发布于 2014-07-11 11:41:02
Cassandra使用分区策略确定存储行的节点。通常,您使用的是一个分区器,例如Murmur3分区器,它有效地、随机地、统一地分配行。您可以用Java编写和使用您自己的分区程序。也就是说,你应该谨慎行事。是否确实要将行分配给特定节点。
https://stackoverflow.com/questions/24664464
复制相似问题