RocksDB-Cloudでのリモート圧縮

(Hieu Pham)(6月10日、2020)

はじめに

RocksDBはLSMストレージエンジンであり、その成長は過去数年間で大幅に増加しました。 RocksDB-Cloudはオープンソースであり、RocksDBと完全に互換性があり、すべてのデータをクラウドストレージ(Amazon S3など)に自動的に保存することで耐久性を高めるという追加機能があります。

Rocksetでは、 RocksDB-Rocksetの分散

コンバージドインデックスの構成要素の1つとしてのクラウド。 Rocksetはクラウドネイティブの原則に基づいて設計されており、クラウドネイティブデータベースの主要な設計原則の1つは、コンピューティングをストレージから分離することです。 RocksDB-Cloudを拡張して、ストレージのニーズとコンピューティングのニーズを明確に分離する方法について説明します。

米国海軍のSeabeesが運用し、土壌の締固めを実行するコンパクター

RocksDBのLSMエンジン

RocksDB-Cloudは、ローカルに接続されたSSDまたは回転するディスクにデータを保存します。 SSDまたは回転ディスクは、SSDが提供するデータを保存するために必要なストレージを提供します。 RocksDBへの新しい書き込み-クラウドはメモリ内のmemtableに書き込まれ、memtableがいっぱいになると、ストレージ内の新しいSSTファイルにフラッシュされます。

LSMストレージエンジンであるため、セットバックグラウンドスレッドの数は圧縮に使用され、圧縮はSSTファイルのセットを組み合わせて、出力ファイルから削除されたキーと削除されたキーを使用して新しいSSTファイルを生成するプロセスです。圧縮には多くの計算リソースが必要です。データベースへの書き込み速度が高いほど、圧縮に必要な計算リソースが多くなります。これは、圧縮がデータベースへの新しい書き込みに対応できる場合にのみシステムが安定するためです。

コンピューティングとストレージが分解されていない場合の問題

RocksDBベースのシステムでは、ストレージをホストするサーバー上でローカルなCPUで圧縮が発生します。この場合、コンピューティングとストレージは分解されません。つまり、書き込み速度が上がってもデータベースの合計サイズが同じである場合は、より多くのサーバーを動的にプロビジョニングし、データをそれらすべてのサーバーに分散してから、これらのサーバーの追加のコンピューティングを活用して、圧縮の負荷。

これには2つの問題があります。

  • 大量のデータをコピーする必要があるため、データをより多くのサーバーに分散することは瞬時ではありません。これは、急速に変化するワークロードに迅速に対応できないことを意味します。
  • データをより多くのサーバーに分散しているため、各サーバーのストレージ容量の使用率は非常に低くなります。サーバー上の未使用のストレージがすべてあるため、価格とパフォーマンスの比率が失われます。

当社のソリューション

RocksDB-Cloudが適している主な理由圧縮コンピューティングとストレージを分離するのは、LSMストレージエンジンだからです。 B-Treeデータベースとは異なり、RocksDB-CloudはSSTファイルが作成されると更新しません。これは、アクティブなメモリテーブル内のデータのごく一部を除いて、システム全体のすべてのSSTファイルが読み取り専用であることを意味します。 RocksDB-CloudはすべてのSSTファイルをS3などのクラウドストレージオブジェクトストアに保持します。これらのクラウドオブジェクトは読み取り専用であるため、すべてのサーバーから安全にアクセスできます。

つまり、RocksDBの場合は-クラウドサーバーAは、クラウドオブジェクトのセットを使用して圧縮ジョブをカプセル化し、リモートのステートレスサーバーBに要求を送信できます-サーバーBは、クラウドストアから関連するオブジェクトをフェッチし、圧縮を実行し、出力のセットを生成できますクラウドオブジェクトストアに書き戻され、その情報をサーバーAに通信するSSTファイル-基本的に、ストレージ(サーバーAにある)と圧縮コンピューティング(サーバーBにある)を分離しました。サーバーAにはストレージがあり、サーバーBには永続的なストレージはありませんが、圧縮に必要なコンピューティングのみがあります。出来上がり!

RocksDBプラグ可能圧縮API

RocksDBの圧縮エンジンを外部からプラグイン可能にする2つの新しいメソッドでベースのRocksDBAPIを拡張しました。 db.h では、圧縮サービスを登録するための新しいAPIを導入しています。

このAPIは、RocksDBによる圧縮ジョブの実行に使用されるプラグインを登録します。リモート圧縮は、Run

の2つのステップで行われます。したがって、プラグイン PluggableCompactionService には2つのAPIがあります。

Runは、圧縮の実行が行われる場所です。リモート圧縮アーキテクチャでは、RunはRPCをリモート圧縮層に送信し、特に新しく圧縮されたSSTファイルのリストを含む圧縮結果を受信します。

InstallFilesは、RocksDBが新しく圧縮されたSSTファイルをクラウド(remote_paths)からローカルデータベース(

)にインストールする場所です。 id = “5c6581b9b6″>

)。

ロックセットの圧縮層

次に、ロックセットの圧縮サービスで上記のプラグ可能な圧縮サービスをどのように使用したかを示します。上記のように、最初のステップであるRunは、入力SSTファイル名や圧縮情報などの圧縮情報を含むRPCをリモート圧縮層に送信します。この圧縮ジョブを実行するホストを compactor と呼びます。

compactor は、圧縮要求を受信すると、でRocksDB-Cloudインスタンスを開きます。 ゴーストモード。これが意味するのは、RocksDB-Cloudは、クラウドストレージからすべてのSSTファイルをフェッチせずに、必要なメタデータのみでローカルデータベースを開きます。 RocksDBインスタンスを ghost モードで開くと、必要なSSTファイルのフェッチ、圧縮、新しく圧縮されたSSTファイルのクラウド内の一時ストレージへのアップロードなどの圧縮ジョブが実行されます。

コンパクターでRocksDB-Cloudを開くためのオプションは次のとおりです。

複数の課題があります圧縮層の開発中に直面したソリューション:

RocksDB-Cloudを ghost で開く速度を向上させるmode

RocksDBインスタンスを開いている間、クラウドからすべてのSSTファイルをフェッチすることに加えて( ghost <で無効にしました) / em>モード)、特にSSTファイルのリストの取得や各SSTファイルのサイズの取得など、開くプロセスを遅くする可能性のある他の複数の操作があります。通常、すべてのSSTファイルがローカルストレージにある場合、これらのファイルサイズの取得操作の遅延は小さくなります。ただし、 compactor がRocksDB-Cloudを開くと、これらの各操作によってクラウドストレージへのリモートリクエストが発生し、合計のレイテンシが非常に高くなります。私たちの経験では、数千のSSTファイルを含むRocksDB-Cloudインスタンスの場合、S3への数千のget-file-sizeリクエストのため、開くのに最大1分かかります。この制限を回避するために、RocksDB-Cloudオプションにさまざまなオプションを導入して、開いているときにこれらのRPCを無効にしました。その結果、平均オープン時間は7秒から700ミリ秒になります。

L0-> L0圧縮を無効にする

リモート圧縮は、単一の圧縮の速度と、より多くの圧縮ジョブを並行して実行する機能との間のトレードオフです。当然のことながら、各リモート圧縮ジョブは、クラウドでのデータ転送のコストのために、ローカルで実行される同じ圧縮よりも遅くなるためです。したがって、RocksDB-Cloudが並列化できない圧縮プロセスのボトルネックを可能な限り最小限に抑えたいと考えています。

LSMアーキテクチャでは、L0-> L1圧縮は通常、並列化できません。 L0ファイルの範囲が重複しています。したがって、L0-> L1圧縮が発生している場合、RocksDB-Cloudは、L0ファイルの数を減らし、RocksDB-CloudがL0ファイルにヒットすることによる書き込みストールを防ぐことを目的として、L0-> L0圧縮も実行する機能を備えています。制限。ただし、トレードオフとして、各L0ファイルはL0-> L0圧縮のたびにサイズが大きくなります。

私たちの経験では、このオプションは、L0ファイルが大きいため、メリットよりも多くの問題を引き起こします。その結果、L0-> L1の圧縮がはるかに長くなり、RocksDB-Cloudのボトルネックが悪化します。したがって、L0-> L0圧縮を無効にし、代わりに書き込みストールというまれな問題を抱えています。私たちの実験から、RocksDB-Cloudの圧縮は着信書き込みにはるかによく追いつきます。

今すぐ使用できます

RocksDB-Cloudはオープンソースプロジェクトであるため、私たちの作業は圧縮コンピューティングをストレージのニーズから分離することでメリットを引き出したい他のRocksDB開発者が活用できます。現在、リモート圧縮サービスを本番環境で実行しています。 RocksDB-Cloudの6.7.3リリースで利用できます。 RocksDB-Cloudに関するすべてのことについて、 http://bit.ly/rockset-community-channel の公開Slackチャネルで話し合います。

作成者:

Hieu Pham —ソフトウェアエンジニア、ロックセット
Dhruba Borthakur — CTO、ロックセット

元々は https://で公開されましたrockset.com 2020年6月4日。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です