データベースシャーディングを理解するための入門書

公開: 2022-11-05

Web サイトの作成は、インターネット上でのプレゼンスを確立するための最初のステップです。 長期的に繁栄するには、サイトが成長に対応できるように拡張できることも確認する必要があります。 そして、最初のステップの 1 つは、拡張可能なデータベースを実装することです。 そうしないと、クエリのパフォーマンスが低下したり、データベースが停止したりするリスクがあります。

この投稿では、データベース シャーディングを使用してデータの高いスケーラビリティと可用性を実現する方法について説明します。 また、シャーディングの欠点と、使用できるさまざまなシャーディング アーキテクチャについても触れます。

データベースシャーディングとは?

シャーディングは、テーブルを他のデータベース サーバーに分散する最適化手法です。 これは、どちらもデータを小さなサブセットに分割するという意味で、パーティショニングに似ています。 違いは、シャーディングがこれらのサブセットを異なるサーバーに分散し、パーティショニングがそれらを 1 つのデータベースに格納することです。 これらのサーバーは、同じデータベース エンジンとハードウェア タイプを使用して、すべてのシャードで同様のパフォーマンス レベルを実現します。

シャーディングは、シェアナッシング アーキテクチャを実現し、処理のボトルネックと単一障害点を排除することを目的としています。

データベースのシャーディングを説明する図。
シャーディングの例。 (画像ソース: Analytics Vidhya)

シャーディングは、水平方向と垂直方向の 2 つの方法で実装できます。 水平シャーディングは行に基づいてテーブルを分割し、垂直シャーディングは列に基づいてテーブルを分割します。

この点で、シャーディングは、大きなテーブルを小さなテーブルに分割するパーティショニングに似ています。

水平シャーディングは、一度にデータ (名前、住所、電子メールなど) を返す顧客データベースなど、ほとんどのクエリが行のサブセットを返すデータベースに効果的です。

垂直シャーディングは、クエリが単一の列を返すデータベースに効果的です。 たとえば、顧客データベースが顧客の名前または電子メールを別々に返した場合、名前と電子メールを別々のクラスタに分けることができます。

データベース シャーディングの利点

以下は、データベース シャーディングの利点の一部です。

改善された水平スケーリング

データベースを垂直方向または水平方向にスケーリングできます。 垂直方向のスケーリングとは、サーバーに中央処理装置 (CPU) とランダム アクセス メモリ (RAM) を追加して、パフォーマンスを向上させることです。 垂直スケーリングは、小規模から中規模のデータベースに役立つソリューションです。 ただし、データが大きくなるにつれて、垂直スケーリングは実行不可能になります。 1 台のサーバーに追加できる能力には限りがあります。

水平スケーリングはより柔軟です。 システムにサーバーを追加することで、必要に応じてデータベースを拡張できます。 これらの各サーバーは、異なるデータベース シャードにリソースを提供します。 これにより、作業負荷が分散され、より多くの要求を処理するシステムの能力が向上します。

クエリ応答時間の高速化

シャードには、いくつかの行と列しかありません。 このため、データベース クエリの処理にかかる時間が短縮されます。 対照的に、シャード化されていないデータベースのクエリでは、数百または数千行の検索が必要になる場合があります。

停止状況における信頼性の向上

データベースの停止は、偶発的なデータ削除、接続エラー、サイバーセキュリティ攻撃など、さまざまな理由で発生します。 シャーディングは、停止の影響を最小限に抑えます。 各シャードは自律的であるため、影響を受けるシャードのみがダウンタイムに直面します。 たとえば、4 つのシャードがあり、そのうちの 1 つが停止した場合、影響を受ける操作は 25% のみです。

シャーディングの欠点

シャーディングはデータベースの信頼性と可用性を向上させますが、実装は複雑です。 不適切なシャーディング アーキテクチャを使用すると、パフォーマンスが低下し、データが失われる可能性があります。

すべてのシャード間でバランスのとれたデータ分散を可能にするシャーディング手法を必ず選択してください。 このバランスが取れていないと、データベースのホットスポットが作成される危険があります。これは、1 つのシャードにほとんどのデータが格納され、他のシャードが実質的に空のままである場合に発生します。 これにより、単一シャードへの書き込みスループットが低下します。

これを解決するには、不均衡なシャードをさらに分割することもできますが、そのプロセスは困難であり、データの移行中にデータベースがダウンする可能性があります。

シャーディングのもう 1 つの欠点は、異なるシャードにある複数のテーブルを含む SQL 結合が非常に遅くなり、パフォーマンスが低下する可能性があることです。 ただし、適切なアーキテクチャを使用すると、この問題を回避できます。

シャーディング アーキテクチャ

シャーディングは、次の 3 つのアーキテクチャを使用して実装できます。

  • キーベースのシャーディング
  • 範囲ベースのシャーディング
  • ディレクトリベースのシャーディング

選択するアーキテクチャは、ユース ケースによって異なります。

キーベースのシャーディング

キーまたはハッシュ ベースのシャーディング アーキテクチャでは、データベース アプリケーションはシャード キーを使用してシャードを検索します。 ハッシュ関数はシャーディング キー値をハッシュし、出力はデータを特定のシャードにマップします。 単純なハッシュ関数は、キーのモジュラスとシャードの数にすることができます。

ハッシュ関数は、複数のシャーディング キーを取ることができます。 このため、キーベースのシャーディングは、キーを共有している可能性があるデータ レコードに適しています。 アルゴリズムに基づいてデータを分散することで、一方のシャードに他方のシャードよりも多くのデータが含まれるデータベース ホットスポットが作成される可能性が最小限に抑えられます。

ただし、分散はハッシュ関数のみに依存しているため、データを論理的にグループ化することはできません。 したがって、複数のシャードからのデータを必要とするデータベース操作は、各シャードからデータを読み取る必要があるため、非効率的である可能性があります。

範囲ベースのシャーディング

範囲ベースのシャーディングでは、指定された値の範囲に応じてデータベースをシャーディングします。

シャーディング キーを使用して、値を割り当てるシャードを決定します。 データベース アプリケーションは、ルックアップ テーブル内のシャーディング キーに対応するシャードをチェックし、データを格納します。 このため、範囲ベースのシャーディングは設計と実装が容易です。

たとえば、ユーザー データベースのユーザー ID 値をシャーディング キーとして使用できます。 ID が 0 ~ 2,000 のユーザーを 1 つのシャードに格納し、2,000 ~ 4,000 の ID を持つユーザーを別のシャードに格納するなどです。

範囲ベースのシャーディングは、データベースのホットスポットを引き起こす可能性があります。 ほとんどのユーザー ID が 2,001 から 4,000 の間にあるユーザー データベースを考えてみましょう。 このプロセスはそれらを単一のシャードに割り当て、時間の経過とともに不均衡を生み出します。 したがって、範囲ベースのシャーディングは、均等に分散されたデータに最適です。

ディレクトリベースのシャーディング

ディレクトリベースのシャーディングは、論理的に関連するデータを同じシャードにグループ化します。 データベース内の各エンティティのマッピングのリストを含むルックアップ テーブルを使用します。 各マッピングはデータベース シャードに対応します。

ディレクトリベースのシャーディングは、データをシャードに動的に追加できるため、範囲ベースまたはキーベースのシャーディングよりも柔軟です。 従うべきシャーディング関数や範囲内にとどまる値の範囲はありません。 この柔軟性により、データベースの効率が向上します。関連するデータを 1 つのシャードに格納できるため、一般的なクエリの実行にかかる時間が短縮されます。

たとえば、ディレクトリベースのシャーディングを使用し、場所に従ってユーザーをグループ化し、特定の場所からユーザーを取得する場合、単一のシャードのみをクエリします。

Kinstaによるデータベースシャーディング

最新のデータベース エンジンのほとんどは、データベース シャーディングをサポートしています。 これらのデータベース エンジンの 1 つに、商用サポートされている MySQL のフォークである MariaDB があります。 これは、IBM、GitHub、ウィキメディアなどの企業が採用している高性能のオープンソース データベース システムです。 また、Kinsta の高性能サーバー スタックの一部でもあります。

MariaDB は、スパイダー ストレージ エンジンを介して組み込みのシャーディング機能を提供します。 スパイダー ストレージ エンジンは、パーティショニングと拡張アーキテクチャ (XA) トランザクションをサポートするクラスター形成エンジンです。 これにより、異なるインスタンスからのリモート テーブルを同じインスタンスにあるかのように扱うことができます。 スパイダー ストレージ エンジンでテーブルを作成すると、テーブルはリモート MariaDB サーバーの別のテーブルにリンクします。 接続が確立されると、ストレージ エンジンは同じトランザクションの一部であるすべてのテーブルとリンクを共有します。

概要

データベース シャーディングは、テーブルを小さなサブセットに分割し、シャードと呼ばれる異なるサーバーに分散するスケーリング手法です。 キーベースのシャーディング、範囲ベースのシャーディング、ディレクトリベースのシャーディングなど、さまざまな方法でシャーディングを実装できます。

シャーディングによってデータベースのスケーラビリティ、信頼性、および可用性が向上しますが、実装は非常に複雑です。 さらに、シャードを作成すると、データベースをシャード化されていない状態に戻すのは簡単ではありません。 このため、他のスケーラビリティ オプションが機能しないことが確実な場合にのみ、シャーディングを最適化に使用してください。

あなたのビジネスが非営利であろうとエンタープライズレベルの事業であろうと、Kinstaの専門的なソリューションはサイトホスティングの心配を取り除き、最も重要なことに集中できるようにします.