Leveled Compaction 策略如何确保 90% 的读取来自一个 sstable

2024-03-09

我试图理解如何分级压实策略在 Cassandra 中,保证 90% 的读取都可以通过单个 sstable 得到满足。

来自 DataStax 文档:

新的 sstables 添加到第一级 L0,并立即与 L1 中的 sstables 进行压缩。当 L1 填满时,额外的 sstable 会提升到 L2。 L1 中生成的后续 sstable 将与 L2 中与其重叠的 sstable 进行压缩。


Cassandra 中的 LeveledCompactionStrategy (LCS) 实现了 LevelDB 的内部结构。您可以在中查看具体的实施细节LevelDB实现文档 https://github.com/google/leveldb/blob/master/doc/impl.md.

为了给您一个简单的解释,请考虑以下几点:

  1. 每个 SSTable 都是在达到固定(相对较小)的大小限制时创建的。默认情况下L0获取5MB的文件,并且随后的每个级别都是 10 倍大小。 (在 L1 中,您将拥有 50MB 的数据,L2 中将有 500MB 的数据,依此类推)。
  2. SSTables 是用以下命令创建的保证它们不重叠
  3. 当一个级别填满时,会触发压缩,并将 L 级的马厩提升到 L+1 级。因此,在 L1 中,大约 10 个文件中将有 50MB,L2 中大约 100 个文件中将有 500MB,等等。

粗体字是证明从同一文件 (SSTable) 读取 90% 的合理性的相关详细信息。让我们一起算一算,一切都会变得更清楚。

假设 L0 中有键 A、B、C、D、E,每个键占用 1MB 的数据。

接下来我们插入键 F。由于级别 0 已填充,压缩将在级别 1 中创建一个包含 [A,B,C,D,E] 的文件,而 F 将保留在级别 0 中。

这相当于 L1 中 1 个文件中约 83% 的数据。

接下来我们插入 G,H,I,J 和 K。所以 L0 再次填满,L1 得到一个带有 [I,G,H,I,J] 的新 sstable。

现在 L0 中有 K,L1 有 [A,B,C,D,E] 和 [F,G,H,I,J]

这大约是 L1 中数据的 90%。

如果我们继续插入键,我们将遇到相同的行为,因此,这就是为什么您从大致相同的文件/SSTable 获得 90% 的读取服务。

我提到的链接上的本段给出了更深入和详细的信息(更新和墓碑会发生什么)(压缩选择的大小不同,因为它们是 LevelDB 默认值,而不是 C*s):

当级别 L 的大小超过其限制时,我们将其压缩到后台线程中。压缩从 L 级选取一个文件,并从下一个 L+1 级选取所有重叠文件。请注意,如果 L 级文件仅与 (L+1) 级文件的一部分重叠,则 (L+1) 级的整个文件将用作压缩的输入,并在压缩后将被丢弃。另外:因为 level-0 是特殊的(其中的文件可能会相互重叠),所以我们特别对待从 level-0 到 level-1 的压缩:一个 level-0 压缩可能会选择多个 level-0 文件,以防其中一些文件文件相互重叠。

压缩合并所选文件的内容以生成一系列级别 (L+1) 文件。当前输出文件达到目标文件大小 (2MB) 后,我们切换到生成新级别 (L+1) 文件。当当前输出文件的键范围增长到足以重叠超过十个级别(L+2)文件时,我们还会切换到新的输出文件。最后一条规则确保稍后压缩级别 (L+1) 文件不会从级别 (L+2) 中获取太多数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Leveled Compaction 策略如何确保 90% 的读取来自一个 sstable 的相关文章

  • 用INSERT覆盖cassandra中的行,会导致墓碑吗?

    由于数据量和速度的原因 在我们的例子中 将数据写入 Cassandra 而不导致其创建逻辑删除至关重要 目前我们只写了一次行 然后就不需要再次更新该行 只需再次获取数据 现在有一种情况 我们实际上需要写入数据 然后用更多的数据来完成 过一段
  • 使用 Cassandra API 获取所有键——类似于“SELECT id FROM table;”

    Cassandra 命令行实用程序sstablekeys可用于从物理 SSTABLE 文件中提取所有定义的行键 sstablekeys cassandra data Keyspace1 Standard1 N Data db Cassand
  • Cassandra 中的二级索引和倒排索引有什么区别?

    当我读到这两篇文章时 我认为他们都在解释相同的方法 我用谷歌搜索但什么也没找到 执行上有区别吗 Cassandra本身有二级索引 但倒排索引必须自己实现 顺便问一下 哪个搜索速度更快 主要区别在于 Cassandra 中的二级索引的分布方式
  • Cassandra 中的 RPC 超时

    我收到以下错误 cqlsh dev gt SELECT DISTINCT id FROM raw data Request did not complete within rpc timeout 这是一个我永远不会再进行的特殊查询 我不在乎
  • 在 DSE 中何时使用 Cassandra 与 Solr?

    我使用 DSE 进行 Cassandra Solr 集成 以便数据存储在 Cassandra 中并在 Solr 中建立索引 很自然地分别使用 Cassandra 处理 CRUD 操作和使用 Solr 进行全文搜索 并且 DSE 确实可以简化
  • 如何使用 Spring Boot 和 Cassandra 将枚举持久化为序数?

    我已添加到实体的枚举字段 CassandraType type DataType Name INT 然而 在发送到 Cassandra 的语句中使用的不是枚举的序数 而是字符串表示形式 因此我收到以下错误 org springframewo
  • 了解 cassandra 复制因子与一致性级别

    我想澄清 Cassandra 中复制因子和一致性级别的基本概念 如果有人可以回答以下问题 我们将不胜感激 RF 复制因子 RC 读一致性 WC 写一致性 2 个 cassandra 节点 例如 A B RF 1 RC ONE WC ONE
  • Cassandra data stax 驱动程序更新 4.4 查询超时问题

    我们的应用程序最近升级到 cassandra datastax 驱动程序 4 4 X 早些时候它是 3 3 版本 升级后 我们注意到有很多超时问题 初始化查询超时 会话查询超时 控制连接超时 以及reference conf中默认的其他超时
  • 意外删除表时恢复 cassandra 集群数据

    如您所知 Cassandra 集群具有复制功能 可以防止数据丢失 即使集群中的某些节点发生故障也是如此 但是 如果管理员不小心删除了一个包含大量数据的表 并且该命令已经由集群中的所有副本执行 这是否意味着您丢失了该表并且无法恢复它 有什么建
  • 如何使用 DevCenter 远程连接到 Cassandra

    我使用他们的镜像在 Azure 上设置了 DataStax Cassandra Sandbox 我能够在服务器上本地运行 OpsCenter 没有任何问题 安装的是Ubuntu 我对它很陌生 根据这篇文章Apache Cassandra 远
  • Cassandra 查询失败:尝试查询的所有主机均失败(未尝试任何主机)

    我无法对 Cassandra 节点进行查询 我能够连接到集群并进行连接 但是 在执行查询时 它失败了 Caused by com datastax driver core exceptions NoHostAvailableExceptio
  • 布隆过滤器在cassandra中的作用是什么?

    从 Cassandra 文档的两个不同链接中 我发现 link 1 http docs datastax com en cassandra 3 0 cassandra dml dmlHowDataWritten html 存储在内存中的结构
  • Cassandra 中的强一致性

    根据datastax文章 可以保证强一致性 如果 R W gt N 在哪里 R是读操作的一致性级别 W为写操作的一致性级别 N 是副本数 这里的强一致性是什么意思呢 这是否意味着 每次 从数据库给出查询响应时 响应将 始终 是最后更新的值
  • 可以在 UUID 列上创建索引吗?

    是否可以在 Cassandra 中的 UUID TIMEUUID 列上创建索引 我正在测试一个模型设计 该设计在 UUID 列上有一个索引 但对该列的查询始终返回找到的 0 行 我有一个这样的表 create table some data
  • 如何在 AWS Glue 中使用 Spark 包?

    我想使用 DatastaxSpark Cassandra 连接器 https mvnrepository com artifact com datastax spark spark cassandra connector 2 12 2 5
  • 使用 pycassa 读取 Cassandra 1.2 表

    使用卡桑德拉 1 2 我按以下方式使用 CQL 3 创建了一个表 CREATE TABLE foo user text PRIMARY KEY emails set
  • 删除键空间挂起

    问题 drop keyspace MyKeyspace hangs 环境 这是 virtualbox 中的 Ubuntu 12 04 64 位 运行单个 Cassandra 实例 在开发计算机上 卡桑德拉是 1 1 6 myuser myh
  • 将数据作为 RDD 保存回 Cassandra

    我试图从 Kafka 读取消息 处理数据 然后将数据添加到 cassandra 中 就像它是 RDD 一样 我的麻烦是将数据保存回 cassandra 中 from future import print function from pys
  • 从 Datastax 6.0 到 Cassandra 3 的迁移路径

    我正在尝试找到从 Datastax Enterprise DSE 6 0 14 到 Cassandra Community OSS 3 的迁移路径 到目前为止 我无法找到有效的迁移路径 所有键空间复制均已更新为NetworkTopology
  • ScyllaDB 是否支持 OR 运算符?

    scyladb 中 SELECT 语句的 WHERE 子句中的 OR 条件如何工作 我已经在电子邮件上创建了二级索引 下面的查询工作正常并返回结果 cqlsh gt select from test d emp where email em

随机推荐

  • 将 r 与 anova 一起替换

    我尝试对不同的数据集运行方差分析 但不太知道该怎么做 我搜索了一下 发现这个很有用 https stats idre ucla edu r codefragments looping strings https stats idre ucl
  • 将新图像添加到资源文件夹后出现类未找到异常

    该应用程序在模拟器和设备上运行得非常好 添加一组新图像后 它开始在每次运行时 在模拟器上和在设备上显示类未找到异常 当尝试删除一些图像以查找原因时 我在运行时找不到不同的类 编译和打包应用程序不会生成警告或错误 他们甚至得到签名 我得到的一
  • PHP 无法将包含 PHP 代码的文件读取为文本文件

    我偶然发现了以下特点 handle fopen realpath folder files php r 无法读取文件 但是一旦我从文件中删除 php 标签 它变得可读 并且我的脚本在页面上打印非空文件内容 另外 file php 永远不会被
  • jQuery $(document).ready() 未触发

    使用 Google 托管代码中的 jQuery 1 4 2 当文档准备好时 以下 javascript 没有触发所有 3 个 document ready 函数是否有原因 首先 document ready 函数 它呈现标题 第二个函数 它
  • 我可以使用 AJAX“POST”将数据发布到服务器上的 JSON 文件吗?

    我只想要最简单 最简单的方法 使用 POST 用户在我的服务器上输入的数据从 AJAX 表单获取数据 因此 如果用户在页面的输入表单中留下他们的姓名 则 AJAX POST 会将数据发送到我的服务器上的 JSON 文件中 这可能吗 这是获取
  • unixodbc 驱动程序管理器无法在安装时打开指定的库

    我正在使用 ArchLinux 并且正在尝试安装 OpenEdge 进度驱动程序 以便我可以通过 PHP 访问它 我已经安装了 unixodbc 软件包和驱动程序 但是当我通过 isql 或 PHP 测试连接时 出现相同的错误 isql 3
  • AngularJS ng-src 图像路径

    关于使用ng src为了显示图像 此代码在运行时起作用 但在初始页面加载时不起作用 div class imageHolder img div class caption Click to configure div div 在我的初始页面
  • Rest JAX-RS异常,未找到MessageBodyWriter

    我正在使用泽西岛2 13 当我尝试通过浏览器中的 url 访问资源时 出现 MessageBoddyWriter not found 异常 例外 MessageBodyWriter not found for media type appl
  • Julia:如何在宏中使用 kwargs...?

    说我想要 fn a b c sort true 扩展到 gn a b c sort true 目前 我将其写为 macro fn x args kwargs esc gn x args kwargs end 这似乎不起作用 我如何扩展kwa
  • 打开街道地图 (osmdroid) 在 PC 中显示灰色瓷砖而不是地图

    我正在使用 osmdroid 在我的应用程序中获取开放的街道地图 我已经使用所需的 jar osmdroid 构建了我的项目 并在清单中添加了所有需要的权限 但是当我尝试在 android 模拟器 adt eclipse 中调试我的应用程序
  • mysqli_select_db() 期望参数 1 为 mysqli,给定字符串

    我是 Mysqli 新手 收到以下错误 警告 mysqli select db 期望参数 1 为 mysqli 字符串 在 D Hosting 9864230 html includes connection php 第 11 行给出 警告
  • 使用 IMAGE_FILE_LARGE_ADDRESS_AWARE 32 位 - 64 位

    我昨天了解到在 DelphiXE 中使用编译器指令 SetPEFlags IMAGE FILE LARGE ADDRESS AWARE 即使 DelphiXE 编译器生成 32 位代码 您也可以在 64 位计算机上访问 使用 4GB 地址空
  • 在 netbeans 7.0.1 中找不到 web.xml

    我想将文件上传到服务器 为此我正在编写一个 servlet 程序 上传文档的目录位置应从 web xml 中的参数获取 我以前没有使用过 web xml 只知道它为每个 servlet 生成条目 我无法在我在 netbeans 中制作的 W
  • SQLite 插入或替换位置

    我有一个包含 3 列的表 ID 描述和键 其中 ID 不是主键 我想要的是插入或更新 替换当前记录 例子 解密密钥 ID 描述 密钥 999 生日 1988 年 12 月 24 日 我尝试了这个 但它不起作用 INSERT OR REPLA
  • 如何从 JavaPairRDD 中选择前 N 个元素? -阿帕奇火花

    我已经获得了一个键 值对 并将其排序到一个新的JavaPairRDD中 现在 我需要从中选择前 5 个元素 即获取一个新的 JavaPairRDD 其中包含前 5 个元素 我该怎么做呢 有没有比使用 flatMap 更简单的方法 因为它似乎
  • 一起识别长按和平移手势识别器

    我有一个视图 其中添加了平移和长按 UIGestureRecognizer 平移用于移动视图 我想做的是还要注意触摸已停止移动 同时保持活动状态 并触发长按 我发现平底锅开始后长按永远不会被触发 我尝试设置委托并实施 BOOL gestur
  • 回显到标准输出并附加到文件

    我有这个 echo all done creating tables gt gt SUMAN DEBUG LOG PATH 但这应该只附加到文件 而不是写入标准输出 如何写入 stdout 并附加到同一 bash 行中的文件 像这样的东西吗
  • 在R中打印小数逗号而不是小数点

    我正在用 R 进行统计分析 我需要将结果粘贴到用法语编写的报告中 在法语中 浮点数是使用小数逗号而不是小数点来书写的 手动用逗号替换点有点乏味 1 我如何让 R 打印所有浮点数并用逗号分隔整数和小数部分 非常感谢 rmuc8 非常快速有效地
  • 在 Lucene 中正确索引纬度和经度值

    我正在使用 Lucene API 开发 给定半径内基于 美国的最近城市搜索 功能 我在 Lucene 中索引城市的纬度和经度值 如下所示 doc Add new Field latitude paddedLatitude Field Sto
  • Leveled Compaction 策略如何确保 90% 的读取来自一个 sstable

    我试图理解如何分级压实策略在 Cassandra 中 保证 90 的读取都可以通过单个 sstable 得到满足 来自 DataStax 文档 新的 sstables 添加到第一级 L0 并立即与 L1 中的 sstables 进行压缩 当