2014-01-25 21 views
0

編輯: 有看這裏向Mongo的「本地」數據庫寫入數據時是否還有其他注意事項?

寫作爲「本地」的幾個點是一個合法的技術 - 從「MongoDB的權威指南,第二版」和http://www.kchodorow.com/blog/2010/10/27/bending-the-oplog-to-your-will/

這數據庫將永遠不會被複制,並且可以用來存儲任何 收藏,應該是當地的一臺服務器

寫入「本地」是不是一個好主意 - 從https://jira.mongodb.org/browse/SERVER-11670https://groups.google.com/forum/#!topic/mongodb-user/E_aPgNR1zss

這是不正常寫任何東西到本地數據庫 - 它是 MongoDB的用途和使用它的用戶集合(避免複製 他們)不保證爲不引起問題

它可能是也可能不是一個好主意 - 在http://docs.mongodb.org/manual/reference/local-database/文件是不可知


原帖:

寫上我的蒙戈2.4.9安裝(Windows和Linux版本)數據到「本地」 DB的100MB時,我遇到錯誤。

這個bug(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安裝的輕微日誌修改

+0

本地數據庫僅用於MongoDB複製和其他內部跟蹤。一般來說,寫入'local'數據庫不是一個好主意,特別是如果這是副本集的主要部分。你從哪裏讀到這是一種合法的技術? – Stennie

回答

0

您是否在副本集中運行?如果是這樣,您看到寫入的原因被阻止,所有其他線程需要寫入oplog,這將需要獲取本地數據庫上的寫入鎖定。

讀取代碼,它看起來像MongoDB將嘗試提交插入線程上的數據,如果未提交的數據量超過某個閾值,但不會這樣做,如果您使用本地數據庫或管理數據庫。因此,當您反覆嘗試寫入本地數據庫並且MongoDB想要插入線程提交數據時,執行這些本地數據庫寫入的線程可能會發生顛簸。

假設您有其他線程正在寫入,我懷疑,可能的解決方法是在出現此錯誤時暫時休眠以使另一個線程有機會在未保留本地數據庫的情況下提交日誌。但這是通過閱讀代碼的猜測。

+0

我的計劃是在副本集上運行,但我現在仍在單個實例上測試整個工作流。客戶端代碼實際上沒有得到任何錯誤 - 它只是掛在套接字上,我認爲 - 所以我不能做任何錯誤檢測和睡眠等等。好主意,但。 –

0

local數據庫僅用於MongoDB複製和其他內部跟蹤。在

按阿霞的評論SERVER-11670

不管這個票,這是不正常寫任何東西到本地數據庫 - 它是MongoDB的用途和使用它的用戶集合(避免複製它們)不能保證不會造成問題(比這個問題你已經碰到了其它的)。「

在這個問題上,她是在試探聚集的新$out功能對OPLOG,這就是爲什麼受影響的版本爲2.5 .3(開發/不穩定)和fixVersion是不確定的泰恩。

如果你想寫一個不會被複制的數據,你最好的辦法是設置一個單獨的獨立mongod實例。沒有(如在MongoDB 2.4中)支持的方式將您自己的非複製數據存儲在副本集部署中。

+0

在我將這個問題發佈到SO之後,我看到了對我的評論的迴應 - 您不能將用戶數據寫入本地的想法對我來說是全新的,並且我沒有被我讀過的文檔支持。我錯過了其他一些文檔嗎? –

+0

@EdNorris:我認爲有一個相當主觀的區別。技術上你*可以*寫入'本地'數據庫(沒有什麼能夠阻止你這麼做)。實際上,這不是經過測試或支持的配置,因此這樣做可能會導致意外問題(例如您在此處報告的內容)。根據我的經驗,這肯定比問題更有幫助,我不建議寫入生產中的「本地」數據庫。 – Stennie

+0

@EdNorris:同樣值得注意的是,Asya和我都爲MongoDB,Inc工作,所以我們的觀點是基於客戶體驗。如果寫入「本地」數據庫適用於您的用例,那很好......但我認爲這不是一個好的或可推薦的想法(即,解決您的問題「應該預計這樣做會沒有錯誤」) 。 – Stennie

相關問題