標籤:

MongoDB在商業使用時會有丟失數據的問題么?

在設計項目架構的時候提出使用mongodb存儲即時消息。

但是架構師提出mongodb會有數據丟失的問題。

依據是陳皓(左耳朵耗子)的博客:千萬別用MongoDB?真的嗎?!

請問各位在實際商業環境中是否有這類問題。

我是否應該使用mongodb存儲即時消息系統的消息。


MongoDB是很多商業公司採用的存儲解決方案,還沒聽說過有丟失數據的問題。

唯一可能導致MongoDB丟失數據的可能,就是數據寫入了MongoDB內存,但是還沒有flush到磁碟的時候,停電了,內存的數據當然丟失了。

不過,對於這種情況,完全可以對於要求可靠的寫入操作要求MongoDB返回是否已經寫入磁碟,甚至是否已經寫入多個replica set。

總之,決定是否使用MongoDB,不要考慮是否會丟失數據,而是自己的應用模型是否適合層次型的NoSQL數據。


推薦讀一讀這篇文章:MongoDB丟數據問題的分析

贊同文章裡面所說的『數據的持久化基本上是資料庫最低的要求了』。


這個問題還是要看具體的情況,沒有所有的情況都完美的解決方案,使用什麼工具也是因人而異。

結合你們的具體情況:是存儲即時消息,

1:如果是數據量達到千萬或上億的級別,我建議最好的方案還是ejabberd+MQ+HBase,比如:rabbitmq + hbase。優點是都是成熟的項目,擴展和負載都沒有問題;缺點是對項目的運維要求較高,需要熟悉erlang和hbase,尤其是hbase;

2:如果低於這個標準,方案就比較多了,ejabberd+MQ+Mysql or PostgreSQL or mongodb,都沒有問題,必要的話加入redis,都是比較成熟的解決方案。

但是實際使用情況下,切記好高騖遠,最好還是結合實際情況,逐漸積累使用經驗,先採取自己熟悉的開發環境和工具,等到你發現系統瓶頸時,優化也不遲。

就我們目前的使用情況看,mongodb使用最大的問題是在高負載的情況下,io壓力比較大,每天的寫操作超過了數千萬次,cpu會居高不下,如果寫操作太重,可以考慮tokumx,當然tokumx 也不是完美的,也有不少缺點。

至於丟失數據的問題,關鍵還是開發人員的問題,HBase也不能保證100%的寫安全,在這點上,mongodb和Hbase都不如cassandra和RDBMS,架構設計的合理,mongodb還是很安全,方便的,結合主從和必要錯誤判斷,基本能杜絕數據丟失的問題。

至於上面提到的mongodb的問題,其實任何的方案都會出現這樣那樣的問題,都要做到提前預防,關鍵還是人的問題。


所謂丟數據,可以分為三種,一種是你以為寫成功了,實際上沒有成功,數據"丟"了;第二種是數據的確寫成功了,但是因為某種原因查不到;第三種是"真丟了".

在mongod中,第一種丟數據,可以用安全寫保證,即每次寫完調getLastError.

第二種也有發生,即在主從延遲的情況下發生主從切換,舊主領先新主的數據會被回滾,存儲在主的數據文件rollback文件夾下,此時數據丟失,你可以選擇手工恢復.

第三種沒有發現過.


天真無邪,正用mogo


推薦閱讀:

微軟校園Hackathon南京站 無駭客 不青春
煎蛋段子爬蟲prototype
MongoDB的安裝和配置
MongoDB 存儲引擎 mongorocks 原理解析

TAG:MongoDB |