我在网上搜索了一些文档,以便更好地了解如何处理cassandra中的大分区。
我关注了以下链接上的文档:https://www.safaribooksonline.com/library/view/cassandra-high-performance/9781849515122/ch13s10.html. 关于“有压实限制的大排”,见下表:
“内存\u压缩\u限制\u in \u mb的默认值是64。该值在conf/cassandra.yaml中设置。对于具有固定列的用例,不应超过限制。设置此值可以用作健全性检查,以确保进程不会无意中将多个列写入同一个键。当使用行缓存时,具有许多列的键也会有问题,因为它需要将整行存储在内存中。”
在/conf/cassandra.yaml中,我确实找到了一个名为“in\u memory\u compression\u limit\u in\u mb”的配置。
在cassandra.yaml中的定义如下:在cassandra2.0中:内存中\u压缩\u限制\u内存中被压缩的行的大小限制(默认值:64)。较大的行溢出到磁盘并使用较慢的两次压缩过程。发生这种情况时,会记录一条指定行键的消息。建议的值是可用java堆大小的5%到10%。
在cassandra 3.0中:(在cassandra.yaml中找不到这样的条目)compression\u large\u partition\u warning\u threshold\u mb(默认值:100)cassandra在压缩大于设置值的分区时记录警告
我已经搜索了很多关于内存中的设置,压缩限制,mb中的设置。它提到一些压缩是在内存中完成的,一些压缩是在磁盘上完成的。根据我的理解,当压缩过程运行时:从磁盘读取sstable-->(比较,删除逻辑删除,删除过时数据)所有操作都发生在内存中--->新sstable写入磁盘-->删除旧表此操作对磁盘空间和磁盘i/o(带宽)的要求很高。如果我对压实的理解有误,一定要帮助我。在压缩过程中,有什么事情发生在记忆中吗。在我的环境中,内存\u压缩\u限制\u in \u mb设置为800。我需要了解目的和含义。
提前谢谢
1条答案
按热度按时间brvekthn1#
in_memory_compaction_limit_in_mb
已经没有必要了,因为在写之前不需要知道大小。不再有2遍压实,因此可以忽略。您不必一次完成整个分区,只需一次完成一行。现在主要的代价是反序列化内存分区开头的大索引。你可以增加
column_index_size_in_kb
减少索引的大小(在读取期间花费更多io,但与反序列化相比可能微不足道)。另外,如果您使用更新的版本(3.11+),索引在超过一定的大小后会延迟加载,这会大大改善情况。