cassandra 中的地理感知分区

Posted

技术标签:

【中文标题】cassandra 中的地理感知分区【英文标题】:Geo-aware partitioning in cassandra 【发布时间】:2015-04-16 13:12:30 【问题描述】:

我目前正计划设置一项服务,该服务应该(迟早)全球可用,对可用性和容错性有很高的要求。将有很高的读取和写入比率,并且系统应该能够按需扩展。

我计划的服务的一个更特殊的属性是,数据将非常绑定到某个地理位置 - 例如。在 99.99% 的情况下,针对美国城市的数据将永远不会从欧洲查询(实际上,即使针对某个城市的数据也不太可能从该城市旁边的城市查询)。

我想要最小化的是:

    管理开销 网络延迟 不必要的数据复制(我不想在美国完全复制用于欧洲的数据)

在存储技术方面,我认为我最好的存储解决方案是 cassandra。我看到的用例选项是:

    在每个地理位置使用完全隔离的 cassandra 集群,并结合手动配置的路由服务,该服务会根据插入/选择查询选择正确的集群 部署全球集群并为某些地理位置定义多个数据中心,以确保该地区的高可用性 在不使用数据中心的情况下部署全局集群 在不使用数据中心的情况下部署全局集群,并将分区操作为地理感知。我的计划是根据地理位置(例如 000:北美,001:南美,010:非洲,011:南/西欧等)操作分区键的前 3 位并分配剩余位使用哈希算法(类似于 cassandras 随机分区器)。

解决方案 1 的缺点可能是巨大的管理开销和大量的人工工作;第二种解决方案的缺点是大量不必要的数据复制;第三种解决方案的缺点是由于世界范围内的随机分区,网络延迟非常高。

因此,理论上,我最喜欢解决方案 4。在这里,我将拥有相当多的管理开销、少量不必要的数据复制和良好的可用性。然而,为了实现这个(据我所知),我需要一个 ByteOrderPartitioning,许多来源都强烈反对它。

有没有办法在不使用 ByteOrderPartitioning 的情况下实现接近解决方案 4 的解决方案,或者这是 ByteOrderPartitioning可能有意义的情况,还是我错过了明显的第五个解决方案?

【问题讨论】:

【参考方案1】:

重新考虑选项 2。

它不仅可以解决您的问题。它甚至可以为您解决地理冗余问题。正如您提到的,您需要具有高可用性。如果其中一个数据中心死亡,在不同的数据中心拥有一份副本听起来不错。

如果您坚决反对在 DC 之间进行复制,那么这也是一个选择。您可以在不同区域拥有多个 DC,而无需在它们之间进行复制。

【讨论】:

我同意在发生中断的情况下拥有 一两个 备份 DC 是个好主意,但我不喜欢运送全部的想法每个地理位置的数据,因为这很容易导致每个地理位置的存储需求增加 10 倍,并且位置之间的流量可能增加 100 倍。 所有数据必须运送到每个位置的原因是什么?你可以指定它应该去哪里。您可以将复制限制为仅复制到邻近城市。 这种复制到邻近位置的限制正是我所需要的。但是在阅读了几篇关于数据分区和复制的文章之后,似乎只能为每个 DC 指定一个复制因子,但是我无法操纵某个日期只存储在一个(或可能是一个备份)DC 中

以上是关于cassandra 中的地理感知分区的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra 不使用本机方法

cassandra中的分区计数

Cassandra 3.11.1 地理空间支持

cassandra 查询超时

Oracle 到 Apache Cassandra 数据迁移

如何在 Java 中的 Cassandra 中注释/使用复合分区键?