MongoDB在商業使用時會有丟失數據的問題么?
01-26
在設計項目架構的時候提出使用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 |