CouchDB與MySQL的選擇
最近,一家提供云端運行 Selenium 測試的公司 Sauce Lab 在其官方博客上發表了一篇博客《告別 CouchDB》,根據自身云平臺的案例,介紹了為何在當初選擇 CouchDB,而又在現在轉而選擇 MySQL 的詳細過程。在如今 NoSQL 大行其道的時候,Sauce Lab 為何又要告別 NoSQL,轉而投入傳統關系數據庫的懷抱呢?
在這篇博客中,作者 Steven Hazel 首先介紹了在項目開始之初,決定選擇 CouchDB 的原因。一方面,他們廣泛認同 NoSQL 在將來的前景,并對此充滿了投身其中的技術熱情;另一方面,則主要是從技術角度進行了選型決策。原因包括:
- Sauce Lab 的云端自動化測試平臺通過 REST API 存儲數據,而 CouchDB 本身提供了豐富的 REST API;
- 系統對數據庫的 IO 需求很低,并且是水平伸縮(horizontally scalable)的;
- 系統對數據的準確性要求不高(Fault-tolerant);
然而隨著公司規模的增長,隨著越來越多的客戶開始使用這一自動化測試平臺,最初做出選型決策的前提條件已經發生了顯著變化。首先,隨著時間的推移,為了滿足日益增長的用戶量,系統需要按照用戶對數據進行分區;而產品也開始逐漸依賴于數據庫的 IO 性能。系統提供的服務對數據可靠性的要求遠高于一般 Web 應用系統的平均水平。例如,一個單獨的請求失敗,就會影響到客戶提交的一個測試,進而引起整個構建的失敗。此時,使用 CouchDB 面臨的數據可靠性就成了系統的關鍵問題。作者提到,雖然公司考慮過對一些硬件和軟件的調整,并力圖改變使用 CouchDB 的方式,但效果并不明顯,最后還是決定改弦易轍,決定改用關系型數據庫 MySQL。
Steven Hazel 在博客中介紹了他們使用 CouchDB 時所面臨的問題。例如在可用性方面,在最初使用 CouchDB 時,緩慢的磁盤性能使得數據庫在執行查詢時,常常發生周期性失敗。即使改為使用更加快速的 RAID,在隨著負載增加后,這一問題依舊如幽靈般重現。而選用 MySQL 的 Percona,由于運行的 mysqld 進程很少訪問 CPU,而數據庫提供的 cache 非常有效,以至于可以達到最少的磁盤讀取訪問。CouchDB 常常會發生視圖丟失索引的情況,除非刪除視圖文件并重啟數據庫,否則很難做到重新索引。有時候,一些被破壞的視圖會導致所有視圖無法正常工作,除非將這些被破壞的視圖徹底移除。對數據的壓縮有時候會失敗,并且只有將這些失敗的壓縮文件刪除后才能正常工作。
在性能方面,Steven 也認為 CouchDB 與 MySQL 相比并無明顯優勢。而維護性方面帶來的問題,更是困擾著他們。因為 CouchDB 一旦失敗,就要終止所有正在運行的查詢,甚至包括數據復制與壓縮,這就使得他們還要編寫腳本去檢查這些進程,保證在必要時重啟進程。視圖索引只能在查詢時更新,卻無法在插入記錄時更新索引。這意味著需要編寫腳本定期運行所有的視圖,否則就會影響到查詢的性能。
在決定放棄 CouchDB 時,Sauce Lab 的工程師也曾經考慮過選擇 MongoDB 或其他 NoSQL 產品。然而經過對技術方案的分析與探索后,最終認為 MongoDB 存在與 CouchDB 相似的問題;而有的 NoSQL 產品與 CouchDB 的差異,甚至大于它與 MySQL 的差異,這會給整個架構遷移帶來困難。考慮到工程師們都具有豐富的 MySQL 經驗,并且它完全能夠滿足系統需要,因此這樣的選擇也就顯得順理成章。
在這篇博客中,作者并不諱言 MySQL 自身存在的問題,例如在數據庫配置,查詢引擎以及基于 SQL 的特性;也沒有故意貶低 CouchDB,并在博客中列舉了 CouchDB 的諸多好處,例如非關系型,無樣式(No schemas),以及它提供的 HTTP API,數據一致性,支持 Javascript 作為查詢語言等特性。
作者還簡要介紹了整個遷移的過程。他們對架構進行重新設計,抽取了抽象的數據層,并采用了逐步遷移數據庫的形式。通過將 CouchDB 模型層導入到 MySQL 中,以降低遷移對代碼庫的影響。即使遷移到 MySQL 中,他們也避免使用外鍵,join 以及多語句的事務。這是出于水平伸縮的考慮。他們還為每個數據表提供了一個 TEXT 列,用以存儲 JSON。雖然這并不能很好地與 MySQL 的特性結合,但帶來的好處在于系統能夠更好地使用 JSON,從而體會到無樣式數據庫帶來的樂趣。
無論 NoSQL 與關系型數據庫的爭執如何,我們都必須看到這兩種類型的數據庫各有其適用的場景,甚至可以看到二者互相融合的趨勢。這篇博客結合現實的案例表達了另一種觀察視角,理智地根據自身項目的需求,做出了最符合項目需要的技術決策。這種不浮躁、不盲目、不人云亦云的架構決策思想,才是值得我們認真思考和借鑒的。