今年 2 月に YugaByte DB の 3 年間の開発フェーズが終了しました。これまでのところ、非常に刺激的な道のりではありますが、技術的な課題がなかったわけではありません。手元にあるものよりも良い解決策を見つけるために、時には白紙に戻ったり、学術研究を精査したりしなければならないこともあります。この記事では、オープンソースでクラウドネイティブな高性能分散 SQL データベースを構築する過程で解決しなければならなかった、最も困難なアーキテクチャ上の問題のいくつかについて概説します。 さて、まずは最も簡単なものから最も難しいものへと進めていきましょう。 1. アーキテクチャ: Amazon Aurora か Google Spanner か? 私たちが早い段階で下した決定の 1 つは、YugaByte DB アーキテクチャのインスピレーションとして使用できるデータベースを見つけることでした。私たちは、Amazon Aurora と Google Spanner という 2 つのシステムを注意深く追跡しています。 Amazon Aurora は、高可用性を提供する SQL データベースです。 MySQL や PostgreSQL などの一般的な RDBMS データベースと互換性があるため、さまざまなアプリケーションを簡単に開始して実行できます。 Amazon Aurora は、AWS 史上最も急速に成長しているサービスの 1 つでもあります。 MySQL および PostgreSQL と互換性のあるサービスである Amazon Aurora は、AWS 史上最も急速に成長しているサービスです。 Amazon Aurora にはスケーラブルなデータ ストレージ レイヤーがありますが、クエリ レイヤーはありません。 Amazon Aurora で発見された主なスケーラビリティの制限は次のとおりです。
さらに、Google Spanner は、大規模にスケーラブルで地理的に分散されたアプリケーション向けに構築された、水平方向にスケーラブルな SQL データベースです。 Cloud Spanner は、クラウド向けに構築された唯一のエンタープライズ グレードでグローバルに分散され、強力な一貫性を備えたデータベース サービスであり、リレーショナル データベース構造の利点と非リレーショナルの水平スケーリングを組み合わせるように特別に設計されています。 つまり、Spanner は読み取りと書き込みをシームレスにスケーリングし、グローバルな一貫性を必要とする地理的に分散したアプリケーションをサポートし、正確性を犠牲にすることなく複数のノードから読み取りを実行できます。 ただし、開発者が RDBMS データベースに期待する一般的な機能セットの多くは省略されています。たとえば、外部キー制約やトリガーがサポートされていないという事実は、Google Spanner のドキュメントで強調されています。 私たちはハイブリッドアプローチを採用することにしました。
2. SQL プロトコル: PostgreSQL または MySQL? 広く採用されている SQL 方言を標準化したいと考えています。また、オープンソースであり、データベースを中心に成熟したエコシステムを持つことも望んでいました。トレードオフの自然な選択は PostgreSQL と MySQL でしょうか? 次の理由により、MySQL ではなく PostgreSQL を選択しました。
DB-Engines ランキング サイトで現在トップ 10 にランクされている 5 つの SQL データベースのうち、2014 年以降人気が高まっているのは PostgreSQL のみで、他のデータベースは停滞しているか人気が低下しています。 さらに、多くのアプリケーションにとって、PostgreSQL は Oracle の優れた代替手段となります。組織が PostgreSQL に惹かれる理由は、オープンソースであり、ベンダー中立であり (MySQL は Oracle が所有)、熱心な開発者コミュニティがあり、ベンダーのエコシステムが活発で、機能セットが強力であり、20 年を超える厳しい使用によって鍛え上げられた成熟したコード ベースを備えているためです。 3. 分散トランザクション: Google Spanner か Percolator か? 分散トランザクションをどのように設計すべきかについては、Google Spanner と Percolator を参考にしました。 要約すると、Google Percolator は高いスループットを提供しますが、単一のタイムスタンプを使用します。このアプローチは本質的にスケーラブルではなく、単一のデータ センター、リアルタイム分析 (HTAP と呼ばれる) 指向のアプリケーションにのみ適しており、OLTP アプリケーションには適していません。一方、Google Spanner の分散型時間追跡アプローチは、地理的に分散された OLTP アプリケーションと単一データセンターの HTAP アプリケーションの両方に適したソリューションです。 Google Spanner は Google Percolator を基に構築されており、水平方向のスケーラビリティと地理的に分散されたユースケースのために、広告バックエンドで手動で分割された MySQL デプロイメントを置き換えるために使用されます。ただし、Google Spanner は、その真の分散性とクロック スキュー追跡の必要性を考えると、構築が桁違いに困難です。 このトピックの詳細については、Percolator と Spanner のトレードオフについての詳細をお読みください。 Google Spanner アプローチを採用することにしました。その理由は、次の点をサポートしているためです。
私たちは、ほとんどの最新のクラウド アプリケーションにはこれら両方の機能が必要であると確信しています。実際、GDPR などのコンプライアンス要件や、合計 100 のリージョンを提供するパブリック クラウドにより、これはすでに現実のものとなっています。 4. Raft は地理的に分散されたワークロードに適していますか? Raft と Paxos はよく知られた分散コンセンサス アルゴリズムであり、正式に安全性が証明されています。 Spanner は Paxos を使用しますが、次の理由から Raft を選択しました。
ただし、線形化可能な読み取りを保証するために、Raft では、読み取りクエリを受信する各 *** が、読み取りクエリを実際に処理する前に、まず Raft グループ内の大多数のノードにハートビート メッセージを伝播する必要があります。場合によっては、読み取りパフォーマンスが著しく低下する可能性があります。このような状況の一例として、地理的に分散された展開が挙げられます。この展開では、一時的なネットワーク パーティションなどのイベントが発生した場合、ラウンド トリップによってレイテンシが大幅に増加し、失敗するクエリの数が増える可能性があります。 Raft の高レイテンシを回避するために、安全なリース メカニズムを実装しました。これにより、Raft の線形化特性を維持しながら、ラウンドトリップなしで安全なサービスを実装できます。さらに、クロックのスキューを許容するために、リアルタイム クロックではなく単調クロックを使用します。 5. ソフトウェア定義の原子時計を構築できますか? 分散データベースである YugaByte DB は、障害が発生した場合でも、複数のノードにわたるマルチキー ACID トランザクション (スナップショットおよびシリアル化可能な分離レベル) をサポートします。これには、ノード間で時間を同期できるクロックが必要です。 Google Spanner は、厳密な誤差制限を備えた、可用性の高いグローバル同期クロックの例である TrueTime を使用します。ただし、多くの展開では、そのようなクロックは利用できません。 物理クロック(またはウォールクロック)はノード間で完全に同期することはできません。したがって、ノード間でイベントを順序付ける(因果関係を確立する)ことはできません。 Lamport クロックやベクトル クロックなどの論理クロックは、中央のタイムスタンプ機関がない限り物理時間を追跡しないため、スケーラビリティのボトルネックになります。 私たちのソリューションであるハイブリッド論理クロック (HLC) は、NTP を使用して大まかに同期された物理クロックと因果関係を追跡する Lamport クロックを組み合わせることでこの問題を解決します。 YugaByte DB は、ユーザーが指定した最大クロック スキュー キャップを持つ、可用性の高いクラスター全体のクロックとして HLC を使用します。 HLC 値は、Raft グループ内の更新を相関させる方法として、また MVCC 読み取りポイントとしても使用されます。結果は、Jepsen テストに示されているように、ACID 準拠の分散データベースになります。 6. PostgreSQL クエリ レイヤーを書き直すか、再利用しますか? *** しかし、同じくらい重要なのは、PostgreSQL クエリ レイヤーを書き直すか、再利用するかを決定する必要があったことです。 私たちの最初の決断 YugaByte データベース クエリ レイヤーは、スケーラビリティを考慮して設計されています。このクエリ レイヤー フレームワークでは、API サーバーを C++ で書き直すことですでに 2 つの API (YCQL と YEDIS) を構築していたため、最初に PostgreSQL API を書き直す方が簡単で自然に思えました。 最終決定 私たちはこの道を約 5 か月間歩みましたが、それが理想的な道ではないことに気付きました。成熟した完全なデータベースである PostgreSQL と比較すると、他の API ははるかにシンプルです。その後、私たちはすべての作業をやり直し、白紙に戻って、PostgreSQL のクエリ レイヤー コードを最初からやり直しました。最初は苦痛でしたが、振り返ってみると、これははるかに優れた戦略でした。 このアプローチにも独自の課題があります。私たちの計画は、まず PostgreSQL システム テーブルを DocDB (YugaByte DB のストレージ レイヤー) に移動し、最初はいくつかのデータ型といくつかの簡単なクエリをサポートし、徐々にデータ型とクエリのサポートを追加していくことです。 残念ながら、この計画はうまくいきませんでした。 psql から一見単純なエンドユーザー コマンドを実行するには、実際には多数の SQL 機能のサポートが必要です。たとえば、すべてのテーブルを一覧表示する \d コマンドは、内部的に次のクエリを実行します。
WHERE は、IN、等しくない、正規表現の一致などの演算子をサポートします。上記のクエリを満たすには、次の機能をサポートする必要があります。
明らかに、これはさまざまな SQL 機能を表しているため、単一のユーザー テーブルを作成する前に、これらすべての機能を利用できるようにする必要があります。弊社のリリース「Google Spanner 上の分散 PostgreSQL アーキテクチャ - クエリ レイヤー」では、クエリ レイヤーがどのように機能するかを詳しく説明しています。 結論は 熟練したユーザーであっても、市場に出回っている多数のデータベースの中から選択しなければならないのは、最初は大変に思えるかもしれません。これは、特定の種類のアプリケーションに適したデータベースの選択が、そのデータベースのアーキテクチャにおけるトレードオフによって決まるためです。 YugaByte DB では、一連の非常に実用的なアーキテクチャ上の決定を斬新な方法で組み合わせて、独自のオープン ソース分散 SQL データベースを作成しました。データ損失ゼロ、水平書き込みスケーラビリティ、低読み取りレイテンシ、パブリック クラウドまたは Kubernetes でネイティブに実行する機能を備えた PostgreSQL の強力な SQL 機能が利用できるようになりました。 |
<<: クラウド大手の AWS、Alibaba Cloud、Google Cloud などは、独自のクラウドを開発することを好みます。なぜ?
>>: Kubernetes をより良くする 22 のオープンソース ツール
デジタル変革とインテリジェント製造を背景に、モノのインターネットは時代の最先端にあります。チップ、セ...
数日前、私は皆さんと「ウェブマスターのソフト記事のアイデアの源泉についての簡単な議論(パート 1)」...
3月14日、国務院の「重大な部門改革」案が全国人民代表大会で承認された。鉄道部は廃止され、その機能は...
virmach には 12 のデータセンターがあり、現在そのうち 4 つ (ダラス、シカゴ、バッファ...
中秋節+国慶節を祝うため、edgenatはサイト全体を対象に特別プロモーションを実施し、すべてのクラ...
11月17日、ビリビリ(以下、「ビリビリ」)とiQiyiは、2019年9月30日までの第3四半期の財...
ハイアールは「人間本位」のモデルとメーカープラットフォームを積極的に推進し、伝統的な企業がイノベーシ...
これまでのウェブサイト最適化作業で、このような悲惨な状況を経験したことはありませんでした。携帯電話番...
OneTechCloudは2009年に設立され、主に米国西海岸のCN2 GIA回線でVPSサービスを...
分散ストレージシステムは、全体的なアーキテクチャの観点からは似ていますが、実装が困難です。自社開発の...
1. 背景本番環境での使用では、Elasticsearch では完全一致だけでなく、あいまいなクエリ...
ここで皆さんと共有できて嬉しいです。今日は、SEO を使用して人気の映画やテレビ番組からのトラフィッ...
データボリュームとはDocker コンテナを使用すると、一連のデータ ファイルが生成されます。これら...
インターネットは人々の生活に静かに浸透してきました。情報の発展に伴い、数多くの非伝統的なメディアが登...
「SEO を行うには、我慢することを学ぶ以外に方法はない」と、有名なウェブマスター フォーラムに友人...