別再用MongoDB了!
Sven Slootweg (joepie91) 是一名 駭客 ,同時也是 CrytoCC 的建立者,現在提供 Node.js程式碼檢閱服務 。近日,他在個人部落格上發表了一篇博文《 為什麼你應該永遠、永遠、永遠不要再使用MongoDB 》。在文中,他列舉了如下理由:
- 遺失資料(見 1 、 2 );
- 預設忽略錯誤,假設每次寫入都是成功的,在32位系統上,這可能會導致資料無聲無息地丟失;
- 即使是在MongoDB宣傳的適用情境下,其效能依然不高(見 3 、4);
- 幾乎在所有的應用情境下,開發人員都會被迫養成使用隱式模式的壞習慣(見4);
- 存在鎖問題(見4);
- 對安全問題響應很慢(見 5 );
- 不符合ACID(見 6 );
- 擴充和維護困難;
- JSON儲存也不是MongoDB專屬的功能,PostgreSQL、CouchDB也支援(見 7 、 8 )。
joepie91認為,MongoDB不僅存在諸多問題,而且並無突出之處。如果項目涉及使用者賬戶或者兩條記錄之間存在某種關係,那麼就應該使用關係型資料庫,而不是文檔儲存;如果項目在使用 Mongoose ,那麼也應該使用關係型資料庫,因為Mongoose只是使用文檔儲存類比了有模式的關係型資料庫。因此,大多數情況實際上需要的都是一個關係型資料庫。 在這些情況下,PostgreSQL是個不錯的可選方案。開發人員可以使用查詢構建器或ORM來簡化使用過程,比如,在Node.js中,可以選用 Knex 、 Bookshelf 、 Sequelize 或 Waterline 。即使真得需要一個文檔儲存,那麼也有 比MongoDB更好的選項 。另外,他也不認為MongoDB適合於建立原型,因為如果生產環境使用不同的資料庫,則還需要重寫所有的代碼。總之,MongoDB並沒有什麼適用場 景。它在技術上比不上其它可選方案,並沒有提供真正有用的專屬的特性,而且開發人員也無法確保資料一致性和安全。最後,joepie91指出,流行度並不 等同於品質,只能說明產品有一個不錯的市場團隊:
永遠不要因為“其他人那樣做”就使用一個資料庫,對於一個特定的資料庫,要自己研究它的優點和不足。
joepie91的觀點 在Hack News上 得到了廣泛的贊同。網友karmakaze也認為,有了PostgreSQL 9.4,就沒有任何理由要使用MongoDB了(JSONB比BSON更合用),另外還可以使用CouchDB。對於MongoDB的具體限制,網友 giaour建議閱讀aphyr的系列文章 Call Me Maybe ,並指出,雖然存在已知的變通方案,但那大大降低了MongoDB的開發體驗。網友Animats認為,如果網站的流量比維基小,那麼使用某種關係型資料庫就可以了。網友PebblesHD有類似的觀點:
作為一個規模較小的部署……,只安裝一個基本的MySQL有什麼問題嗎?在我們的內部維基上,我們每天的訪問量已經超過了2萬次……
但是也有一些不同的聲音。例如,網友threeseed就表示,MongoDB仍然是最容易安裝和使用的資料庫之一。對此,joepie91回複如下:
以錯誤的方式做事,想不容易都難——MongoDB恰好就是那麼做的。它不需要設定身分識別驗證或表模式,因此才看上去“易於安裝”。但實際上,為了節省10分鐘,你正在浪費幾個小時的時間。因為稍後,你將會遇到入侵(沒有身分識別驗證)或資料破壞……
Shodan 的 報道 也佐證了joepie91的這一說法,互連網上有將近3萬個MongoDB執行個體沒有啟用任何的身分識別驗證。這個問題隨處可見,而且已經存在多年。
網友toyg則評論說:
我最近首次使用了MongoDB,是在一個內部項目裡。我認為,沒有模式確實顯著了提升了開發速度……現在項目已經成熟,回過頭來,我可以看到 為什麼關係型資料庫會更合適,但如果我從開始就使用RDBMS,那麼我可能無法這麼快地完成遷移。雖然切換到真正的RDBMS意味著要修改三兩個類,但變 化不大。所以,我不同意MongoDB不適合原型開發的說法。
joepie91對“修改三兩個類,但變化不大”的說法提出了質疑,因為根據自己從事代碼審查的經驗,遷移到不同的資料庫通常需要大量的工作。至於切換速度,joepie91指出,在一個有復原機制的系統中,可能會更快。
然而,在有些情況下,開發人員並沒有其它選擇。例如,有網友就提出, Meteor 就使用而且只能使用MongoDB。而由於同Hadoop的夥伴關係,MongoDB同Hadoop有很好的整合,因此,它在大資料分析領域非常流行。
另外,來自 SourceGear 的軟體開發人員Eric Sink在讀過的joepie91文章之後 表示 :
(他所列舉的內容)部分(也許全部)確有其事。事實上,現在,就假設他所寫的都是正確的。我這裡不是要說作者是錯的。更確切地說,我這裡想指出的是,這種博文只能讓我瞭解很少有關MongoDB的知識,但卻讓我感受到了寫這篇博文的人的許多情感。
他覺得,不能因為那些問題就徹底地否定MongoDB,畢竟:
MongoDB是頂級的NoSQL供應商。每天,成千上萬的企業用它為數以百萬計的使用者提供服務。像所有有大量使用者的新生軟體一樣,它有漏洞和缺陷。但它正穩步改善。任何有關技術缺陷的討論,如果無助於解決問題,那麼很大程度上只能是一種情緒的宣洩。
MongoDB 3.0 正式版發布下載
CentOS編譯安裝MongoDB
CentOS 編譯安裝 MongoDB與mongoDB的php擴充
CentOS 6 使用 yum 安裝MongoDB及伺服器端配置
Ubuntu 13.04下安裝MongoDB2.4.3
MongoDB入門必讀(概念與實戰並重)
Ubunu 14.04下MongoDB的安裝指南
《MongoDB 權威指南》(MongoDB: The Definitive Guide)英文文字版[PDF]
Nagios監控MongoDB分區叢集服務實戰
基於CentOS 6.5作業系統搭建MongoDB服務
MongoDB 的詳細介紹:請點這裡
MongoDB 的:請點這裡
本文永久更新連結地址: