今回は「MongoDB の シャードクラスタからシャードサーバーを取り除く方法」についてまとめます。
概要
今回は何かしらの理由でシャードサーバーを取り外したいときの手順についてまとめました。
単純に removeShard
を実行すればできるか…と言われるとそうではなかったので、その注意点も含めてまとめました。
手順
基本的には以下の手順でシャードクラスタから任意のシャードサーバーを取り除けます。
-
バランサーが有効であることを確認。
1mongos > sh.getBalancerState()
-
取り除くシャードサーバー情報の確認
sh.status()
を実行して、取り除きたいシャードサーバーの shards._id 、 databases.primary を確認します。 特にdatabases.primary
に取り除きたいシャードサーバーがある場合、すぐにはシャードサーバーを取り除けないのでよく確認します。 今回はshard2-rs
を取り除きます。1mongos > sh.status()
12345678910111213141516171819202122232425262728293031323334353637383940414243--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5b2de11015e5c83be5461bc1")
}
shards:
{ "_id" : "shard1-rs", "host" : "shard1-rs/127.0.0.1:27011,127.0.0.1:27012,127.0.0.1:27013", "state" : 1 }
{ "_id" : "shard2-rs", "host" : "shard2-rs/127.0.0.1:27021,127.0.0.1:27022,127.0.0.1:27023", "state" : 1 }
active mongoses:
"3.6.2" : 1
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 1
Last reported error: Could not find host matching read preference { mode: "primary" } for set shard1-rs
Time of Reported error: Sat Jul 14 2018 23:04:02 GMT+0900
Migration Results for the last 24 hours:
No recent migrations
databases:
{ "_id" : "config", "primary" : "config", "partitioned" : true }
config.system.sessions
shard key: { "_id" : 1 }
unique: false
balancing: true
chunks:
shard1-rs 1
{ "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shard1-rs Timestamp(1, 0)
{ "_id" : "sample", "primary" : "shard2-rs", "partitioned" : true }
sample.users
shard key: { "email" : "hashed" }
unique: false
balancing: true
chunks:
shard1-rs 2
shard2-rs 2
{ "email" : { "$minKey" : 1 } } -->> { "email" : NumberLong("-4611686018427387902") } on : shard1-rs Timestamp(2, 2)
{ "email" : NumberLong("-4611686018427387902") } -->> { "email" : NumberLong(0) } on : shard1-rs Timestamp(2, 3)
{ "email" : NumberLong(0) } -->> { "email" : NumberLong("4611686018427387902") } on : shard2-rs Timestamp(2, 4)
{ "email" : NumberLong("4611686018427387902") } -->> { "email" : { "$maxKey" : 1 } } on : shard2-rs Timestamp(2, 5)
-
admin
データベースへスイッチ。1mongos > use admin
-
取り除きたいシャードサーバーから primary データベースを削除。
取り除きたいシャードサーバーが primary 設定されたデータベースが存在している場合、
addminCommand({ movePrimay: [データベース], to: [シャードID] })
を実行して primary サーバーを移動させます。1mongos > db.adminCommand( { movePrimary: "sample", to: "shard1-rs" } )
123456789101112{
"primary" : "shard1-rs:shard1-rs/127.0.0.1:27011,127.0.0.1:27012,127.0.0.1:27013",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1531620524, 3),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1531620524, 3)
}
-
シャードクラスタからシャードサーバーを除去。
取り除きたいシャードサーバーの
_id
を指定してaddminCommand({ removeShard: [シャードID] })
を実行します。1mongos > db.adminCommand( { removeShard: "shard2-rs" } )
-
ステータスの確認。
正常終了していれば
state: "completed"
となります。1mongos > db.adminCommand( { removeShard: "shard2-rs" } )
1234567891011121314{
"msg" : "removeshard completed successfully",
"state" : "completed",
"shard" : "shard2-rs",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1531620611, 3),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1531620611, 3)
}
シャーディングサーバーを除去しようとすると上記のようなエラーが発生するときがあります。
これはシャーディングのプライマリサーバーを取り除こうとしているからで、以下のようなエラーが発生します。
手順2 および 4 を実行していれば出ることがないので、エラーメッセージ中の dbsToMode
を参考に movePrimary
を実行することで回避できます。
エラー例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | { "msg" : "draining ongoing", "state" : "ongoing", "remaining" : { "chunks" : NumberLong(0), "dbs" : NumberLong(1) }, "note" : "you need to drop or movePrimary these databases", "dbsToMove" : [ "sample" ], "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1531619985, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1531619985, 1) } |
確認
status: "completed"
となっていれば切断可能ですが、sh.status()
でも除去可能であることを確認します。
-
mongos に接続。
1mongos 127.0.0.1:8000
-
シャーディングサーバーの状態を確認。
shards
配列から除去したシャードが消えていれば確認完了です。1mongos > sh.status()
1234567891011121314151617181920212223242526272829303132333435363738394041--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5b2de11015e5c83be5461bc1")
}
shards:
{ "_id" : "shard1-rs", "host" : "shard1-rs/127.0.0.1:27011,127.0.0.1:27012,127.0.0.1:27013", "state" : 1 }
active mongoses:
"3.6.2" : 1
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 1
Last reported error: Could not find host matching read preference { mode: "primary" } for set shard1-rs
Time of Reported error: Sat Jul 14 2018 23:04:02 GMT+0900
Migration Results for the last 24 hours:
2 : Success
databases:
{ "_id" : "config", "primary" : "config", "partitioned" : true }
config.system.sessions
shard key: { "_id" : 1 }
unique: false
balancing: true
chunks:
shard1-rs 1
{ "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shard1-rs Timestamp(1, 0)
{ "_id" : "sample", "primary" : "shard1-rs", "partitioned" : true }
sample.users
shard key: { "email" : "hashed" }
unique: false
balancing: true
chunks:
shard1-rs 4
{ "email" : { "$minKey" : 1 } } -->> { "email" : NumberLong("-4611686018427387902") } on : shard1-rs Timestamp(2, 2)
{ "email" : NumberLong("-4611686018427387902") } -->> { "email" : NumberLong(0) } on : shard1-rs Timestamp(2, 3)
{ "email" : NumberLong(0) } -->> { "email" : NumberLong("4611686018427387902") } on : shard1-rs Timestamp(3, 0)
{ "email" : NumberLong("4611686018427387902") } -->> { "email" : { "$maxKey" : 1 } } on : shard1-rs Timestamp(4, 0)
今回は「MongoDB の シャードクラスタからシャードサーバーを取り除く方法」についてまとめました。 ポイントは以下の通りです。
- シャードサーバーを取り除く前に状態確認
- プライマリサーバーは
movePrimary
であらかじめ役割を移動 - シャードサーバーの除去は
removeShard
参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!