【问题标题】:Cassandra 3.0 updated SSTable formatCassandra 3.0 更新了 SSTable 格式
【发布时间】:2016-04-06 20:08:00
【问题描述】:

根据this issue,Cassandra的存储格式在3.0更新了。

如果以前我可以使用 cassandra-cli 来查看 SSTable 是如何构建的,得到如下结果:

[default@test] list phonelists;
-------------------
RowKey: scott
=> (column=, value=, timestamp=1374684062860000)
=> (column=phonenumbers:bill, value='555-7382', timestamp=1374684062860000)
=> (column=phonenumbers:jane, value='555-8743', timestamp=1374684062860000)
=> (column=phonenumbers:patricia, value='555-4326', timestamp=1374684062860000)
-------------------
RowKey: john
=> (column=, value=, timestamp=1374683971220000)
=> (column=phonenumbers:doug, value='555-1579', timestamp=1374683971220000)
=> (column=phonenumbers:patricia, value='555-4326', timestamp=137468397122

在最新版本的 Cassandra 中,内部形式会是什么样子?你能举个例子吗?

我可以使用什么实用程序以上面列出的方式查看 Cassandra 中表的内部表示,但使用新的 SSTable 格式?

我在互联网上发现的只是分区标题如何存储列名,行存储聚类值并且没有重复值。

如何查看?

【问题讨论】:

    标签: cassandra storage cassandra-2.0 cassandra-cli cassandra-3.0


    【解决方案1】:

    在 3.0 之前,sstable2json 是一个有用的实用程序,可用于了解数据在 SSTables 中的组织方式。此功能目前在 cassandra 3.0 中不存在,但最终会有替代方案。在那之前,我和 Chris Lohfink 已经为 Cassandra 3.0 开发了 sstable2json (sstable-tools) 的替代方案,您可以使用它来了解数据的组织方式。在 CASSANDRA-7464 中有一些关于将其引入 cassandra 的讨论。

    旧版本 Cassandra 和 Cassandra 3.0 的存储格式之间的一个关键区别在于,SSTable 以前是分区及其单元格(由它们的集群和列名标识)的表示,而在 Cassandra 3.0 中,SSTable 现在表示分区和他们的行。

    您可以通过访问blog post 来更详细地了解这些更改,这些更改的主要开发人员在详细解释这些更改方面做得很好。

    您将看到的最大好处是,在一般情况下,您的数据大小会缩小(在某些情况下会缩小很多),因为 CQL 引入的大量开销已被一些关键增强功能消除。

    这是一个展示 C* 2 和 3 之间区别的示例。

    架构:

    create keyspace demo with replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
    use demo;
    create table phonelists (user text, person text, phonenumbers text, primary key (user, person));
    insert into phonelists (user, person, phonenumbers) values ('scott', 'bill', '555-7382');
    insert into phonelists (user, person, phonenumbers) values ('scott', 'jane', '555-8743');
    insert into phonelists (user, person, phonenumbers) values ('scott', 'patricia', '555-4326');
    insert into phonelists (user, person, phonenumbers) values ('john', 'doug', '555-1579');
    insert into phonelists (user, person, phonenumbers) values ('john', 'patricia', '555-4326');
    

    sstable2json C* 2.2 输出:

    [
    {"key": "scott",
     "cells": [["bill:","",1451767903101827],
               ["bill:phonenumbers","555-7382",1451767903101827],
               ["jane:","",1451767911293116],
               ["jane:phonenumbers","555-8743",1451767911293116],
               ["patricia:","",1451767920541450],
               ["patricia:phonenumbers","555-4326",1451767920541450]]},
    {"key": "john",
     "cells": [["doug:","",1451767936220932],
               ["doug:phonenumbers","555-1579",1451767936220932],
               ["patricia:","",1451767945748889],
               ["patricia:phonenumbers","555-4326",1451767945748889]]}
    ]
    

    sstable-tools toJson C* 3.0 输出:

    [
      {
        "partition" : {
          "key" : [ "scott" ]
        },
        "rows" : [
          {
            "type" : "row",
            "clustering" : [ "bill" ],
            "liveness_info" : { "tstamp" : 1451768259775428 },
            "cells" : [
              { "name" : "phonenumbers", "value" : "555-7382" }
            ]
          },
          {
            "type" : "row",
            "clustering" : [ "jane" ],
            "liveness_info" : { "tstamp" : 1451768259793653 },
            "cells" : [
              { "name" : "phonenumbers", "value" : "555-8743" }
            ]
          },
          {
            "type" : "row",
            "clustering" : [ "patricia" ],
            "liveness_info" : { "tstamp" : 1451768259796202 },
            "cells" : [
              { "name" : "phonenumbers", "value" : "555-4326" }
            ]
          }
        ]
      },
      {
        "partition" : {
          "key" : [ "john" ]
        },
        "rows" : [
          {
            "type" : "row",
            "clustering" : [ "doug" ],
            "liveness_info" : { "tstamp" : 1451768259798802 },
            "cells" : [
              { "name" : "phonenumbers", "value" : "555-1579" }
            ]
          },
          {
            "type" : "row",
            "clustering" : [ "patricia" ],
            "liveness_info" : { "tstamp" : 1451768259908016 },
            "cells" : [
              { "name" : "phonenumbers", "value" : "555-4326" }
            ]
          }
        ]
      }
    ]
    

    虽然输出更大(这更多是工具的结果)。您可以看到的主要区别是:

    1. 数据现在是分区及其行(包括单元格)的集合,而不是分区及其单元格的集合。
    2. 时间戳现在位于行级别 (liveness_info) 而不是单元级别。如果某些行单元格的时间戳不同,则新的存储引擎会进行增量编码以节省空间并在单元格级别关联差异。这也包括 TTL。可以想象,如果您有很多非键列,因为不需要重复时间戳,这会节省大量空间。
    3. 聚类信息(在这种情况下,我们在“人”上进行聚类)现在出现在行级别而不是单元级别,这样可以节省大量开销,因为聚类列值不必位于单元格中水平。

    我应该注意,在这个特定的示例数据案例中,新存储引擎的好处并没有完全实现,因为只有 1 个非集群列。

    这里没有显示许多其他改进(例如存储行级范围墓碑的能力)。

    【讨论】:

    • 非常感谢您的回答。有用的信息。
    • 我想补充一点,Cassandra 3.0.4 / 3.4 引入了一个名为sstabledump 的工具,基本上就是这里描述的。然而,SStable-Tools 在功能方面超越了这一点。
    • 好点!当它被集成时忘记跟进(顺便感谢 Chris Lohfink 完成了繁重的工作!)。我还在这里整理了一篇关于 sstabledump 的博文:datastax.com/dev/blog/…
    猜你喜欢
    • 1970-01-01
    • 2015-06-06
    • 2018-09-15
    • 1970-01-01
    • 2021-06-10
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多