データパーティション分割戦略 (Azure を使用したReal-World Cloud Apps の構築)

作成者 : Rick AndersonTom Dykstra

Fix It プロジェクトのダウンロード または 電子書籍のダウンロード

Azure 電子書籍 を使用した Real World Cloud Apps の構築 は、Scott Guthrie が開発したプレゼンテーションに基づいています。 クラウド向けの Web アプリの開発を成功させるために役立つ 13 のパターンとプラクティスについて説明します。 シリーズの詳細については、 最初の章を参照してください。

以前は、Web サーバーを追加および削除することで、クラウド アプリケーションの Web 層を簡単にスケーリングできる方法を確認しました。 ただし、すべてが同じデータ ストアに達している場合、アプリケーションのボトルネックはフロントエンドからバックエンドに移動し、データ層のスケーリングが最も困難になります。 この章では、データを複数のリレーショナル データベースにパーティション分割するか、リレーショナル データベース ストレージと他のデータ ストレージ オプションを組み合わせることで、データ層をスケーラブルにする方法について説明します。

パーティション分割スキームの設定は、前に説明したのと同じ理由で前もって行うのが最善です。アプリが運用環境に入った後にデータ ストレージ戦略を変更することは非常に困難です。 さまざまなアプローチについて前もってよく考えている場合は、アプリのデータとデータ アクセス コードを再構成する際に、アプリがクラッシュしたり、長時間停止したりする "Twitter の瞬間" を避けることができます。

データ ストレージの 3 つの Vs

パーティション分割戦略が必要かどうかと、その方法を決定するには、データに関する 3 つの質問を検討します。

  • ボリューム – 最終的にどの程度のデータを格納しますか? 数ギガバイト? 数百ギガバイト? テラバイト。 ペタバイト。
  • 速度 – データが増加する速度は何ですか? 大量のデータを生成していない内部アプリですか? 顧客が画像やビデオをアップロードする外部アプリ。
  • バラエティ – 格納するデータの種類は何ですか? リレーショナル、画像、キーと値のペア、ソーシャル グラフ?

ボリューム、速度、または多様性が多いと思われる場合は、アプリが成長するにつれて効率的かつ効果的にスケーリングできるパーティション分割スキームの種類を慎重に検討し、ボトルネックが発生しないようにする必要があります。

パーティション分割には基本的に 3 つの方法があります。

  • 垂直的パーティション分割
  • 行方向のパーティション分割
  • ハイブリッド パーティション分割

垂直的パーティション分割

垂直方向の分割は、テーブルを列で分割するようなものです。1 つの列セットが 1 つのデータ ストアに入り、別の列セットが別のデータ ストアに入ります。

たとえば、アプリに画像を含むユーザーに関するデータが格納されている場合を考えてみます。

データ テーブル

このデータをテーブルとして表し、さまざまな種類のデータを見ると、左側の 3 つの列にはリレーショナル データベースで効率的に格納できる文字列データが含まれているのに対し、右側の 2 つの列は基本的にイメージ ファイルから取得されるバイト配列であることがわかります。 イメージ ファイル データをリレーショナル データベースに格納することは可能であり、多くのユーザーは、ファイル システムにデータを保存したくないので、それを行います。 必要な量のデータを格納できるファイル システムがない場合や、個別のバックアップおよび復元システムを管理したくない場合があります。 このアプローチは、オンプレミスのデータベースやクラウド データベース内の少量のデータに適しています。 オンプレミス環境では、DBA がすべてを処理できるようにする方が簡単な場合があります。

ただし、クラウド データベースでは、ストレージは比較的高価であり、大量のイメージを使用すると、データベースのサイズが効率的に動作できる制限を超えて拡大する可能性があります。 これらの問題に対処するには、データを垂直方向にパーティション分割します。つまり、データ テーブル内の各列に最適なデータ ストアを選択します。 この例で最適に機能する可能性があるのは、文字列データをリレーショナル データベースに、イメージを Blob Storage に配置することです。

データ テーブルを垂直方向にパーティション分割する

ファイル サーバーの設定やリレーショナル データベースの外部に格納されているデータのバックアップと復元の管理について心配する必要がないため、データベースではなく Blob Storage にイメージを格納する方が、オンプレミス環境よりもクラウドで実用的です。BLOB ストレージ サービスによって自動的に処理されるすべてです。

これは Fix It アプリで実装したパーティション分割アプローチであり、 Blob Storage の章でそのコードを見ていきます。 このパーティション分割スキームがなく、平均イメージ サイズが 3 メガバイトであると仮定すると、Fix It アプリでは、最大データベース サイズ 150 ギガバイトに達する前に、約 40,000 個のタスクのみを格納できます。 イメージを削除した後、データベースはタスクの 10 倍を格納できます。水平パーティション分割スキームの実装を考える前に、はるかに長く行くことができます。 また、アプリの規模が大きくなるにつれて、ストレージのニーズの大部分が非常に安価な Blob Storage に入るため、コストの増加が遅くなります。

水平的パーティション分割 (シャーディング)

水平方向の分割は、テーブルを行で分割するようなものです。1 つの行セットが 1 つのデータ ストアに入り、別の行セットが別のデータ ストアに入ります。

同じデータ セットを使用すると、異なるデータベースに異なる範囲の顧客名を格納することもできます。

データ テーブルを水平方向にパーティション分割する

ホット スポットを回避するためにデータが均等に分散されるように、シャーディング スキームに十分に注意する必要があります。 姓の最初の文字を使用するこの簡単な例では、多くの人が姓を特定の共通文字で始まるため、その要件を満たしていません。 一部のデータベースは非常に大きくなり、ほとんどのデータベースは小さいままになるため、予想よりも早くテーブル サイズの制限に達します。

水平方向のパーティション分割の下側には、すべてのデータに対してクエリを実行するのが難しい場合があります。 この例では、アプリによって格納されているすべてのデータを取得するには、クエリを最大 26 個の異なるデータベースから取得する必要があります。

ハイブリッド パーティション分割

垂直パーティション分割と水平パーティション分割を組み合わせることができます。 たとえば、データの例では、Blob Storage にイメージを格納し、文字列データを水平方向にパーティション分割できます。

データ テーブルのハイブリッド パーティション分割

運用アプリケーションのパーティション分割

概念的には、パーティション分割スキームがどのように機能するかを簡単に確認できますが、パーティション分割スキームを使用すると、コードの複雑さが増し、対処する必要がある多くの新しい複雑さが発生します。 イメージを BLOB ストレージに移動する場合は、ストレージ サービスが停止したときに何を行いますか? BLOB セキュリティはどのように処理しますか? データベースと BLOB ストレージの同期が切れた場合はどうなりますか? シャーディングを行う場合、すべてのデータベースでクエリを処理するにはどうすればよいですか?

複雑な問題は、運用環境に移行する前に計画している限り、管理できます。 それをしなかった多くの人々は、後で望んでいた。 平均して、カスタマー アドバイザリ チーム (CAT) チームは、アプリが非常に大きな方法で離陸している顧客から月に 1 回、パニックに陥った電話を受け、この計画を行いませんでした。 そして、彼らは次のように言う: "ヘルプ! すべてを 1 つのデータ ストアに格納し、45 日後に領域が不足します。また、データ ストアへのアクセス方法に多くのビジネス ロジックが組み込まれており、アプリを使用している顧客がいる場合、移行中に 1 日ダウンする良い時間はありません。 最終的に、お客様がダウンタイムなしでその場でデータをパーティション分割できるように支援する、ヘラクレスな取り組みを行います。 それは非常にエキサイティングで非常に恐ろしいです、そして、それを避けることができるなら、あなたが関与したいものではありません! これを前もって考えてアプリに統合すると、アプリが後で成長すると、生活がはるかに簡単になります。

まとめ

効果的なパーティション分割スキームを使用すると、クラウド アプリをボトルネックなしで、クラウド内のペタバイト単位のデータにスケーリングできます。 また、オンプレミスのデータ センターでアプリを実行している場合のように、大規模なマシンや広範なインフラストラクチャに対して前払いする必要はありません。 クラウドでは、必要に応じて容量を段階的に追加でき、使用する分だけ料金を支払います。

次の では、Fix It アプリが Blob Storage にイメージを格納して垂直パーティション分割を実装する方法について説明します。

リソース

パーティション分割戦略の詳細については、次のリソースを参照してください。

ドキュメント

ビデオ:

  • FailSafe: スケーラブルで回復性の高いCloud Servicesの構築。 ウルリッヒ・ホーマン、マルク・メルキュール、マーク・シムズによる9部構成のシリーズ。 Microsoft カスタマー アドバイザリ チーム (CAT) の経験から実際の顧客に関するストーリーを含む、非常にアクセスしやすい興味深い方法で、高レベルの概念とアーキテクチャの原則を提示します。 第 7 話のパーティション分割の説明を参照してください。
  • 大きなビルド: Windows Azure のお客様から学んだ教訓 - パート I.Mark Simms では、パーティション分割スキーム、シャーディング戦略、シャーディングの実装方法、およびフェデレーションのSQL Databaseについて 19:49 から説明します。 Failsafe シリーズと似ていますが、詳細な操作方法について説明します。

サンプル コード: