MongoDB - シャarding: 初心者向けガイド

こんにちは、未来のデータベース魔法使いさんたち!今日は、MongoDBのシャardingの世界に興味深く飛び込みます。プログラミングが初めての方でも心配しないでください - 私があなたの親切なガイドとして、このトピックをステップバイステップで探求します。このチュートリアルの終わりには、プロのようにシャーディングができるようになるでしょう!さあ、飛び込みましょう!

MongoDB - Sharding

なぜシャーディングが必要なのか?

忙しい図書館を運営しているとしましょう。あなたの蔵書が増えるにつれて、すべての本を一个大部屋に保管するのが問題になってきます。混雑しており、本を見つけるのに時間がかかるようになります。どうすればいいのでしょうか?複数の部屋に分けて、それぞれに異なるカテゴリーの本を保管する考えも浮かびます。これが、データベースに対してシャーディングが行うことです!

シャーディングは、データを複数のマシンに分散させる方法です。データベースにスーパーパワーを与え、より多くのデータを処理し、複数のサーバーで管理できないリクエストを処理できるようにします。

以下は、シャーディングを使用する主な理由です:

  1. スケーラビリティ:データが増えるに連れて、サーバーを追加して処理するようにします。
  2. パフォーマンス:クエリは複数のサーバーで並列に処理されます。
  3. 高可用性:1つのサーバーがダウンしても、他のサーバーはリクエストを処理できます。

MongoDBにおけるシャーディング

シャーディングがどれほど重要であることを理解したので、次にMongoDBがどのようにそれを実装するかを見てみましょう。

基本概念

コードに進む前に、いくつかの主要な用語に慣れましょう:

  1. シャード:データの一部を保管する単一のサーバーやレプリカセット。
  2. シャードキー:データをシャード間で分散させるためのフィールド。
  3. チャンク:シャードキーの連続した範囲。
  4. 設定サーバー:クラスターのメタデータを保管する特別なMongoDBインスタンス。
  5. Mongos:リクエストを適切なシャードにルーティングするサービス。

シャardedクラスターの設定

基本的なシャardedクラスターを設定するプロセスを見てみましょう。初めは複雑に見えるかもしれませんが、ステップバイステップに分解します!

ステップ1: 設定サーバーの起動

まず、設定サーバーを起動します。本番環境では通常3台ありますが、この例では1台だけを使用します:

mongod --configsvr --replSet configReplSet --port 27019 --dbpath /data/configdb

このコマンドは、設定サーバーとしてMongoDBインスタンスを起動し、ポート27019を使用し、データを/data/configdbに保管します。

ステップ2: 設定サーバーレプリカセットの初期化

次に、設定サーバーレプリカセットを初期化します:

rs.initiate({
_id: "configReplSet",
members: [{ _id: 0, host: "localhost:27019" }]
})

これにより、設定サーバーを単一メンバーのレプリカセットとして設定します。

ステップ3: シャードサーバーの起動

次に、2台のシャードサーバーを起動します:

mongod --shardsvr --replSet shard1 --port 27018 --dbpath /data/shard1
mongod --shardsvr --replSet shard2 --port 27020 --dbpath /data/shard2

これらのコマンドは、異なるポートでシャードサーバーとしてMongoDBインスタンスを起動します。

ステップ4: シャードレプリカセットの初期化

各シャードに対してレプリカセットを初期化します:

// shard1のため
rs.initiate({
_id: "shard1",
members: [{ _id: 0, host: "localhost:27018" }]
})

// shard2のため
rs.initiate({
_id: "shard2",
members: [{ _id: 0, host: "localhost:27020" }]
})

ステップ5: Mongosルーターの起動

次に、mongosルーターを起動します:

mongos --configdb configReplSet/localhost:27019 --port 27017

これにより、mongosインスタンスが起動し、設定サーバーの場所を指定します。

ステップ6: クラスターにシャードを追加

最後に、クラスターにシャードを追加します:

sh.addShard("shard1/localhost:27018")
sh.addShard("shard2/localhost:27020")

これらのコマンドは、mongosにシャードの場所を伝えます。

データベースとコレクションに対するシャーディングの有効化

シャardedクラスターが設定されたので、データベースとコレクションに対してシャーディングを有効にします:

// 'mydb'データベースに対してシャーディングを有効に
sh.enableSharding("mydb")

// 'users'コレクションを's_username'フィールドをシャードキーとしてシャーディング
sh.shardCollection("mydb.users", { "username": 1 })

これにより、'mydb'データベースのシャーディングが有効になり、'users'コレクションは'username'フィールドに基づいてシャーディングされます。

データの挿入とクエリ

シャード設定が完了したので、データを挿入して動作を確認してみましょう:

// mongosに接続
mongo --port 27017

// データベースに切り替え
use mydb

// ユーザーをいくつか挿入
for (let i = 0; i < 10000; i++) {
db.users.insertOne({ username: "user" + i, age: Math.floor(Math.random() * 100) })
}

// 特定のユーザーをクエリ
db.users.find({ username: "user5000" })

このクエリを実行すると、mongosはリクエストを適切なシャードにルーティングします。

シャーディングメソッド

MongoDBは、データをシャード間で分散させるためにいくつかのシャーディングメソッドを提供しています:

メソッド 説明 使用ケース
Range Sharding シャードキーの値に基づいてデータを範囲に分ける シャードキーが良いカーディナリティを持っており、よく変わらない場合に適している
Hash Sharding シャードキーのハッシュを使用してデータを分散させる データの均一な分散を確保し、単調に変わるシャードキーに適している
Zone Sharding シャードキーの範囲を特定のシャードに関連付ける データロケalityや階層ストレージに役立つ

結論

おめでとうございます!MongoDBのシャーディングの世界に初めてのステップを踏み出しました。シャーディングがどれほど重要であるか、基本的なシャardedクラスターの設定方法、そしてシャードコレクションの操作方法について説明しました。

シャーディングは強力なツールですが、データベースの設定に複雑さを追加します。特定のユースケースに必要かどうかを慎重に検討してください。MongoDBの旅を続ける中で、より高度なシャーディング概念や技術に出会うでしょう。

練習を続け、好奇心を持ち続けると、シャーディングのエキスパートになるまでに間違いないです!未来のデータベースアーキテクトの皆様、快くコードを書きましょう!

Credits: Image by storyset