今月も既に中旬となってしまいましたが、今月初めてのブログ更新です。
役職が付くようになり、今まで自分が行なっていた仕事を他に振るようになったので、以前に比べてプログラミングする量がかなり減って多少焦っているところです。
今回は、fluentd経由でMongoDBにログを400万件ほど挿れていたところ、「8011: tried to insert object with no valid shard key」というエラーが出てかなりハマったのでログとして残しておきます。
foward先としてリモートに設置したfluentdのログに下記のようなものが出ていました。
2012-06-11 21:33:18 +0900: failed to flush the buffer, retrying. error="8011: tried to insert object with no valid shard key" instance=70320056203900 2012-06-11 21:33:18 +0900: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/mongo-1.6.2/lib/mongo/networking.rb:95:in `send_message_with_safe_check' 2012-06-11 21:33:18 +0900: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/mongo-1.6.2/lib/mongo/collection.rb:979:in `block in insert_documents' 2012-06-11 21:33:18 +0900: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/mongo-1.6.2/lib/mongo/util/logging.rb:36:in `instrument' 2012-06-11 21:33:18 +0900: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/mongo-1.6.2/lib/mongo/collection.rb:977:in `insert_documents' 2012-06-11 21:33:18 +0900: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/mongo-1.6.2/lib/mongo/collection.rb:353:in `insert' 2012-06-11 21:33:18 +0900: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/fluent-plugin-mongo-0.6.7/lib/fluent/plugin/out_mongo.rb:139:in `operate_invalid_records' 2012-06-11 21:33:18 +0900: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/fluent-plugin-mongo-0.6.7/lib/fluent/plugin/out_mongo.rb:118:in `operate' 2012-06-11 21:33:18 +0900: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/fluent-plugin-mongo-0.6.7/lib/fluent/plugin/out_mongo.rb:106:in `write' 2012-06-11 21:33:18 +0900: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/fluentd-0.10.22/lib/fluent/buffer.rb:274:in `write_chunk'
no valid shard keyと書かれているのでてっきりshard keyに不正な値でも指定してしまったのかなと思い、そこばかり探していたんですが、似たような現象にあったブログもあまり見つからなかったので、ローラー作戦的に挿入するドキュメントの内容をshard keyのみから始まり、徐々に増やしていくことにしました。そこで、一番最初にshard keyのみで挿入したところ、正常に処理できたので、shard key自体が問題ではないんだなと思いました。徐々に増やしていった結果、あるキーに対する値が変に文字化けを起こしており、それが原因で当エラーが発生していたようです。そのキーを外したところ、正常に処理されました。
今回はあまり時間がなかったので直接的な原因は調べられていませんが、一段落着いたら調べてみたいと思います。
また、少し気になった動作として挿入できなかった場合にリトライするような設定になっているんですが、リトライする単位はchunkだと思うのですが、chunk内で異常なデータを含まないものに関しては重複して挿入されているような気がします。(プログラム側から指定した以上の件数が挿入されていたため)コレを防ぐ方法があるのかどうかはまだ分かりませんが・・・。
環境
MongoDB: 2.0.6
fluentd: 1.1.6