ステータス:非推奨

この記事では、サポートされなくなったバージョンのUbuntuについて説明します。 現在Ubuntu12.04を実行しているサーバーを運用している場合は、サポートされているバージョンのUbuntuにアップグレードまたは移行することを強くお勧めします。

理由:
Ubuntu 12.04は2017年4月28日に保守終了(EOL)に達しました and no longer receives security patches or updates. This guide is no longer maintained.

代わりに参照してください:このガイドは参照として役立つ場合がありますが、他のUbuntuリリースでは機能しない場合があります。 可能な場合は、使用しているUbuntuのバージョン用に作成されたガイドを使用することを強くお勧めします。 ページ上部の検索機能を使用して、より新しいバージョンを見つけることができます。

序章


MongoDBは、水平方向に適切に拡張され、Key-Valueシステムを介してデータストレージを実装するNoSQLドキュメントデータベースシステムです。 WebアプリケーションやWebサイトで人気のある選択肢である、MongoDBは、プログラムによる実装とアクセスが簡単です。

MongoDBは、「シャーディング」と呼ばれる手法によってスケーリングを実現します。 シャーディングは、異なるサーバー間でデータを書き込んで、読み取りと書き込みの負荷とデータストレージの要件を分散させるプロセスです。

前のチュートリアルでは、 Ubuntu 12.04VPSにMongoDBをインストールする方法について説明しました。 これを出発点として使用して、多数の異なるノードにシャーディングを実装する方法について説明します。

MongoDBシャーディングトポロジ


シャーディングは、3つの別々のコンポーネントを介して実装されます。 各パーツは特定の機能を実行します。

  • 構成サーバー:各本番シャーディングの実装には、正確に3つの構成サーバーが含まれている必要があります。 これは、冗長性と高可用性を確保するためです。

    構成サーバーは、要求されたデータをそれを含むシャードにリンクするメタデータを格納するために使用されます。 情報を確実かつ一貫して取得できるようにデータを整理します。

  • クエリルーター:クエリルーターは、アプリケーションが実際に接続するマシンです。 これらのマシンは、構成サーバーと通信して、要求されたデータがどこに保存されているかを把握する役割を果たします。 次に、適切なシャードからデータにアクセスして返します。

    各クエリルーターは「mongos」コマンドを実行します。

  • シャードサーバー:シャードは実際のデータストレージ操作を担当します。 実稼働環境では、通常、単一のシャードは単一のマシンではなくレプリカセットで構成されます。 これは、プライマリシャードサーバーがオフラインになった場合でもデータにアクセスできるようにするためです。

    レプリカセットの実装はこのチュートリアルの範囲外であるため、レプリカセットではなく単一のマシンになるようにシャードを構成します。 独自の構成用にレプリカセットを構成する場合は、これを簡単に変更できます。

初期設定


上記に注意を払っていた場合、この構成にはかなりの数のマシンが必要であることにおそらく気づいたでしょう。 このチュートリアルでは、以下を含むシャーディングクラスターの例を構成します。

  • 3つの構成サーバー(実稼働環境で必要)
  • 2つのクエリルーター(最低1つ必要)
  • 4台のシャードサーバー(最低2台必要)

これは、正確にフォローするには9つのVPSインスタンスが必要になることを意味します。 実際には、これらの機能の一部は重複する可能性があり(たとえば、構成サーバーとして使用するのと同じVPSでクエリルーターを実行できます)、必要なクエリルーターは1つ、シャードサーバーは2つ以上です。

各タイプの複数のコンポーネントを追加する方法を示すために、この最小値を超えます。 また、明確さと単純さのために、これらすべてのコンポーネントを個別のマシンとして扱います。

初期ベースイメージを設定する


開始するには、このガイドを使用して、Ubuntuに初期MongoDBサーバーをインストールして構成します。 これを使用して、残りのシャーディングコンポーネントをブートストラップします。

最初のサーバーのチュートリアルが終了したら、次のコマンドでインスタンスをシャットダウンします。

sudo shutdown -h now

次に、この構成済みのドロップレットのスナップショットを取り、それを使用して他のVPSインスタンスを起動します。 実行中のシステムのスナップショットを作成することは可能ですが、電源を切ると、ファイルシステムが一貫した状態になります。 スナップショットのコストは、ファイルシステム内の使用済みスペースの量に基づいて、1ギガバイトあたり月額$ 0.05であるため、終了時にスナップショットを削除するのがおそらく最善です。

DigitalOceanコントロールパネルで、液滴を選択します。 「スナップショット」タブをクリックします。 スナップショット名を入力し、「スナップショットを撮る」をクリックします。

DigitalOcean take snapshot

スナップショットが作成され、最初のサーバーが再起動されます。

スナップショットに基づいてVPSインスタンスをスピンアップする


スナップショットプロセスで画像が保存されたので、これを残りのMongoDBコンポーネントのベースとして使用できます。

コントロールパネルから、「作成」ボタンをクリックします。 ドロップレットがシャーディング構成で持つ目的を説明する名前を入力します。

DigitalOcean name droplet

液滴サイズと領域を選択します。 すべてのコンポーネントに同じリージョンを選択することをお勧めします。

[画像の選択]セクションで、[マイ画像]タブをクリックし、作成したMongoDBスナップショットを選択します。

DigitalOcean select image

必要なSSHキーを追加し、使用する設定を選択します。 「ドロップレットの作成」をクリックして、新しいVPSインスタンスを起動します。

シャーディングコンポーネントごとにこの手順を繰り返します。 このチュートリアルを正確に実行するには(必須ではありませんが、説明的です)、3つの構成サーバー、2つのクエリサーバー、および4つのシャードサーバーが必要です。

各コンポーネントのDNSサブドメインエントリを構成する(オプション)


MongoDBのドキュメントでは、特定のIPアドレスではなく、DNSで解決可能な名前ですべてのコンポーネントを参照することを推奨しています。 これは、関連付けられているすべてのサーバーを再起動しなくても、サーバーを変更したり、特定のコンポーネントを再デプロイしたりできるため、重要です。

使いやすくするために、使用するドメイン上に各サーバーに独自のサブドメインを指定することをお勧めします。 このガイドを使用して、DigitalOceanのコントロールパネルを使用してDNSサブドメインを設定する方法を学ぶことができます。

このチュートリアルでは、これらのサブドメインでアクセス可能なコンポーネントを参照します。

  • 構成サーバー

    • config0.example.com
    • config1.example.com
    • config2.example.com
  • クエリルーター

    • query0.example.com
    • query1.example.com
  • シャードサーバー

    • shard0.example.com
    • shard1.example.com
    • shard2.example.com
    • shard3.example.com

サブドメインを設定しない場合でも、従うことはできますが、構成はそれほど堅牢ではありません。 このルートを使用する場合は、サブドメインの仕様をドロップレットのIPアドレスに置き換えるだけです。

構成サーバーを初期化します


セットアップする必要のある最初のコンポーネントは、構成サーバーです。 クエリルーターまたはシャードを構成する前に、これらがオンラインで動作可能である必要があります。

rootとして最初の構成サーバーにログインします。

最初に行う必要があるのは、データディレクトリを作成することです。このディレクトリには、構成サーバーが場所とコンテンツを関連付けるメタデータを格納します。

mkdir /mongo-metadata

ここで、適切なパラメーターを使用して構成サーバーを起動するだけです。 構成サーバーを提供するサービスは、mongodと呼ばれます。 このコンポーネントのデフォルトのポート番号は27019です。

次のコマンドで構成サーバーを起動できます。

mongod --configsvr --dbpath /mongo-metadata --port 27019

サーバーは情報の出力を開始し、他のコンポーネントからの接続のリッスンを開始します。

このプロセスを他の2つの構成サーバーで正確に繰り返します。 ポート番号は、3台のサーバーすべてで同じである必要があります。

クエリルーターインスタンスの構成


この時点で、3つの構成サーバーすべてが実行され、接続をリッスンしているはずです。 続行する前に、操作可能である必要があります。

ルートとして最初のクエリルーターにログインします。

最初に行う必要があるのは、このインスタンスがすでに実行されている場合は、このインスタンスでmongodbプロセスを停止することです。 クエリルーターは、メインのMongoDBプロセスと競合するデータロックを使用します。

service mongodb stop

次に、特定の構成文字列を使用してクエリルーターサービスを開始する必要があります。 構成文字列は、構成するすべてのクエリルーターで完全に同じである必要があります(引数の順序を含む)。 これは、各構成サーバーのアドレスとそれが動作しているポート番号で構成され、コンマで区切られています。

彼らはルーターサービスをクエリしますmongosと呼ばれます。 このプロセスのデフォルトのポート番号は27017です(ただし、構成内のポート番号は構成サーバーのポート番号を参照しており、デフォルトでは27019です)。

最終結果は、クエリルーターサービスが次のような文字列で開始されることです。

mongos --configdb config0.example.com:27019、config1.example.com:27019、config2.example.com:27019

最初のクエリルーターは、3つの構成サーバーへの接続を開始する必要があります。 他のクエリルーターでこれらの手順を繰り返します。 コマンドを入力する前に、mongodbサービスを停止する必要があることに注意してください。

また、各クエリルーターを起動するには、excate同じコマンドを使用する必要があることに注意してください。 そうしないと、エラーが発生します。

クラスターにシャードを追加する


構成サーバーとクエリルーターが構成されたので、実際のシャードサーバーをクラスターに追加し始めることができます。 これらのシャードはそれぞれ、合計データの一部を保持します。

ルートとしてシャードサーバーの1つにログインします。

冒頭で述べたように、このガイドでは、レプリカセットの代わりに単一のマシンシャードのみを使用します。 これは、デモンストレーションを簡潔かつ単純にするためです。 実稼働環境では、データの整合性と可用性を確保するために、レプリカセットを強くお勧めします。 MongoDB でレプリカセットを構成するには、このガイドに従ってください。

シャードを実際にクラスターに追加するには、クエリルーターを経由する必要があります。クエリルーターは、クラスターとのインターフェイスとして機能するように構成されています。 これを行うには、次のようにクエリルーターの任意のに接続します。

mongo --host query0.example.com --port 27017

これにより、適切なクエリルーターに接続し、mongoプロンプトが開きます。 このプロンプトからすべてのシャードサーバーを追加します。

最初のシャードを追加するには、次のように入力します。

sh.addShard(“ shard0.example.com:27017 ”)

次に、この同じインターフェイスに残りのシャードドロップレットを追加できます。 各シャードサーバーに個別にログインする必要はありません。

sh.addShard(“ shard1.example.com:27017 ”)sh.addShard(“ shard2.example.com:27017 ”)sh.addShard(“ shard3.example.com:27017 ”)

レプリケーションセットを備えた本番クラスターを構成している場合は、代わりにレプリケーションセット名とレプリケーションセットメンバーを指定して、各セットを個別のシャードとして確立する必要があります。 構文は次のようになります。

sh.addShard(“ rep_set_name / rep_set_member :27017”)

データベースコレクションのシャーディングを有効にする方法


MongoDBは、情報をデータベースに編成します。 各データベース内では、データは「コレクション」によってさらに細分化されています。 コレクションは、従来のリレーショナルデータベースモデルのテーブルに似ています。

このセクションでは、クエリルーターを使用して操作します。 まだクエリルーターに接続していない場合は、前のセクションで使用したのと同じmongoコマンドを使用して再度アクセスできます。

mongo --host config0.example.com --port 27017

データベースレベルでシャーディングを有効にする


最初にデータベースレベルでシャーディングを有効にします。 これを行うには、(適切に)test_dbというテストデータベースを作成します。

このデータベースを作成するには、単にデータベースに変更する必要があります。 現在のデータベースとしてマークされ、最初にデータを入力したときに動的に作成されます。

use test_db

次のように入力することで、作成したデータベースを現在使用していることを確認できます。

db

test_db

次のように入力すると、使用可能なすべてのデータベースが表示されます。

show dbs

作成したばかりのデータベースが表示されないことに気付くかもしれません。 これは、データが保持されていないため、まだ完全に現実的ではないためです。

次のコマンドを発行することにより、このデータベースでシャーディングを有効にできます。

sh.enableSharding("test_db")

ここでも、show dbsコマンドを入力すると、新しいデータベースは表示されません。 ただし、自動的に生成されるconfigデータベースに切り替えて、find()コマンドを発行すると、新しいデータベースが返されます。

use config
db.databases.find()

{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "test_db", "partitioned" : true, "primary" : "shard0003" }

MongoDBが新しいデータベースにデータを追加すると、データベースはshow dbsコマンドで表示されます。

コレクションレベルでシャーディングを有効にする


データベースがシャーディングに使用可能としてマークされたので、特定のコレクションでシャーディングを有効にできます。

この時点で、シャーディング戦略を決定する必要があります。 シャーディングは、保存しているドキュメントでshard keyとして指定されている特定のフィールドに基づいて、データをさまざまなカテゴリに整理することで機能します。 一致するシャードキーを持つすべてのドキュメントを同じシャードに配置します。

たとえば、データベースに会社の従業員が格納されていて、シャードキーがお気に入りの色に基づいている場合、MongoDBは、blueが1つのシャードのお気に入りの色フィールドにあるすべての従業員を配置します。 誰もがいくつかの色を好む場合、これは不均衡なストレージにつながる可能性があります。

シャードキーのより良い選択は、より均等に分散されることが保証されているものです。 たとえば、大企業では、誕生日(月と日)フィールドはおそらくかなり均等に分散されます。

配布方法がわからない場合、または適切なフィールドがない場合は、既存のフィールドに基づいて「ハッシュ化された」シャードキーを作成できます。 これが私たちのデータに対して行うことです。

test_collectionというコレクションを作成し、その「_id」フィールドをハッシュできます。 test_dbデータベースを使用していることを確認してから、次のコマンドを発行します。

use test_db
db.test_collection.ensureIndex( { _id : "hashed" } )

次に、次のコマンドを発行してコレクションをシャーディングできます。

sh.shardCollection("test_db.test_collection", { "_id": "hashed" } )

これにより、使用可能なすべてのシャードにわたってコレクションがシャーディングされます。

コレクションにテストデータを挿入する


ループを使用していくつかのオブジェクトを作成することにより、シャーディングの動作を確認できます。 このループは、テストデータを生成するためにMongoDBWebサイトから直接取得されます。

次のような単純なループを使用して、コレクションにデータを挿入できます。

use test_db
for (var i = 1; i <= 500; i++) db.test_collection.insert( { x : i } )

これにより、500個の単純なドキュメント(IDフィールドと数字を含む「x」フィールドのみ)が作成され、それらが異なるシャードに分散されます。 次のように入力すると、結果を確認できます。

db.test_collection.find()

{ "_id" : ObjectId("529d082c488a806798cc30d3"), "x" : 6 }
{ "_id" : ObjectId("529d082c488a806798cc30d0"), "x" : 3 }
{ "_id" : ObjectId("529d082c488a806798cc30d2"), "x" : 5 }
{ "_id" : ObjectId("529d082c488a806798cc30ce"), "x" : 1 }
{ "_id" : ObjectId("529d082c488a806798cc30d6"), "x" : 9 }
{ "_id" : ObjectId("529d082c488a806798cc30d1"), "x" : 4 }
{ "_id" : ObjectId("529d082c488a806798cc30d8"), "x" : 11 }
. . .

より多くの値を取得するには、次のように入力します。

it

{ "_id" : ObjectId("529d082c488a806798cc30cf"), "x" : 2 }
{ "_id" : ObjectId("529d082c488a806798cc30dd"), "x" : 16 }
{ "_id" : ObjectId("529d082c488a806798cc30d4"), "x" : 7 }
{ "_id" : ObjectId("529d082c488a806798cc30da"), "x" : 13 }
{ "_id" : ObjectId("529d082c488a806798cc30d5"), "x" : 8 }
{ "_id" : ObjectId("529d082c488a806798cc30de"), "x" : 17 }
{ "_id" : ObjectId("529d082c488a806798cc30db"), "x" : 14 }
{ "_id" : ObjectId("529d082c488a806798cc30e1"), "x" : 20 }
. . .

特定のシャードに関する情報を取得するには、次のように入力します。

sh.status()

--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "version" : 3,
    "minCompatibleVersion" : 3,
    "currentVersion" : 4,
    "clusterId" : ObjectId("529cae0691365bef9308cd75")
}
  shards:
    {  "_id" : "shard0000",  "host" : "162.243.243.156:27017" }
    {  "_id" : "shard0001",  "host" : "162.243.243.155:27017" }
. . .

これにより、MongoDBがシャード間で分散したチャンクに関する情報が提供されます。

結論


このガイドの終わりまでに、独自のMongoDBシャーディング構成を実装できるようになるはずです。 サーバーの特定の構成と各コレクションに選択するシャードキーは、クラスターのパフォーマンスに大きな影響を与えます。

最適な分散プロパティを持ち、データベースクエリに反映される論理グループを最も厳密に表す1つまたは複数のフィールドを選択します。 MongoDBがデータを取得するために単一のシャードに移動するだけでよい場合、MongoDBはより速く戻ります。

ジャスティン・エリングウッド