LevelDB系列之SSTable(Sorted Strings Table)文件
SSTable是Bigtable中至关重要的一块,对于LevelDb来说也是如此,对LevelDb的SSTable实现细节的了解也有助于了解Bigtable中一些实现细节。 本节内容主要讲述SSTable的静态布局结构,我们曾在整体架构中说过,SSTable文件形成了不同Level的层级结构,至于这个
SSTable是Bigtable中至关重要的一块,对于LevelDb来说也是如此,对LevelDb的SSTable实现细节的了解也有助于了解Bigtable中一些实现细节。
本节内容主要讲述SSTable的静态布局结构,我们曾在“整体架构”中说过,SSTable文件形成了不同Level的层级结构,至于这个层级结构是如何形成的我们放在后面Compaction一节细说。本节主要介绍SSTable某个文件的物理布局和逻辑布局结构,这对了解LevelDb的运行过程很有帮助。
LevelDb不同层级有很多SSTable文件(以后缀.sst为特征),所有.sst文件内部布局都是一样的。上节介绍Log文件是物理分块的,SSTable也一样会将文件划分为固定大小的物理存储块,但是两者逻辑布局大不相同,,根本原因是:Log文件中的记录是Key无序的,即先后记录的key大小没有明确大小关系,而.sst文件内部则是根据记录的Key由小到大排列的,从下面介绍的SSTable布局可以体会到Key有序是为何如此设计.sst文件结构的关键。
图4.1 .sst文件的分块结构
图4.1展示了一个.sst文件的物理划分结构,同Log文件一样,也是划分为固定大小的存储块,每个Block分为三个部分,红色部分是数据存储区,蓝色的Type区用于标识数据存储区是否采用了数据压缩算法(Snappy压缩或者无压缩两种),CRC部分则是数据校验码,用于判别数据是否在生成和传输中出错。
以上是.sst的物理布局,下面介绍.sst文件的逻辑布局,所谓逻辑布局,就是说尽管大家都是物理块,但是每一块存储什么内容,内部又有什么结构等。图4.2展示了.sst文件的内部逻辑解释。
图4.2逻辑布局
从图4.2可以看出,从大的方面,可以将.sst文件划分为数据存储区和数据管理区,数据存储区存放实际的Key:Value数据,数据管理区则提供一些索引指针等管理数据,目的是更快速便捷的查找相应的记录。两个区域都是在上述的分块基础上的,就是说文件的前面若干块实际存储KV数据,后面数据管理区存储管理数据。管理数据又分为四种不同类型:紫色的Meta Block,红色的MetaBlock 索引和蓝色的数据索引块以及一个文件尾部块。
LevelDb 1.2版对于Meta Block尚无实际使用,只是保留了一个接口,估计会在后续版本中加入内容,下面我们看看数据索引区和文件尾部Footer的内部结构。
图4.3数据索引
图4.3是数据索引的内部结构示意图。再次强调一下,Data Block内的KV记录是按照Key由小到大排列的,数据索引区的每条记录是对某个Data Block建立的索引信息,每条索引信息包含三个内容,以图4.3所示的数据块i的索引Index i来说:红色部分的第一个字段记载大于等于数据块i中最大的Key值的那个Key,第二个字段指出数据块i在.sst文件中的起始位置,第三个字段指出Data Block i的大小(有时候是有数据压缩的)。后面两个字段好理解,是用于定位数据块在文件中的位置的,第一个字段需要详细解释一下,在索引里保存的这个Key值未必一定是某条记录的Key,以图4.3的例子来说,假设数据块i 的最小Key=“samecity”,最大Key=“the best”;数据块i+1的最小Key=“the fox”,最大Key=“zoo”,那么对于数据块i的索引Index i来说,其第一个字段记载大于等于数据块i的最大Key(“the best”)同时要小于数据块i+1的最小Key(“the fox”),所以例子中Index i的第一个字段是:“the c”,这个是满足要求的;而Index i+1的第一个字段则是“zoo”,即数据块i+1的最大Key。
文件末尾Footer块的内部结构见图4.4,metaindex_handle指出了metaindex block的起始位置和大小;inex_handle指出了index Block的起始地址和大小;这两个字段可以理解为索引的索引,是为了正确读出索引值而设立的,后面跟着一个填充区和魔数。
图4.4Footer
上面主要介绍的是数据管理区的内部结构,下面我们看看数据区的一个Block的数据部分内部是如何布局的(图4.1中的红色部分),图4.5是其内部布局示意图。
图4.5数据Block内部结构
从图中可以看出,其内部也分为两个部分,前面是一个个KV记录,其顺序是根据Key值由小到大排列的,在Block尾部则是一些“重启点”(Restart Point),其实是一些指针,指出Block内容中的一些记录位置。
“重启点”是干什么的呢?我们一再强调,Block内容里的KV记录是按照Key大小有序的,这样的话,相邻的两条记录很可能Key部分存在重叠,比如key i=“the Car”,Key i+1=“the color”,那么两者存在重叠部分“the c”,为了减少Key的存储量,Key i+1可以只存储和上一条Key不同的部分“olor”,两者的共同部分从Key i中可以获得。记录的Key在Block内容部分就是这么存储的,主要目的是减少存储开销。“重启点”的意思是:在这条记录开始,不再采取只记载不同的Key部分,而是重新记录所有的Key值,假设Key i+1是一个重启点,那么Key里面会完整存储“the color”,而不是采用简略的“olor”方式。Block尾部就是指出哪些记录是这些重启点的。
图4.6记录格式

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Xiaomi Mi 15シリーズは10月に正式リリースされる予定で、その全シリーズのコードネームが海外メディアのMiCodeコードベースで公開されている。その中でもフラッグシップモデルであるXiaomi Mi 15 Ultraのコードネームは「Xuanyuan」(「玄源」の意味)です。この名前は中国神話に登場する高貴さを象徴する黄帝に由来しています。 Xiaomi 15のコードネームは「Dada」、Xiaomi 15Proのコード名は「Haotian」(「好天」の意味)です。 Xiaomi Mi 15S Proの内部コード名は「dijun」で、「山と海の古典」の創造神である淳皇帝を暗示しています。 Xiaomi 15Ultra シリーズのカバー

昨年Huawei Mate60シリーズが発売されて以来、個人的にはMate60Proをメインで使っています。ほぼ1年の間に、Huawei Mate60Proは複数のOTAアップグレードを受け、全体的なエクスペリエンスが大幅に向上し、人々に常に新しい感覚を与えました。たとえば、最近、Huawei Mate60 シリーズは再びイメージング機能の大幅なアップグレードを受けました。 1 つ目は、新しい AI 除去機能で、通行人やゴミをインテリジェントに除去し、空白領域を自動的に埋めることができます。2 つ目は、メインカメラの色の精度と望遠の鮮明さが大幅に向上しました。新学期シーズンであることを考慮して、Huawei Mate60シリーズは秋のプロモーションも開始しました。携帯電話の購入時に最大800元の割引が受けられ、開始価格は4,999元という低価格です。よく使われる、価値の高い新製品が多い

本日、iPhone15とiPhone15Proが正式に発売されましたが、Proシリーズはハイエンドモデルとして価格が高いだけでなく、独自の機能も多く搭載されており、購入後に問題が発生しないように、消費者は購入前に違いを認識する必要があります。 iPhone15. Proシリーズのみの機能です。これらのモニターには同じ表示パネルが装備されていますが、ProMotion 自動適応更新頻度テクノロジーと常時表示機能は、依然として Pro シリーズ専用です。残りのiPhone 15およびiPhone 15 Proシリーズは、解像度、コントラスト、ピーク輝度などの点で同じです。アクションボタン アクションボタンは現在、iPhone 15 Pro シリーズ専用のデザインとなっており、ユーザーがカスタマイズできます。

コンセプト 1. Sorted は、ソートされた Stream を返す中間操作です。カスタム コンパレータを入力しない場合、機能は自然な順序で配置されます。使用上の注意 2. Sorted 操作の実行後、stringCollection 内の要素の順序は変更されません。 Sorted は、元のコレクション内の要素の順序を変更せずに、ストリーム内の要素のみを並べ替えます。例 stringCollection.stream().sorted().filter((s)->s.startsWith("a")).forEach(System.out::printl

CentOS システムに LevelDB をインストールして構成することは、非常に便利なスキルです。LevelDB は、データベース、キャッシュ、ログ システムなどのさまざまなアプリケーションの構築に使用できる高性能のキー/値ストアです。この記事では、その方法を詳しく紹介します。 CentOS での LevelDB のインストールと構成 システムに LevelDB をインストールして構成し、いくつかの実用的なコマンドとテクニックを提供するプロセス。 CentOS に LevelDB をインストールする CentOS システムに LevelDB をインストールする手順は次のとおりです: 依存関係のインストール LevelDB のインストールを開始する前に、必要な依存関係をいくつかインストールする必要があります。ターミナルを開いて次のコマンドを実行して、これらの依存関係をインストールします。

Python プログラミングでは、多くの場合、リストまたは配列をソートする必要があります。 Python は、sort、sorted、numpy.argsort など、さまざまな並べ替えメソッドを提供します。この記事では、これらの仕分け方法の使い方や注意点について詳しく紹介します。 1. ソート メソッド ソート メソッドは Python リストの組み込みメソッドであり、リストをその場でソートでき (つまり、値は返されますが、新しいソート オブジェクトは生成されません)、追加のインポート ライブラリは必要ありません。 sort メソッドには 2 つのパラメータがあります: k

Python 関数の紹介:sorted 関数の使用法と例 Python には多くの組み込み関数があり、非常によく使用される関数の 1 つがsorted() 関数です。 sorted() 関数は、反復可能なオブジェクトをソートし、ソートされた新しいリストを返すために使用されます。この記事では、sorted() 関数の使用法を紹介し、いくつかの具体的なコード例を示します。 sorted() 関数の基本的な使用法sorted() 関数の基本的な構文は次のとおりです。

メモリ モジュールを購入したいユーザーの多くは、GALAX 殿堂ブランドのメモリ モジュールがどのようなシリーズであるかを知りたいと考えていますが、実際、このブランドには現在、HOFEXTREME 限定版、HOFEXTREME、HOFPRORGB の 3 シリーズがあります。殿堂入り記念シリーズとは: A: HOFEXTREME 限定版、HOFEXTREME、HOFPRORGB。これら 3 つのメモリ モジュールはどれも比較的優れたパフォーマンスを持っていますが、その中でも HOFEXTREME 限定版のパフォーマンスが最も優れており、前の 2 つのモデルと比較すると、HOFPRORGB はわずかに性能が劣りますが、パフォーマンスも非常に優れています。殿堂入りメモリ拡張の紹介: 1. メモリ粒子の王様であり、長寿命である Samsung B-die 粒子を使用します。
