0

編集:ここにはいくつかの視点があります

「ローカル」への書き込みは正当な手法です- 「MongoDB: The Definitive Guide, 2nd. ED」およびhttp://www.kchodorow.com/blog/2010/10/27/bending-the-oplog-to-your から-意思/

このデータベースは複製されることはなく、単一のサーバーに対してローカルである必要があるコレクションを格納するために使用できます

「ローカル」への書き込みは決して良い考えではありません- https://jira.mongodb.org/browse/SERVER-11670およびhttps://groups.google.com/forum/#!topic/mongodb-user/E_aPgNR1zssから

ローカル データベースに何かを書き込むことは許可されていません。これは MongoDB で使用するためのものであり、(複製を避けるために) ユーザー コレクションに使用しても問題が発生しないとは限りません。

それは良い考えかもしれませんし、そうでないかもしれません- http://docs.mongodb.org/manual/reference/local-database/のドキュメントは不可知論的です


元の投稿:

Mongo 2.4.9 インストール (Windows と Linux の両方のバージョン) で「ローカル」DB に約 100MB のデータを書き込むときにエラーが発生します。

このバグ ( https://jira.mongodb.org/browse/SERVER-11670 ) は私の問題に似ているように見えますが、データベースへの書き込みにランダムに失敗することが小さな問題であるとは信じられません。 2.7までオフ。だからそれは私でなければなりません。

とにかく、Windows エラーは次のようになります。

Fri Jan 24 15:59:11.551 [conn40] mongod.exe    ...\src\mongo\util\stacktrace.cpp(167)                           mongo::printStackTrace+0x3e
Fri Jan 24 15:59:11.551 [conn40] mongod.exe    ...\src\mongo\db\dur.cpp(277)                                    mongo::dur::DurableImpl::_aCommitIsNeeded+0xe8
Fri Jan 24 15:59:11.551 [conn40] mongod.exe    ...\src\mongo\db\instance.cpp(812)                               mongo::insertMulti+0x212
Fri Jan 24 15:59:11.551 [conn40] mongod.exe    ...\src\mongo\db\instance.cpp(875)                               mongo::receivedInsert+0xaff
Fri Jan 24 15:59:11.552 [conn40] mongod.exe    ...\src\mongo\db\instance.cpp(441)                               mongo::assembleResponse+0x57a
Fri Jan 24 15:59:11.552 [conn40] mongod.exe    ...\src\mongo\db\db.cpp(194)                                     mongo::MyMessageHandler::process+0xfa
Fri Jan 24 15:59:11.552 [conn40] mongod.exe    ...\src\mongo\util\net\message_server_port.cpp(207)              mongo::PortMessageServer::handleIncomingMsg+0x578
Fri Jan 24 15:59:11.552 [conn40] mongod.exe    ...\src\third_party\boost\libs\thread\src\win32\thread.cpp(180)  boost::`anonymous namespace'::thread_start_function+0x21
Fri Jan 24 15:59:11.552 [conn40] mongod.exe    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\threadex.c(314)      _callthreadstartex+0x17
Fri Jan 24 15:59:11.552 [conn40] mongod.exe    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\threadex.c(292)      _threadstartex+0x7f
Fri Jan 24 15:59:11.553 [conn40] kernel32.dll                                                                   BaseThreadInitThunk+0xd
Fri Jan 24 15:59:11.553 [conn40] ERROR: can't commitNow from commitIfNeeded, as we are in local db lock

Linux エラーは次のようになります。

Sat Jan 25 00:20:04.558 [conn19] ERROR: can't commitNow from commitIfNeeded, as we are in local db lock
0xde46e1 0x921a65 0x921b4c 0x9f8b15 0x9f9412 0x9ffd68 0x6e8518 0xdd0cae 0x7f0cd72d8ddb 0x7f0cd667ca1d
 /usr/bin/mongod(_ZN5mongo15printStackTraceERSo+0x21) [0xde46e1]
 /usr/bin/mongod(_ZN5mongo3dur11DurableImpl16_aCommitIsNeededEv+0x155) [0x921a65]
 /usr/bin/mongod(_ZN5mongo3dur11DurableImpl14commitIfNeededEb+0x4c) [0x921b4c]
 /usr/bin/mongod(_ZN5mongo11insertMultiEbPKcRSt6vectorINS_7BSONObjESaIS3_EERNS_5CurOpE+0x45) [0x9f8b15]
 /usr/bin/mongod(_ZN5mongo14receivedInsertERNS_7MessageERNS_5CurOpE+0x862) [0x9f9412]
 /usr/bin/mongod(_ZN5mongo16assembleResponseERNS_7MessageERNS_10DbResponseERKNS_11HostAndPortE+0xab8) [0x9ffd68]
 /usr/bin/mongod(_ZN5mongo16MyMessageHandler7processERNS_7MessageEPNS_21AbstractMessagingPortEPNS_9LastErrorE+0x98) [0x6e8518]
 /usr/bin/mongod(_ZN5mongo17PortMessageServer17handleIncomingMsgEPv+0x42e) [0xdd0cae]
 /lib64/libpthread.so.0(+0x7ddb) [0x7f0cd72d8ddb]
 /lib64/libc.so.6(clone+0x6d) [0x7f0cd667ca1d]

エラーは断続的に発生しますが、通常は 30 ~ 90 秒間ブロック単位で発生し、その間はデータを書き込むことができません。データを書き込むプロセスを強制終了する必要が何度かありました。

データといえば、私は約 750,000 のかなり単純なドキュメント (少数の文字列と小さな埋め込みドキュメント) を書いています。ユーザー指定のインデックスはなく、_id のデフォルトのインデックスのみです。

エラーなしで「ローカル」データベースに書き込めると期待できますか? これは、レプリケートしたくないデータに対する正当な手法であると読みました。

これに対する回避策はありますか? 特別な構成設定? Windows のインストールには既定の構成を使用し、Linux のインストールにはわずかなログ変更を使用しています。

4

2 に答える 2

0

レプリカ セットで実行していますか? その場合、書き込みがブロックされているのは、他のすべてのスレッドが oplog に書き込む必要があり、ローカル DB の書き込みロックを取得する必要があるためです。

コードを読むと、MongoDB は、コミットされていないデータの量が特定のしきい値を超えると、挿入スレッドでデータをコミットしようとするように見えますが、ローカル DB または管理 DB を使用している場合はそうしません。そのため、ローカル DB への書き込みを繰り返し試行し、MongoDB がデータをコミットする挿入スレッドを必要とする場合、これらのローカル DB 書き込みを実行するスレッドがスラッシングする可能性があります。

他のスレッドが書き込みを行っていると仮定すると、可能な回避策は、このエラーが発生したときに短時間スリープして、ローカル DB を保持せずにジャーナルをコミットする機会を別のスレッドに与えることだと思います。しかし、これはコードを読んだ推測です。

于 2014-01-25T01:39:57.370 に答える
0

このlocalデータベースは、MongoDB レプリケーションおよびその他の内部追跡に使用することのみを目的としています。

SERVER-11670に関する Asya のコメントによると:

このチケットに関係なく、ローカル データベースに何かを書き込むことは問題ありません。これは MongoDB で使用するためのものであり、(複製を避けるために) ユーザー コレクションに使用しても問題が発生しないとは限りません (既に遭遇したこの問題以外)。 .」。

この号では、彼女は$outoplog に対して集約の新機能をテストしていました。そのため、影響を受けるバージョンは 2.5.3 (開発/不安定) であり、fixVersion は不明です。

レプリケートされないデータを書きたい場合は、別のスタンドアロンmongodインスタンスをセットアップすることをお勧めします。(MongoDB 2.4 のように) レプリケートされていない独自のデータをレプリカ セットのデプロイに保存する方法はサポートされていません。

于 2014-01-26T00:51:54.240 に答える