首页 > 解决方案 > 是否可以在具有多个数据中心的 cassandra 集群中拥有“本地”键空间

问题描述

我可以通过不在我的密钥空间复制定义中包含另一个数据中心来防止密钥空间同步到另一个数据中心吗?显然,事实并非如此。

在我自己的测试中,我在 GCP 中建立了两个 Kubernetes 集群,每个集群都用作 Cassandra 数据中心。每个 k8s 集群有 3 个节点。

我首先设置了数据中心 DC-WEST,并使用以下方法创建了一个键空间演示: CREATE KEYSPACE demo WITH replication = {‘class’: ‘NetworkTopologyStrategy’, ‘DC-WEST’ : 3};

然后我设置了数据中心 DC-EAST,没有添加任何使用键空间。

为了加入两个数据中心,我修改了CASSANDRA_SEEDSCassandra StatefulSet YAML 中的环境变量以包含来自两个数据中心的种子节点(我使用主机网络)。

但在那之后,我注意到密钥空间demo已同步到 DC-EAST,即使密钥空间在复制中只有 DC-WEST。

cqlsh> select data_center from system.local
... ;

data_center
-------------
DC-EAST     <-- Note: this is from the DC-EAST datacenter

(1 rows)
cqlsh> desc keyspace demo

CREATE KEYSPACE demo WITH replication = {'class': 'NetworkTopologyStrategy', 'DC-WEST': '3'}  AND durable_writes = true;

所以我们在 DC-EAST 中看到了demo应该只在 DC-WEST 上复制的键空间!我究竟做错了什么?

标签: cassandrakubernetes

解决方案


Cassandra 复制策略控制数据的放置位置,但实际模式(表/数据中心/等的存在)是全局的。

如果您创建一个只存在于一个 DC 中的密钥空间,所有其他 DC 仍将在其架构中看到该密钥空间,甚至会在磁盘上创建目录结构,尽管不会将任何数据复制到这些主机。


推荐阅读