在 cassandra 中将 json 存储为文本与 blob 的优缺点是什么?

What are the pros or cons of storing json as text vs blob in cassandra?

对我来说,blob 的一个问题是,在 java 中,ByteBuffer(映射到 cassandra 中的 blob)不是可序列化的,因此不能很好地与 EJB 一起工作。

考虑到 json 相当大,在 cassandra 中存储 json 的更好类型是什么。是文本还是 blob?

在决定 blob 与 json 时 json 的大小是否重要?

如果是oracle之类的任何其他数据库,通常使用blob/clob。但是在 Cassandra 中,每个单元格可以容纳 2GB,这有关系吗?

对于这种情况,请将此问题视为在文本与 blob 之间进行选择,而不是根据有关是否对 json 使用单列的建议进行排序。

由于数据不是二进制的,因此几乎没有理由使用二进制大对象。当然你可以做到,但为什么呢?文本更易于人类阅读,并且实际上并没有 speed/size 差异(。

即使在其他数据库中,您通常也可以将 JSON 存储为文本。例如。甚至 MySQL 的文本字段也可以处理相当多的文本 (LONGTEXT = 4Gb)。是的,Oracle 落后了,但希望他们有时也会得到一个合理的长文本字段。

但是为什么要将整个 Json 对象存储为文本? json 应该真正规范化并存储为数据库中的多个字段。

在即将发布的 2.2 版本中,Cassandra 还提供了对 JSON 的原生支持。 http://www.datastax.com/dev/blog/whats-new-in-cassandra-2-2-json-support

我肯定会说文本比 blob 更适合存储 JSON。 JSON 最终是文本,所以这种类型是有意义的,但对于 blob 可能会有额外的开销,因为一些驱动程序似乎要求在插入它们之前将它们转换为十六进制。此外,在使用 cqlsh 时,blob 显示为 base64 编码的字符串,因此如果出于测试目的需要,您将无法轻松检查 JSON 实际存储的内容。我不确定 blob 究竟是如何存储在磁盘上的,但我想它与文本的存储方式非常相似。

话虽如此,存储大条目可能会导致问题 is not recommended。这可能会导致分片问题并消耗大量内存。虽然 FAQ 提到的文件超过 64MB,但根据经验,即使每个平均几兆字节的文件在您开始存储大量文件时也会导致性能问题。如果可能的话,如果您希望 JSON 的大小为兆字节并在 Cassandra 中存储对该存储的引用,那么最好使用对象存储。

我认为在 Cassandra 中将 文字 JSON 数据存储为 BLOB 没有任何好处。充其量您的存储成本是相同的,并且通常 API 在使用 BLOB 类型方面不如它们在使用 strings/text 方面方便。

例如,如果您使用他们的 Java API,那么为了使用参数化 PreparedStatement 将数据存储为 BLOB,您首先需要将其全部加载到ByteBuffer,例如将您的 JSON 数据打包成 InputStream

除非您处理的是非常大的 JSON 片段,这些片段无论如何都会迫使您流式传输数据,否则需要做一些额外的工作才能访问BLOB 类型。你会从中得到什么?基本上没有。

但是,我认为问“我应该将 JSON 存储为文本,还是 gzip 并将压缩数据存储为 BLOB'。

答案取决于您如何配置 Cassandra 和您的 table。特别是,只要您使用的是 Cassandra 1.1 版或更高版本,您的 table 就会默认启用压缩。这可能就足够了,特别是如果您的 JSON 数据在每一行中都相当统一。

但是,Cassandra 的内置压缩应用于 table 范围,而不是应用于单个行。因此,您可以通过在存储前手动压缩 JSON 数据,将压缩字节写入 ByteBuffer,然后将数据作为 BLOB.[= 传输到 Cassandra 来获得更好的压缩率。 24=]

所以它本质上归结为在存储 space 与编程便利性与 CPU 使用方面的权衡。我将决定如下:

  1. 最小化消耗的存储量是您最大关注的问题吗?
    • 如果是,压缩 JSON 数据并将压缩后的字节存储为 BLOB;
    • 否则,继续#2。
  2. Cassandra 的内置压缩是否可用并已为您的 table 启用?
    • 如果否(如果您无法启用压缩),压缩 JSON 数据并将压缩后的字节存储为 BLOB;
    • 否则,继续#3。
  3. 您将在每一行中存储的数据是否相对统一?
    • 可能对于 JSON 数据,答案是 'yes',在这种情况下,您应该将数据存储为文本并让 Cassandra 处理压缩;
    • 否则继续#4。
  4. 你要效率还是方便?
    • 效率;压缩 JSON 数据并将压缩后的字节存储为 BLOB
    • 方便;压缩 JSON 数据,base64 压缩数据,然后将 base64 编码的数据存储为文本。