今回は「シャードクラスタの構築方法」についてまとめます。 「ハッシュシャード」と「レンジシャード」の違いについても触れています。
概要
まずは「シャードクラスタ構成」の基本的なイメージを以下に載せます。 シャード環境ではデータ保存されている場所に直接アクセスするのではなく、ルーターを経由して操作します。
- 設定サーバー
- レプリカセット。どのシャードにデータが保存されているかといった情報を保存しているサーバー。
- シャード
- レプリカセット。実際にデータを保存しているサーバー。
- ルーター
- アプリサーバー上で動作させる。設定サーバーから保存先を取得、シャードへのアクセスを行うサーバー。
「ハッシュシャード」では「シャードキー」の「ハッシュ値」を利用してデータを分散保存します。 単調増加するようなデータの場合、ハッシュシャードの分散化は効果を発揮します。
では、そんな「ハッシュシャード」を構築していきましょう!
シャードクラスタの構築
今回作成する環境の概要を以下に載せます。 実運用として最低限の構成を想定したものになっています。 ただし、物理サーバーは1台としたいのでインスタンスを必要数(10台分)作成するため、ポート番号を振り分けて識別するようにします。
もしテスト環境として最低限の構成とするのであれば、ルーター1台、シャード1台、設定サーバー1セット(レプリカセット)の組み合わせで最低5台必要です。
さて、これから早速構築に入っていきますが、大まかな手順は次のようになっています。
- フォルダ準備
- 設定サーバー構築
- シャードサーバー構築
- ルーター構築
以下でそれぞれについて詳しく見ていきましょう。
フォルダ準備
必要なフォルダやファイルを準備していきます。 今回は以下のようなフォルダやファイルを準備しておきます。 サーバーごとにフォルダを切っていますが、ログだけは同じ場所に出すようにします。
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
設定サーバー構築
レプリカセットを構成します。
-
各サーバーに設定ファイルを作成
以下のサンプルを参考に設定サーバー用のコンフィグファイルを作成していきます。
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 今回はポート番号で識別するので個別に設定します。 -
各サーバーを起動
コマンドプロンプトを必要数(今回だと3つ)立ち上げて設定サーバーを起動していきます。
mongod --config "./mongod.config-1.log"
-
任意の設定サーバーへ接続
新しくコマンドプロンプトを立ち上げて任意のサーバーへ接続します。 以下のサンプルでは1台目のサーバー(config-1)へ接続します。
mongo --host 127.0.0.1:8001
-
レプリカセットを初期化
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" }, ] })
-
必要に応じて状態を確認
rs.status()
でレプリカセットが認識していることを確認します。PRIMARY > rs.status()
シャードサーバー構築
シャードサーバーは2台用意します。 以下の手順は1セット分の手順なので、2セット目もサーバー名を変えて準備します。
-
各サーバーに設定ファイルを作成
以下のサンプルを参考にシャードサーバー用のコンフィグファイルを作成していきます。
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 今回はポート番号で識別するので個別に設定します。 -
各サーバーを起動
コマンドプロンプトを必要数(今回だと3つ)立ち上げて設定サーバーを起動していきます。
mongod --config "./mongod.shard1-1.log"
-
任意の設定サーバーへ接続
新しくコマンドプロンプトを立ち上げて任意のサーバーへ接続します。 以下のサンプルでは1台目のサーバー(shard1-1)へ接続します。
mongo --host 127.0.0.1:27011
-
レプリカセットを初期化
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" }, ] })
-
必要に応じて状態を確認
rs.status()
でレプリカセットが認識していることを確認します。PRIMARY > rs.status()
ルーター構築
ルーター( mongos
)もサーバーなので設定ファイルを準備して起動します。
シャードサーバーは mongos 経由で登録します。
-
ルーター用設定ファイルを作成
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 今回はポート番号で識別するので特定できるポートを設定します。 -
ルーターを起動
新しくコマンドプロンプトを起動して
mongos
でルーターを起動します。mongos --config "./mongos.cfg"
-
ルーターへ接続
上記ルーターのコマンドプロンプトとは別のコマンドプロンプトでルーターへ接続します。
mongo --host 127.0.0.1:8000
-
シャードサーバーを登録
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], ...
-
データベースを登録
今回は "sample" データベースをシャードクラスタに登録します。
mongos > sh.enableSharding("sample")
sh.enableSharding() コマンド指定したデータベースのシャーディングを有効化します。 自動的にシャード化は行わないので sh.shardCollection() でシャード化するコレクションを指定する必要があります。
sh.enableSharding( database )
引数 型 説明 database string シャード化するデータベース名を指定します。 データベース名はクォート( "
または'
)で囲みます。 -
シャード化するコレクションを登録
今回は "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
。 ハッシュシャードの場合は必ずfalse
でtrue
が指定できないので注意。options object オプション。 -
ハッシュ設定が有効化されたことを確認
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 の フォロー」 お願いします!!