Cassandra 总计 Space 计算

Cassandra Total Space Calculation

产品供应商建议我们使用 Cassandra 以获得更好的可扩展性。

我们的数据宇宙大约有 10 TB。产品供应商坚持我们可以将这 10 TB 存储在 6 个节点中,每个节点有 2 TB space。

这怎么可能?我们需要假设什么复制因子或压缩来实现上述目标?

视情况而定。

当您使用 LZ4Compressor 时,cassandra 中的数据以 gzip 格式存储,这是默认设置。 如果我们为了简单起见完全忽略压缩率,您可以使用此工具来计算节点负载:

https://www.ecyrd.com/cassandracalculator/

如果集群大小为 6,我建议 RF=3,这意味着每个节点必须保存 50% 的数据,在您的情况下为 5TB(未压缩)。

即使 RF=1(您不应该使用),每个节点也必须持有总数据的 17%。

这是一个比较难回答的好问题。 Cassandra 节点的大小实际上取决于因素的数量,而不仅仅是数据的大小:

  • 您需要考虑数据的非规范化,以便能够 运行 您需要执行的查询
  • 您在数据库中存储的数据类型 - 数字、文本、二进制等 - 如果您使用压缩,这将影响压缩率。 (我看到了不同的值——从压缩到原始数据大小的 10%,到数据不可压缩时的负压缩比)
  • 表的分区模式(宽分区与窄分区,因为对于窄分区的热数据,您可能需要禁用压缩等)
  • 您需要考虑存储元数据的开销,例如 TTL 和写入时间(您拥有的列越多,开销越高)
  • 您需要考虑有关可用磁盘的建议 space,这是维护任务(如压缩、快照等)所必需的
  • ...

通常,建议创建一个测试环境(例如,在 AWS 上),并执行数据生成和负载测试以找到合适的硬件大小,并了解磁盘上将存储多少数据。我个人可以推荐使用 NoSQLBench that is high performance & very flexible regarding the data generation - there is a big number of existing schemas that could be used for initial testing, and you can create your own schemas as well. (You can still use built-in cassandra-stress, but it's less flexible. There is also tlp-stress,但它也可能比 NoSQLBench 稍微不灵活)

有许多现有文档可能有助于容量规划和调整,例如(当然还有更多):

关于您的具体设置,建议 RF=3 和 6 个节点,并保留磁盘 space(悲观情况是所有磁盘的 50% space,我们可以说它可能是30-35% 的磁盘 space),您的集群可能存储 ~2.5-2.6Tb 的数据(不使用任何压缩):(2Tb x 0.65 x 6)/3。要让它存储 10Tb 的数据,你的压缩率应该是原始大小的 ~25%,但这对你的数据来说可能是不可能的。

Cassandra 集群大小取决于多种因素,而不仅仅是 RDBMS 中出现的原始数据。

一致性 - 你应该考虑你的 read/write 一致性,因此你必须决定你的 RF(复制因子) 数据建模——你必须确保你的数据模型,需要注意你正在使用的分区和集合。 压缩策略——在 Cassandra 中,提供了三种类型的压缩策略。都是为了不同的目的,比如

  1. STCS 适合写入
  2. LCS 适合阅读
  3. TWCS 适用于我们了解 TTL 的时间序列。

并且您必须确保大约 50% 的磁盘可用于这些压缩。