我可以将一些键空间复制到某些节点吗?

Can I have some keyspaces replicated to some nodes?

我正在尝试构建多个 API,我想用 Cassandra 为其存储数据。我正在设计它,就好像我会有多个主机一样,但是,我设想的主机有两种类型:受信任和不受信任。

因此,我有一些数据不想最终复制到一组主机上,但其余数据要复制到任何地方。

我考虑简单地为 public 数据制作一个节点,为受保护的数据制作一个节点,但这将需要受信任的主机 运行 两个节点,这也会使 API 与数据交互。

我也在 docker 容器中构建它,我希望会有频繁的节点 creation/destruction 受信任和不受信任。

我想知道是否可以使用键空间来实现我需要的复制策略。

简而言之:不,你不能。

来自一个完整环的 cassandra 集群中的所有节点,您的数据将与您选择的分区程序一起分发。

您可以在 cassandra 中拥有多个密钥空间以及身份验证和授权,并将您的可信和不可信数据拆分到不同的密钥空间中。或者您使用两个集群来拆分数据。

根据我的经验,您也不应该像日常事务一样尝试创建和销毁 Cassandra 节点。添加和删​​除节点的成本很高,并且需要进行监控,因为您的集群需要维护复制等。因此,最好从 api 节点中拆分 cassandra 集群。

您可以拥有两个数据中心,一个拥有您的 public 数据,另一个拥有私有数据。您可以将密钥空间复制配置为仅将该数据复制到一个(或两个)DC。请参阅 replication for NetworkTopologyStrategy

上的文档

但是这里存在安全问题,因为所有节点都需要能够通过八卦协议相互访问,而且您的客户端应用程序可能需要联系两个 DC 以进行不同的读取和写入。

我建议您考虑配置安全性 SSL for starters and then perhaps internal authentication。请注意,Kerberos 也受支持,但这对于您至少现在所需要的来说可能太复杂了。

您也可以考虑查看 firewall docs 以查看节点之间和来自客户端的端口,以便您知道要锁定哪些端口。

最后,正如上面的海报所提到的,过于频繁地销毁/创建节点并不是一个好的做法。 Cassandra 旨在能够在 运行ning 时扩大/缩小您的集群,但它可能是一项代价高昂的操作,因为它不仅涉及从/向被删除/添加的节点流式传输数据,还涉及其他节点围绕令牌进行洗牌重新平衡的范围。

您可以在 docker 个容器中 运行 个节点,但是请注意,您需要注意不要做一些事情,例如多个容器都访问相同的物理资源。 Cassandra 对 io 延迟非常敏感,例如,多个容器共享同一物理磁盘可能会导致性能问题。