我们想使用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的多数据中心支持。