避免部署Cassandra作为一个完整的网格



我们想使用Cassandra进行分布式配置管理。

我们的部署是一个"树"结构。例如,我们有一个单一的中央管理数据中心(EMS),它应该"看到"所有被管理的数据中心(SDCA、DSCB、SDCC……)。每个被管理的数据中心应该只看到自己的数据,而可能看不到其他被管理的数据中心的数据(例如SDCA不需要看到SDCB的数据)。

在网络问题中,被管理的数据中心不是直接相互连接,而是通过中央数据中心(EMS)连接。

            +------+
            | EMS  |
            +------+
                |
                |
    +-----------+-----------+
    |           |           |
    |           |           |
+--------+   +-------+   +-------+
| SDC-A  |   | SDC-B |   | SDC-C |  ...
+--------+   +-------+   +-------+

这个结构可以用Cassandra实现吗,或者Cassandra在所有节点之间强制一个完整的网格?

您可以通过keyspace定义来控制数据在Cassandra中的位置。

对于您只希望存储在SDC-A中的数据,您将创建一个像这样的键空间:

CREATE KEYSPACE SDCA WITH replication = {'class': 'NetworkTopologyStrategy', 'SDC-A': '1'};

然后您将在keyspace SDCA中创建表,并且插入到这些表中的任何数据将仅存储在名为SDC-A的数据中心中。好的是客户端可以连接到整个集群中的任何节点来执行这些插入,Cassandra会将数据路由到SDC-A,而不会将其存储在任何其他数据中心。

因此,对于您的示例,您可以创建四个键空间,每个数据中心一个,并且每当插入数据时都将使用所需的键空间。

或者您可以创建三个键空间,其中每个键空间将数据复制到EMS和一个SDC。但是,如果您将A/B/C中的所有内容复制到EMS中,则需要小心,因为它将在EMS中加载三倍的数据。

现在,如果您实际上不想将A/B/C中的数据复制到EMS中,那么您仍然可以从EMS中的节点查询数据,因为Cassandra只会联系所请求的键空间中的节点以获取数据。这样做的缺点是访问远程数据中心的延迟更长。

但是这假设你在所有的数据中心之间都有连接,所以如果A/B/C不能相互通信,你就不能以这种方式利用Cassandra的多数据中心支持。

最新更新