質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.09%

mongodb シャード間のデータ移動の再開について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 883

score 13

 前提・実現したいこと

mongodbでsharding環境にて
sh.enableSharding("コレクション名")を実行し
データがシャード1→シャード2と移動している最中に
サーバーを停止させました。

サーバーおよび、mongodbを再起動させたら
自然とシャード間のデータの移動が再開するのかと思ったのですが、
何も変化がありません。

どうすれば、再開するのでしょうか?
手動でchunkを移動させる方法もあるようですが、
できれば自動で移動させたいです。

 発生している問題・エラーメッセージ

collection.aはサーバー停止前にデータの移動が完了していたので、
shard-1,2のchunks数がほぼ同じですが、
collection.bは移動中にサーバーが停止したため、chunks数の差が大きいです。

ドキュメントではこのような場合、自動でchunks数が同じとなるように
処理すると思ったのですが、特に変化がありません。

mongos> sh.status()
--- Sharding Status ---
  sharding version: {
  }
  shards:
        {  "_id" : "shard-1",  "host" : "【略】",  "state" : 1 }
        {  "_id" : "shard-2",  "host" : "【略】",  "state" : 1 }
  active mongoses:
        "3.6.7" : 1
  autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes
        Currently running:  no
        Failed balancer rounds in last 5 attempts:  0
        Migration Results for the last 24 hours:
                1756 : Failed with error 'aborted', from shard-1 to shard-2
  databases:
        {  "_id" : "config",  "primary" : "config",  "partitioned" : true }
                config.system.sessions
                        shard key: { "_id" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                shard-1    1
                        { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shard-1 Timestamp(1, 0)
        {  "_id" : "xxxxx",  "primary" : "shard-1",  "partitioned" : true }
                collection.a
                        shard key: { 【略】 }
                        unique: false
                        balancing: true
                        chunks:
                                shard-1    48
                                shard-2    47
                        too many chunks to print, use verbose if you want to force print
                collection.b
                        shard key: { 【略】 }
                        unique: false
                        balancing: true
                        chunks:
                                shard-1    670
                                shard-2    349
                        too many chunks to print, use verbose if you want to force print
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

あるわけでチャンク移動は毎回エラーしているみたいです。

Migration Results for the last 24 hours:
1756 : Failed with error 'aborted', from shard-1 to shard-2

最近の24時間で1,756同じabortが生じたそうです。調べないとなおらないです。二か所で同じくらいの情報あります。

1."config"`データベースのchangelogコレクションの詳細で分かるかもしれない。

これでちょっとナビして下さい。

db.getSiblingDB("config").changelog.find().sort({"time": -1}).limit(3).pretty()
db.getSiblingDB("config").changelog.aggregate([{$group: {"_id": "$what", "count": {"$sum": 1}}}, {"$sort": {"_id": 1}}])

あなたが気にするは"what"=="moveChunk.*"のログドキュメント。もし私が正確に覚えていれば とくにmoveChunk.toとmoveChunk.fromのドキュメントでエラーが見える。

db.getSiblingDB("config").changelog.find({"what": /^moveChunk.*/}).pretty().sort({"time": -1})
db.getSiblingDB("config").changelog.find({"what": /^moveChunk\.[tf].*/, "details.note": "aborted"}).pretty()

2.toもfromシャードのプライマリーmongodとconfigsvrレプリカセットのプライマリーのログファイルで「SHARDING」をgrepしてください。例えば

grep "SHARDING" mongod.log | grep aborted


あるいは
... | grep error
など。

何か見つかったら多分ウェブ検索で早めに本当の原因と解決しかた分かるかもしれない。そうじゃない場合はここでもう一つのQA質問を投稿してもいいでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/27 10:20

    回答ありがとうございます。
    停止しているのではなく、移動させようとして失敗していたのですね。
    ご指摘の内容を確認してみます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る