今回は「シャードクラスタの構築方法」についてまとめます。 「ハッシュシャード」と「レンジシャード」の違いについても触れています。
概要
まずは「シャードクラスタ構成」の基本的なイメージを以下に載せます。 シャード環境ではデータ保存されている場所に直接アクセスするのではなく、ルーターを経由して操作します。
- 設定サーバー
- レプリカセット。どのシャードにデータが保存されているかといった情報を保存しているサーバー。
- シャード
- レプリカセット。実際にデータを保存しているサーバー。
- ルーター
- アプリサーバー上で動作させる。設定サーバーから保存先を取得、シャードへのアクセスを行うサーバー。
「ハッシュシャード」では「シャードキー」の「ハッシュ値」を利用してデータを分散保存します。 単調増加するようなデータの場合、ハッシュシャードの分散化は効果を発揮します。
では、そんな「ハッシュシャード」を構築していきましょう!
シャードクラスタの構築
今回作成する環境の概要を以下に載せます。 実運用として最低限の構成を想定したものになっています。 ただし、物理サーバーは1台としたいのでインスタンスを必要数(10台分)作成するため、ポート番号を振り分けて識別するようにします。
もしテスト環境として最低限の構成とするのであれば、ルーター1台、シャード1台、設定サーバー1セット(レプリカセット)の組み合わせで最低5台必要です。
さて、これから早速構築に入っていきますが、大まかな手順は次のようになっています。
- フォルダ準備
- 設定サーバー構築
- シャードサーバー構築
- ルーター構築
以下でそれぞれについて詳しく見ていきましょう。
フォルダ準備
必要なフォルダやファイルを準備していきます。 今回は以下のようなフォルダやファイルを準備しておきます。 サーバーごとにフォルダを切っていますが、ログだけは同じ場所に出すようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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
123456789101112131415systemLog:
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つ)立ち上げて設定サーバーを起動していきます。
1mongod --config
"./mongod.config-1.log"
-
任意の設定サーバーへ接続
新しくコマンドプロンプトを立ち上げて任意のサーバーへ接続します。 以下のサンプルでは1台目のサーバー(config-1)へ接続します。
1mongo --host 127.0.0.1:8001
-
レプリカセットを初期化
rs.initiate()
で初期化します。123456789> 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()
でレプリカセットが認識していることを確認します。1PRIMARY > rs.status()
シャードサーバー構築
シャードサーバーは2台用意します。 以下の手順は1セット分の手順なので、2セット目もサーバー名を変えて準備します。
-
各サーバーに設定ファイルを作成
以下のサンプルを参考にシャードサーバー用のコンフィグファイルを作成していきます。
mongod.shard1-1.cfg
123456789101112131415systemLog:
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つ)立ち上げて設定サーバーを起動していきます。
1mongod --config
"./mongod.shard1-1.log"
-
任意の設定サーバーへ接続
新しくコマンドプロンプトを立ち上げて任意のサーバーへ接続します。 以下のサンプルでは1台目のサーバー(shard1-1)へ接続します。
1mongo --host 127.0.0.1:27011
-
レプリカセットを初期化
rs.initiate()
で初期化します。 一度config
というオブジェクトに設定を記述してから12345678> 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()
でレプリカセットが認識していることを確認します。1PRIMARY > rs.status()
ルーター構築
ルーター( mongos
)もサーバーなので設定ファイルを準備して起動します。
シャードサーバーは mongos 経由で登録します。
-
ルーター用設定ファイルを作成
mongos.cfg
123456789systemLog:
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
でルーターを起動します。1mongos --config
"./mongos.cfg"
-
ルーターへ接続
上記ルーターのコマンドプロンプトとは別のコマンドプロンプトでルーターへ接続します。
1mongo --host 127.0.0.1:8000
-
シャードサーバーを登録
sh.addShard()
でシャードサーバーを登録していきます。 今回は "shard1-rs" と "shard2-rs" の2つを登録します。1mongos > 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" データベースをシャードクラスタに登録します。
1mongos > sh.enableSharding(
"sample"
)
sh.enableSharding() コマンド指定したデータベースのシャーディングを有効化します。 自動的にシャード化は行わないので sh.shardCollection() でシャード化するコレクションを指定する必要があります。
sh.enableSharding( database )
引数 型 説明 database string シャード化するデータベース名を指定します。 データベース名はクォート( "
または'
)で囲みます。 -
シャード化するコレクションを登録
今回は "sample.users" コレクションに対して "email" をシャードキーとしてシャードできるように登録します。 ハッシュシャードかレンジシャードかはこの設定が異なるだけです。
ハッシュシャードで登録したい場合、以下のようにハッシュキー "email" に対して "hashed" を指定して登録します。
1mongos > sh.shardCollection(
"sample.users"
, { email:
"hashed"
})
レンジシャードの場合、以下のようにハッシュキー "email" に対して "1" または "-1" を指定して登録します。 以下のサンプルでは昇順になるような指定をしています。
1mongos > 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()
を実行してハッシュキーが設定されていることを確認します。1mongos > sh.status()
シャードクラスタの動作確認
基本は「ルーター (mongos) へ接続して操作」です。
mongoシェルコマンド
-
接続
接続は mongos サーバー に接続します。
1mongo --host 127.0.0.1:8000
-
書き込み
通常の書き込み方と同じ方法で書き込めます。 シャードキーを含んでいないと書き込みエラーになる点に注意します。
12mongos > use sample
mongos > db.users.insert({ email:
"tanaka@sample.com"
, name:
"tanaka"
})
-
読み込み
mongosに接続していれば通常通りの操作で読み取れます。
12mongos > use sample
mongos > db.users.
find
()
-
切断
何も考えず
exit
。1mongos >
exit
Node.js MongoDB Driver
Node.js MongoDB Driver でも「ルーター (mongos) へサクセスして操作」です。 以下のサンプルコードはサーバー接続して、データ書き込み、読み込みをしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var MongoClient = require( "mongodb" ).MongoClient; 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 の フォロー」 お願いします!!