MongoDB で シャードクラスタ 環境 を 構築する

0 件のコメント

今回は「シャードクラスタの構築方法」についてまとめます。 「ハッシュシャード」と「レンジシャード」の違いについても触れています。

概要

まずは「シャードクラスタ構成」の基本的なイメージを以下に載せます。 シャード環境ではデータ保存されている場所に直接アクセスするのではなく、ルーターを経由して操作します。

設定サーバー
レプリカセット。どのシャードにデータが保存されているかといった情報を保存しているサーバー。
シャード
レプリカセット。実際にデータを保存しているサーバー。
ルーター
アプリサーバー上で動作させる。設定サーバーから保存先を取得、シャードへのアクセスを行うサーバー。

「ハッシュシャード」では「シャードキー」の「ハッシュ値」を利用してデータを分散保存します。 単調増加するようなデータの場合、ハッシュシャードの分散化は効果を発揮します。

では、そんな「ハッシュシャード」を構築していきましょう!

シャードクラスタの構築

今回作成する環境の概要を以下に載せます。 実運用として最低限の構成を想定したものになっています。 ただし、物理サーバーは1台としたいのでインスタンスを必要数(10台分)作成するため、ポート番号を振り分けて識別するようにします。

もしテスト環境として最低限の構成とするのであれば、ルーター1台、シャード1台、設定サーバー1セット(レプリカセット)の組み合わせで最低5台必要です。

さて、これから早速構築に入っていきますが、大まかな手順は次のようになっています。

  1. フォルダ準備
  2. 設定サーバー構築
  3. シャードサーバー構築
  4. ルーター構築

以下でそれぞれについて詳しく見ていきましょう。

フォルダ準備

必要なフォルダやファイルを準備していきます。 今回は以下のようなフォルダやファイルを準備しておきます。 サーバーごとにフォルダを切っていますが、ログだけは同じ場所に出すようにします。

C:\work\MongoDB\shard
│  
├─config-1
│  │  mongod.config-1.cfg
│  │  
│  └─data
├─config-2
│  │  mongod.config-2.cfg
│  │  
│  └─data
├─config-3
│  │  mongod.config-3.cfg
│  │  
│  └─data
├─shard1-1
│  │  mongod.shard1-1.cfg
│  │  
│  └─data
├─shard1-2
│  │  mongod.shard1-2.cfg
│  │  
│  └─data
├─shard1-3
│  │  mongod.shard1-3.cfg
│  │  
│  └─data
├─shard2-1
│  │  mongod.shard2-1.cfg
│  │  
│  └─data
├─shard2-2
│  │  mongod.shard2-2.cfg
│  │  
│  └─data
├─shard2-2
│  │  mongod.shard2-3.cfg
│  │  
│  └─data
├─router
│      mongos.cfg
└─log

設定サーバー構築

レプリカセットを構成します。

  1. 各サーバーに設定ファイルを作成

    以下のサンプルを参考に設定サーバー用のコンフィグファイルを作成していきます。

    mongod.config-1.cfg

    systemLog:
      destination: file
      logAppend: true
      path: C:\work\MongoDB\shard\log\mongod.config-1.log
    storage:
      dbPath: C:\work\MongoDB\shard\config-1\data
      journal:
        enabled: true
    replication:
      replSetName: "config-rs"
    sharding:
      clusterRole: configsvr
    net:
      bindIpAll: true
      port: 8001
    
    引数 説明
    systemLog.path 出力ログファイル名を指定します。
    storage.dbPath データファイル保存先フォルダを指定します。
    replication.replSetName 任意のレプリカセット名を指定します。今回は "config-rs" とします。
    sharding.clusterRole 設定サーバーは configsvr 固定です。
    net.port 今回はポート番号で識別するので個別に設定します。
  2. 各サーバーを起動

    コマンドプロンプトを必要数(今回だと3つ)立ち上げて設定サーバーを起動していきます。

    mongod --config "./mongod.config-1.log"
    
  3. 任意の設定サーバーへ接続

    新しくコマンドプロンプトを立ち上げて任意のサーバーへ接続します。 以下のサンプルでは1台目のサーバー(config-1)へ接続します。

    mongo --host 127.0.0.1:8001
    
  4. レプリカセットを初期化

    rs.initiate() で初期化します。

     > rs.initiate({
      _id: "config-rs",
      configsvr: true,
      members: [
        { _id: 0, host: "127.0.0.1:8001" },
        { _id: 1, host: "127.0.0.1:8002" },
        { _id: 2, host: "127.0.0.1:8003" },
      ]
    })
    
  5. 必要に応じて状態を確認

    rs.status() でレプリカセットが認識していることを確認します。

    PRIMARY > rs.status()
    

シャードサーバー構築

シャードサーバーは2台用意します。 以下の手順は1セット分の手順なので、2セット目もサーバー名を変えて準備します。

  1. 各サーバーに設定ファイルを作成

    以下のサンプルを参考にシャードサーバー用のコンフィグファイルを作成していきます。

    mongod.shard1-1.cfg

    systemLog:
      destination: file
      logAppend: true
      path: C:\work\MongoDB\shard\log\mongod.shard1-1.log
    storage:
      dbPath: C:\work\MongoDB\shard\shard1-1\data
      journal:
        enabled: true
    replication:
      replSetName: "shard1-rs"
    sharding:
      clusterRole: shardsvr
    net:
      bindIpAll: true
      port: 27011
    
    設定 説明
    systemLog.path 出力ログファイル名を指定します。
    storage.dbPath データファイル保存先フォルダを指定します。
    replication.replSetName 任意のレプリカセット名を指定します。今回は "shard1-rs" とします。
    sharding.clusterRole シャードサーバーは shardsvr 固定です。
    net.port 今回はポート番号で識別するので個別に設定します。
  2. 各サーバーを起動

    コマンドプロンプトを必要数(今回だと3つ)立ち上げて設定サーバーを起動していきます。

    mongod --config "./mongod.shard1-1.log"
    
  3. 任意の設定サーバーへ接続

    新しくコマンドプロンプトを立ち上げて任意のサーバーへ接続します。 以下のサンプルでは1台目のサーバー(shard1-1)へ接続します。

    mongo --host 127.0.0.1:27011
    
  4. レプリカセットを初期化

    rs.initiate() で初期化します。 一度 config というオブジェクトに設定を記述してから

     > rs.initiate({
      _id: "shard1-rs",
      members: [
        { _id: 0, host: "127.0.0.1:27011" },
        { _id: 1, host: "127.0.0.1:27012" },
        { _id: 2, host: "127.0.0.1:27013" },
      ]
    })
    
  5. 必要に応じて状態を確認

    rs.status() でレプリカセットが認識していることを確認します。

    PRIMARY > rs.status()
    

ルーター構築

ルーター( mongos )もサーバーなので設定ファイルを準備して起動します。 シャードサーバーは mongos 経由で登録します。

  1. ルーター用設定ファイルを作成

    mongos.cfg

    systemLog:
      destination: file
      logAppend: true
      path: C:\work\MongoDB\shard\log\mongod.router.log
    sharding:
      configDB: config-rs/127.0.0.1:8001,127.0.0.1:8002,127.0.0.1:8003
    net:
      bindIpAll: true
      port: 8000
    
    引数 説明
    systemLog.path 出力ログファイル名を指定します。
    sharding.configDB 設定サーバーのレプリカセットへのパスを指定します。 指定方法は以下のような形式で指定します。

    [レプリカセット名]/[サーバー1]:[ポート1],[サーバー2]:[ポート2], ...

    net.port 今回はポート番号で識別するので特定できるポートを設定します。
  2. ルーターを起動

    新しくコマンドプロンプトを起動して mongos でルーターを起動します。

    mongos --config "./mongos.cfg"
    
  3. ルーターへ接続

    上記ルーターのコマンドプロンプトとは別のコマンドプロンプトでルーターへ接続します。

    mongo --host 127.0.0.1:8000
    
  4. シャードサーバーを登録

    sh.addShard() でシャードサーバーを登録していきます。 今回は "shard1-rs" と "shard2-rs" の2つを登録します。

    mongos > sh.addShard("shard1-rs/127.0.0.1:27011,127.0.0.1:27012,127.0.0.1:27013")
    
    sh.addShard() コマンド

    シャードレプリカセットをシャードクラスタに追加します。

    sh.addShard( url )
    
    引数 説明
    url string 設定サーバーのレプリカセットへのURLを指定します。 指定は以下のようなURLを指定します。

    [レプリカセット名]/[サーバー1]:[ポート1],[サーバー2]:[ポート2], ...

  5. データベースを登録

    今回は "sample" データベースをシャードクラスタに登録します。

    mongos > sh.enableSharding("sample")
    
    sh.enableSharding() コマンド

    指定したデータベースのシャーディングを有効化します。 自動的にシャード化は行わないので sh.shardCollection() でシャード化するコレクションを指定する必要があります。

    sh.enableSharding( database )
    
    引数 説明
    database string シャード化するデータベース名を指定します。 データベース名はクォート( " または ' )で囲みます。
  6. シャード化するコレクションを登録

    今回は "sample.users" コレクションに対して "email" をシャードキーとしてシャードできるように登録します。 ハッシュシャードかレンジシャードかはこの設定が異なるだけです。

    ハッシュシャードで登録したい場合、以下のようにハッシュキー "email" に対して "hashed" を指定して登録します。

    mongos > sh.shardCollection("sample.users", { email: "hashed" })
    

    レンジシャードの場合、以下のようにハッシュキー "email" に対して "1" または "-1" を指定して登録します。 以下のサンプルでは昇順になるような指定をしています。

    mongos > sh.shardCollection("sample.users", { email: 1 })
    
    sh.shardCollection() コマンド

    シャードキーを指定してコレクションをシャード化します。

    sh.shardCollection( namespace, key, unique, options )
    
    引数 説明
    namespace string シャード化したいコレクションを以下の形式で指定します。

    [データベース名].[コレクション名]

    key object

    シャードキーをオブジェクト形式指定します。

    ハッシュシャードの場合は "hashed" 固定です。

    • { [シャードキー]: "hashed" }

    レンジシャードの場合は "1"(昇順) または "-1"(降順) を指定します。

    • { [シャードキー]: 1 }
    • { [シャードキー]: -1 }
    unique boolean オプション。 true を指定すればシャードキーにユニーク制約をつけられます。 デフォルトは false 。 ハッシュシャードの場合は必ず falsetrue が指定できないので注意。
    options object オプション。
  7. ハッシュ設定が有効化されたことを確認

    sh.status() を実行してハッシュキーが設定されていることを確認します。

    mongos > sh.status()
    

シャードクラスタの動作確認

基本は「ルーター (mongos) へ接続して操作」です。

mongoシェルコマンド

  • 接続

    接続は mongos サーバー に接続します。

    mongo --host 127.0.0.1:8000
    
  • 書き込み

    通常の書き込み方と同じ方法で書き込めます。 シャードキーを含んでいないと書き込みエラーになる点に注意します。

    mongos > use sample
    mongos > db.users.insert({ email: "tanaka@sample.com", name: "tanaka" })
    
  • 読み込み

    mongosに接続していれば通常通りの操作で読み取れます。

    mongos > use sample
    mongos > db.users.find()
    
  • 切断

    何も考えず exit

    mongos > exit
    

Node.js MongoDB Driver

Node.js MongoDB Driver でも「ルーター (mongos) へサクセスして操作」です。 以下のサンプルコードはサーバー接続して、データ書き込み、読み込みをしています。

var MongoClient = require("mongodb").MongoClient;

var URL = "mongodb://127.0.0.1:8000/sample";

MongoClient.connect(URL, (error, client) => {
  var db = client.db("sample");
  db.collection("users").insertOne(
    { email: "suzuki@sample.com", name: "suzuki" }
  ).then(() => {
    db.collection("users").find().toArray((error, docs) => {
      console.log(docs);
    });
  });
});

今回は「シャードクラスタの構築方法」についてまとめました。 ポイントは以下の通りです。 参考になったでしょうか?

  • 必要な役割は「設定サーバー」「シャード」「ルーター」の3つ
  • シャードへのアクセスは必ず「ルーター」経由

本記事がお役に立っていると嬉しいです!!

最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!