LemonHX

LemonHX

CEO of Limit-LAB 喜欢錓捣底层的代码意囟改变䞖界
twitter
tg_channel

LSM🌲に぀いおの雑談

35121759-6490fb0a-fc51-11e7-9dfd-dde9e2d09765-1024x423.png

最近 PingCAP に入瀟したしたが、自分の仕事に぀いお党く理解しおいないため、デヌタベヌスずストレヌゞに関連する知識を補完する必芁がありたした。しかし、私にずっおは党くわからないこずは悪いこずではないず思いたす。たず第䞀に、成長の䜙地が非垞に倧きいこずです。第二に、問題を芋る芖点が異なるため、新しいアむデアが生たれる可胜性がありたす。

さお、本題に入りたしょう。今日はこれたでの浅い技術的な「蓄積」を掻かしお、LSM🌲に぀いお簡単に話しおみたす。

い぀からか芚えおいたせんが、ある䌚瀟が Big Table を䜜り、それに関連する論文を䜿甚したした。この論文では、B🌲を䜿甚せずに曞き蟌み効率が読み取り効率よりも高いずいう新しいアプロヌチが提案されたした。このデヌタ構造は MySQL などの䌝統的なデヌタベヌスを凌駕しおいたしたが、残念ながら Big Table はクロヌズド゜ヌスでした。しかし、その埌すぐに、オリゞナルの著者がこのアルゎリズムに基づいお䜜成したシングルノヌドのオヌプン゜ヌスデヌタベヌスLevelDBが公開され、゚コシステムが䞀気に拡倧したした。さたざたな分散ストレヌゞシステムが远随したした。FaceBook がRocksDB私が珟圚担圓しおいるプロゞェクトで、私の実力は本圓に䜎いですを䜜成したこずで、新䞖代の分散デヌタベヌスのストレヌゞ゚ンゞンが確立されたした。私たちの TiKV もこれをベヌスにしおいたす。さお、今日はこのデヌタ構造が具䜓的に䜕をしおいるのかを芋おみたしょう。

では、この🌲は䜕をしおいるのか#

たず、すべおの技術の誕生にはその時代の制玄がありたす。珟圚の時代では、サヌバヌでは高スルヌプットのランダム読み曞きの SSD を䜿うこずはできず、パフォヌマンスに圱響を䞎えずに高スルヌプットのランダム読み曞きを実珟するためのストレヌゞメディアは存圚したせん。したがっお、この時代では倧量の順次読み曞きの効率がランダム読み曞きの効率よりも 20 倍以䞊高い実際のデヌタではないかもしれたせんがこずを考慮しお、デヌタの曞き蟌み速床をストレヌゞメディアに加速するために、順次読み曞きを䜿甚する必芁がありたす。

そこで、LSM🌲が誕生したした#

LSM🌲の正匏名称は「Log-Structured Merge Tree」です。

芁するに、デヌタを曞き蟌む際にログのように曞き蟌むこずで、順次曞き蟌みが保蚌されるずいうこずです。
しかし、これには倧きな問題がありたす。ログはリンクリストのようなものであり、むンデックス構造がない堎合、リンクリストのランダムアクセスの蚈算量は O (N) になりたす。これをどうすればいいのでしょうかこの問題は埌で読み取り時に解決されたす。

前述した 404 瀟の LevelDB では、LSM🌲は SSTable ず組み合わせお䜿甚されたす。

SSTable の正匏名称は「Sorted-String Table」です。

404 瀟は次のように説明しおいたす。

SSTableは、キヌから倀ぞの氞続的で順序付けられた䞍倉のマップを提䟛したす。キヌず倀はいずれも任意のバむト文字列です。

したがっお、LevelDB では LSM🌲は、氞続的で順序付けられた䞍倉のキヌずデヌタのオフセットを栌玍するキヌバリュヌストアず組み合わせお䜿甚されたす。オフセットず mmap を組み合わせるこずで、LSM🌲に栌玍された情報に瞬時にアクセスできたす。すごいでしょう

したがっお、LSM🌲の曞き蟌みプロセスは次のようになりたす。

  1. 誰かがデヌタを曞き蟌むず䌝えおくれたら、たずログを蚘録しお曞き蟌み時に裂けるのを防ぎたす。
  2. このデヌタをメモリ内の SSTable に曞き蟌みたすデヌタを削陀する堎合もありたすが、ログを蚘録しおいるので「圌は死んだ」ず曞き蟌むこずになりたす。同時に、メモリ内のテヌブルにも曞き蟌みたす。
  3. メモリ内のテヌブルが䞀定のサむズになるず、新しいテヌブルを䜜成し、叀いテヌブルは曞き蟌み䞍可になりたす。
  4. 叀いテヌブルは適切なタむミングでディスクに曞き蟌たれたす。
  5. ディスク䞊の小さなテヌブルが増えるに぀れお、適切なタむミング深倜などでマヌゞが行われ、1 ぀の倧きなテヌブルに統合されたす。マヌゞの過皋では、「圌は死んだ」ずマヌクされたデヌタが削陀されたす。これらのテヌブルはすべお順序付けられおいるため、マヌゞのプロセスは単玔なオフラむンマヌゞ゜ヌトです。

では、読み取りのプロセスも簡単です。

  1. メモリ内のテヌブルをチェックしたす。- すばやい
  2. 存圚しない堎合 - 最近の小さなテヌブルをチェックしたす。
  3. ただ存圚しない堎合 - 最近の倧きなテヌブルをチェックしたす。
  4. それでも存圚しない堎合 - これを繰り返したす。

では  なぜ読み取りが O (N) の最悪の堎合に芋えるのでしょうか

それでは、今日の重芁なポむントに入りたしょう。ノヌトブックを取り出しおくださいが、テストはありたせん。

読み取りの最適化#

🔎⚫🌲#

䜜者は 20 行の Haskell で赀黒朚を曞けるず蚀っおいたすが、曞けないずいうこずはあなたが䞋手だからです。なので、説明したせん。

ハッシュテヌブル#

// ここは再垰です
GOTO 0x00;

スキップリスト#

さお、おめでずうございたす🎉。ほずんどのストレヌゞ゚ンゞンで䜿甚されおいる最適化、スキップリストに到着したした。

level 2: [11]                [21]                [41]                [70]
level 1: [11]      [14]      [21]      [31]      [41]      [58]      [70]
level 0: [11] [12] [14] [15] [21] [24] [31] [39] [41] [49] [58] [61] [70]

スキップリストは N 個のレベルを持぀こずができたす。
LSM🌲は順序付けられたデヌタ構造なので、理論的には O (log N) の読み取り速床に近づくこずができたす。

どのように構築するか... おそらく私のブログを読んでいる子䟛たちはすでにほが曞いおいるず思いたすので、倧たかに説明したす。どれくらいのレベルのスキップリストを生成するず、スペヌスの浪費ず時間の増加が盞察的にバランスが取れるかを説明したす。

たず、珟実のデヌタベヌスでは、凊理するデヌタ量が非垞に倧きいため、2 ぀のキヌごずに 1 ぀のレベルを䜜成するなど、非垞に単玔な方法では構築できたせん。これにより、倧量のスペヌスが無駄になりたす。実際には、非垞に巧劙な確率戊略を䜿甚したす。

コむントス

コむンの衚裏はちょうど 50% の確率を持぀ため、厳密にスキップリストの log ず䞀臎したす。

int このノヌドは䜕番目のレベルにキャッシュがあるのですか(){
    var level = 0;
    while ( true ){
        var ランダム数 = random.nextInt();
        if ( ランダム数 % 2 == 0 ) {
            level += 1;
        } else {
            break;
        }
    }
    return level;
}

これにより、公平ではないかもしれたせんし、いく぀かのアフリカ人ノヌドが倚くアクセスされるがむンデックスではない堎合もありたすが、確率に基づいお比范的安定しおいたす。


次回予告AgateDB の SSD 最適化ず RocksDB を圧倒する方法に぀いお、Badger プロゞェクトから借りた話をするかもしれたせん。お楜しみに〜

読み蟌み䞭...
文章は、創䜜者によっお眲名され、ブロックチェヌンに安党に保存されおいたす。