在Cassandra中,我们可以“修复”特定分区键所在的节点以优化提取吗?
这是针对特定键空间和表的优化,其中由一个数据中心写入的数据永远不会被不同数据中心上的客户端读取。如果仅在特定数据中心查询特定分区密钥,是否可以通过将其“修复”到写入它的同一数据中心的节点来避免网络延迟?
换句话说,这是一种用例,其中架构在所有数据中心都是通用的,但数据从不跨数据中心访问。一种方法是将数据中心id作为分区键。但是,特定数据中心的数据需要/不应该放在其他数据中心。我们可以通过某种方式将cassandra指定为数据中心映射的分区键吗?
自定义分区程序是否是这种用例的解决方案?
答案 0 :(得分:2)
您应该能够使用Cassandra"数据中心意识"解决这个问题。您无法在行级别上强制执行该感知,但您可以在键空间级别执行此操作。因此,如果您知道某些键空间仅由某些位置访问(并由特定数据中心提供),则可以将键空间配置为相应地进行复制。
在cassandra-topology.properties file中,您可以定义哪个节点位于哪个机架和数据中心。然后,确保您使用的是一个与cassandra.yaml
相符合的拓扑条目(例如:propertyFileSnitch)。
然后,当您创建密钥空间时,您可以基于每个数据中心定义复制因子:
CREATE KEYSPACE "Excalibur"
WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'dc1' : 3, 'dc2' : 2};
要让您的客户端应用程序仅访问某些数据中心,您可以指定LOCAL
read consistency(例如:LOCAL_ONE
或LOCAL_QUORUM
)。这样,您在一个区域中的客户端应用程序将只从特定数据中心读取。
特定数据中心的数据需要/不应该放在其他数据中 中心。
虽然这个解决方案无法解决您问题的这一部分,但除非您有磁盘空间问题(在当今时代,您不应该)拥有额外的数据副本可以节省您的紧急情况。如果您丢失特定数据中心中的一个或所有节点并且必须重建它们,则群集范围的修复将恢复您的数据。否则,如果保持数据分离非常重要,您可能需要考虑将数据中心拆分为单独的集群。
答案 1 :(得分:2)
Cassandra使用 partioner 策略确定存储行的节点。通常,您使用分区器(例如Murmur3分区程序),可以有效地随机分配行,从而均匀分布行。您可以使用Java编写和使用自己的分区程序。也就是说,你应该谨慎这样做。您确实想要为特定节点分配行。
答案 2 :(得分:1)
数据太庞大,无法在所有数据中心内复制。因此,我正在为每个数据中心创建一个密钥空间。
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中有一个备份。数据中心2生成的数据在数据中心3备份。数据在数据中心“固定”,写入并访问。避免网络延迟。