今回は「MongoDB の シャードクラスタからシャードサーバーを取り除く方法」についてまとめます。
概要
今回は何かしらの理由でシャードサーバーを取り外したいときの手順についてまとめました。
単純に removeShard
を実行すればできるか…と言われるとそうではなかったので、その注意点も含めてまとめました。
手順
基本的には以下の手順でシャードクラスタから任意のシャードサーバーを取り除けます。
-
バランサーが有効であることを確認。
mongos > sh.getBalancerState()
-
取り除くシャードサーバー情報の確認
sh.status()
を実行して、取り除きたいシャードサーバーの shards._id 、 databases.primary を確認します。 特にdatabases.primary
に取り除きたいシャードサーバーがある場合、すぐにはシャードサーバーを取り除けないのでよく確認します。 今回はshard2-rs
を取り除きます。mongos > sh.status()
--- 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
データベースへスイッチ。mongos > use admin
-
取り除きたいシャードサーバーから primary データベースを削除。
取り除きたいシャードサーバーが primary 設定されたデータベースが存在している場合、
addminCommand({ movePrimay: [データベース], to: [シャードID] })
を実行して primary サーバーを移動させます。mongos > db.adminCommand( { movePrimary: "sample", to: "shard1-rs" } )
{ "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] })
を実行します。mongos > db.adminCommand( { removeShard: "shard2-rs" } )
-
ステータスの確認。
正常終了していれば
state: "completed"
となります。mongos > db.adminCommand( { removeShard: "shard2-rs" } )
{ "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
を実行することで回避できます。
エラー例
{ "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 に接続。
mongos 127.0.0.1:8000
-
シャーディングサーバーの状態を確認。
shards
配列から除去したシャードが消えていれば確認完了です。mongos > sh.status()
--- 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 の フォロー」 お願いします!!