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 的相关文章

  • 删除键空间挂起

    问题 drop keyspace MyKeyspace hangs 环境 这是 virtualbox 中的 Ubuntu 12 04 64 位 运行单个 Cassandra 实例 在开发计算机上 卡桑德拉是 1 1 6 myuser myh
  • 将 CassandraUnit 与 Astyanax 结合使用时出现依赖性问题

    我有一个 SessionDaoCassandraImpl 类 它使用 Astyanax 从 Cassandra 读取数据 我想使用嵌入式 Cassandra 服务器进行测试 卡桑德拉单元 https github com jsevellec
  • 从 Datastax 6.0 到 Cassandra 3 的迁移路径

    我正在尝试找到从 Datastax Enterprise DSE 6 0 14 到 Cassandra Community OSS 3 的迁移路径 到目前为止 我无法找到有效的迁移路径 所有键空间复制均已更新为NetworkTopology
  • Cassandra cqlsh 不适用于非分区键的 where 子句

    我的表描述是 CREATE TABLE user id text CustID int static UpdateDate date DateOfBirth date static Gender text static Address te
  • Cassandra CQL 查询检查多个值

    如何使用 Cassandra CQL 查询检查非主键字段的值是 A 还是 B 我使用的是Cassandra 2 0 1 这是表定义 CREATE TABLE my table my field text my field2 text PRI
  • ScyllaDB 是否支持 OR 运算符?

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

    我的应用程序使用 AbstractFactory 作为 DAO 层 因此一旦实现了 HBase DAO 系列 创建 Cassandra DAO 系列并从多个角度查看差异对我来说将是非常好的 不管怎样 试图做到这一点 我看到 Cassandr
  • 卡桑德拉身份验证问题

    卡桑德拉版本 apache cassandra 2 1 8 我最近配置了 2 节点集群Authenticator设置PasswordAuthenticator 当其中一个节点关闭时 我无法登录 Cqlsh 并出现以下错误 Connectio
  • 避免 cassandra 中的僵尸数据

    最近 我在客户设置 3 节点集群时遇到了一个问题 其中一个节点出现故障 并在 12 天后才上线 在我们的场景中 大多数表的默认 gc grace seconds 已设置为 1 天 并且有很多表 当此故障节点出现时 来自该节点的陈旧数据被复制
  • Cassandra - 选择而不复制

    假设我创建了一个键空间和表 CREATE KEYSPACE IF NOT EXISTS keyspace rep 0 WITH replication class SimpleStrategy replication factor 0 CR
  • Cassandra 数据建模:时间戳作为分区键

    我需要能够返回在指定时间间隔内执行操作的所有用户 Cassandra 中的表定义如下 create table t timestamp from timestamp to user text PRIMARY KEY from to user
  • 允许在cql中进行过滤、数据建模

    我目前正在使用和研究 cassandra 中的数据建模实践 到目前为止 我知道您需要基于执行的查询进行数据建模 然而 多个select需求使得数据建模变得更加困难或不可能在一张表上处理它 所以 当你无法在1个表上处理这些要求时 你需要插入2
  • Datastax Cassandra Windows 服务

    这可能真的很简单 但真的很烦人 当使用Cassandra BAT文件时 我们可以通过该bat文件中的JAVA OPTS参数设置最小 最大堆大小 我们可以在哪里为 Windows 服务执行此操作 我认为它使用 prunsrv 使用相同的 ba
  • Cassandra 会话与集群 有什么可分享的?

    考虑 Cassandra 的 Session 和 Cluster 类 Java 驱动程序 我想知道有什么区别 在 Hibernate 中 每次都会创建一个会话并共享会话工厂 从许多来源我了解到 它被认为是创建一个会话并在多个线程之间共享它
  • 如何知道 Cassandra 中键空间和列族的大小?

    最近 我开始使用 cassandra 的 Java 驱动程序 cassandra driver core 2 0 2 进行 Grails 与 Cassandra 的集成 因此 我很好奇如何知道我们的表在 cassandra DB 中存储数据
  • 不使用 CPU 时 Cassandra 超时

    我使用 Phantom DSL 和 Datastax Cassandra 驱动程序时遇到 Cassandra 超时 然而 Cassandra 似乎并没有超载 以下是我得到的异常 com datastax driver core except
  • 为什么从 Cassandra CLI 教程中进行剪切和粘贴不起作用?

    盲目跟风http wiki apache org cassandra Cas sandraCli http wiki apache org cassandra CassandraCli 有人可以解释一下吗 aaron mac apache
  • cassandra-1.1.2 的推荐 cassandra gui 客户端是什么 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一些 cassandra 的 gui 客户端 如 sqlDeveloper 来调用一些基本方法 并运行 cql 查询 Dbeav
  • Cassandra公共IP未连接

    我在 ubuntu 服务器中使用 cassandra 当我尝试使用 CLI 与公共 IP 地址进行连接时 它返回连接被拒绝 而如果我尝试使用 localhost 它工作正常 我在 cassandra yaml 和 storage conf
  • 什么时候不应该使用 Cassandra? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 相关话题已经有很多讨论了卡桑德拉 http cassandra apache org lately Twitter Digg Facebook

随机推荐

  • 将 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 进行压缩 当