MognoDB の シャードクラスタ から シャードサーバー を取り除く 方法

0 件のコメント

今回は「MongoDB の シャードクラスタからシャードサーバーを取り除く方法」についてまとめます。

概要

今回は何かしらの理由でシャードサーバーを取り外したいときの手順についてまとめました。 単純に removeShard を実行すればできるか…と言われるとそうではなかったので、その注意点も含めてまとめました。

手順

基本的には以下の手順でシャードクラスタから任意のシャードサーバーを取り除けます。

  1. バランサーが有効であることを確認。

    mongos > sh.getBalancerState()
    
  2. 取り除くシャードサーバー情報の確認

    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)
    
  3. admin データベースへスイッチ。

    mongos > use admin
    
  4. 取り除きたいシャードサーバーから 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)
    }
    
  5. シャードクラスタからシャードサーバーを除去。

    取り除きたいシャードサーバーの _id を指定して addminCommand({ removeShard: [シャードID] }) を実行します。

    mongos > db.adminCommand( { removeShard: "shard2-rs" } )
    
  6. ステータスの確認。

    正常終了していれば 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)
    }
    
"you need to drop or movePrimary these databases" エラー

シャーディングサーバーを除去しようとすると上記のようなエラーが発生するときがあります。 これはシャーディングのプライマリサーバーを取り除こうとしているからで、以下のようなエラーが発生します。 手順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() でも除去可能であることを確認します。

  1. mongos に接続。

    mongos 127.0.0.1:8000
    
  2. シャーディングサーバーの状態を確認。

    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 の フォロー」 お願いします!!