在 cassandra.yaml 中获取超过 max_value_size_in_mb 的值的错误

Posted

技术标签:

【中文标题】在 cassandra.yaml 中获取超过 max_value_size_in_mb 的值的错误【英文标题】:Getting error for value exceeding max_value_size_in_mb in cassandra.yaml 【发布时间】:2020-04-25 15:44:24 【问题描述】:

现在我在 Cassandra system.log/debug.log 上观察到一些错误,并且在出现以下错误后节点突然关闭。

CorruptSSTableException 因为值长度超过了最大值 287435456,这是通过 cassandra.yaml 中的 max_value_size_in_mb 设置的

在发现 Cassandra 文档中查看此值时:-

ma​​x_value_size_in_mb 该选项默认被注释掉。 SSTables 中任何值的最大大小。早期检测 SSTable 损坏的安全措施。任何大于此阈值的值都会导致将 SSTable 标记为已损坏。这应该是正数并且小于 2048。 默认值:256

在我的情况下,这个值也是默认值,即 256。但我的问题是:-

1)这个值是什么意思?它是任何 SStables 的最大大小吗? 2)为什么节点在超过此值或出现此错误后关闭?

提前致谢!

【问题讨论】:

【参考方案1】:

这个值是什么意思?

您的数据库文件中的行(SSTable 之一)大于允许的最大大小,或者 SSTable 文件已损坏,因为元数据包含超出合理限制的值(行大小)。

它是任何 SStables 的最大大小吗?

它是 SSTable(表的一部分)中任何值(行)(单条数据)(键/值对)(元组)的最大允许大小。

注1:SSTable是数据库的数据存储格式。它只是对字符串(行)进行排序。通常,一个表由一组包含不同部分数据的 sstable 文件组成。

注 2:表格行在磁盘上的外观如何? :

Row [ Len: uint64_t, Data: char[Len] ]
Len must be < max_value_size_in_mb (256MB by default)

为什么节点在超过此值或出现此错误后关闭?

我不知道一个节点是否会在发现 sstable 损坏时关闭。它可以将其标记为已损坏并从那时起忽略它。因此,它可能不相关。

基本上,如果您的 1 个 sstables 损坏,那么您要么丢失数据,要么可能会看到以前的版本或删除的行。因此,从一致性的角度来看,让客户端与损坏的表进行交互并不是一个很好的主意。但是行为取决于数据库。

【讨论】:

感谢@Ivan 的回复。所以它只是任何表字段的值,对吗?这是默认的 256 MB。如果任何表值超过此限制,cassandra 将认为该 sstable(此值所在的位置)已损坏,那么该 sstable 上存在的数据呢?会不会是数据丢失?如果压缩运行,那么该表也被压缩?在我的例子中,Node 在这个错误之后被关闭了。

以上是关于在 cassandra.yaml 中获取超过 max_value_size_in_mb 的值的错误的主要内容,如果未能解决你的问题,请参考以下文章

如果在 cassandra.yaml 中启用了 auto_snapshot,那么这些快照啥时候会被删除

在Cassandra中加载cassandra.yaml之外的其他配置文件

我应该在 cassandra.yaml 中为 listen_address 使用啥地址?

Cassandra 配制 cassandra.yaml

我应该在 cassandra.yaml 中为 broadcast_rpc_address 使用啥地址

cassandra.yaml中的群集配置问题,用于多节点群集,其中只有1个公共IP