軟體公司為何要放棄MongoDB?

来源:http://www.cnblogs.com/jielesi/archive/2016/01/11/5122610.html
-Advertisement-
Play Games

本文轉至:http://database.51cto.com/art/201503/469510_all.htm(只作轉載, 不代表本站和博主同意文中觀點或證實文中信息)Olery成立於2010年,總部位於阿姆斯特丹。該初創公司為酒店行業提供聲譽管理與媒體監控工具,幫助酒店將網路評論和社交媒體反饋轉...


本文轉至:http://database.51cto.com/art/201503/469510_all.htm
(只作轉載, 不代表本站和博主同意文中觀點或證實文中信息)

Olery成立於2010年,總部位於阿姆斯特丹。該初創公司為酒店行業提供聲譽管理與媒體監控工具,幫助酒店將網路評論和社交媒體反饋轉化成可執行的商業智能分析。

Olery成立最初是使用MySQL來存儲(用戶、合同等等)核心數據,用MongoDB來存儲評論及其類似的數據(即哪些在數據丟失的情況下很容易恢復的數據)。一開始,這樣的安裝運行的非常好,然而,隨著公司的成長,開始遇到了各種各樣的問題,尤其是MongoDB的問題居多。其中一些問題是由於應用與資料庫的交互方式而引起的,一些則是由資料庫本身而產生的。

例如,某個時刻,Olery需要從MongoDB中刪除一百萬個文檔,以後再把這些數據重新插入到MongoDB里。這樣的處理方法使得整個資料庫幾乎要被鎖定數個小時,自然服務性能就會降低。而且直到對資料庫執行修複(即在 MongoDB上執行repairDatabase命令)後才會解鎖。而且完成修複還要花費數個小時,修複所花的小時數要根據資料庫的大小來確定。

在另一實例中Olery註意到應用程式的性能降低和設法跟蹤到的 MongoDB 集群。然而,經過進一步檢查,無法找到問題的真正原因。無論怎麼安裝,或使用什麼工具敲了什麼命令都找不到原因。直到Olery更換了集群的初選,性能才恢復正常。

這隻是兩個例子,Olery已經有過許多這樣的情況。這個問題的核心是,這不只資料庫在運行,而且無論何時察看它都沒有絕對的跡象表明是什麼原因導致的問題。

無模式的問題

另外,Olery面對的核心問題是mongoDB的重要特征之一:模式的缺乏。模式的缺乏可能聽起來是有趣的,並且在一些情況下是有好處的。然而,對於許多無模式存儲引擎的用法,其導致了一些模式之間的內部問題。這些模式沒有通過存儲引擎定義而是通過應用的行為及其可能的需要而定義的。

例如:你可能有一頁存儲你的應用需要的字元串類型的title欄位的集合。這兒這個模式是非常符合當前情形的,即使它沒有被明確的定義。但如果這個數據結果改變超時,尤其是如果原來的數據沒有被遷移到新的數據結構,這就成了問題(在一些無模式的存儲引擎上是相當有問題的)。例如,你可能有下麵這樣的 Ruby代碼:

  1. post_slug = post.title.downcase.gsub(/\W+/, '-'

這樣,針對每一個有“title”欄位並返回一個String的文檔,它都能正常工作。然而,對於那些使用不同欄位名字(例如:post_title)或者根本沒有標題欄位的文檔來說,它將不能正常工作。為了處理這種情況,你需要將代碼調整為下麵內容:

  1. if post.title 
  2.  
  3. post_slug = post.title.downcase.gsub(/\W+/, '-'
  4.  
  5. else 
  6.  
  7. # ... 
  8.  
  9. end 

另一種處理方法是,在你的模型中定義一個模式。例如 Mongoid,一個流行的針對Ruby的MongoDB ODM,就能讓你做到這一點。然而,當使用這些工具定義一個模式時,你可能會好奇為什麼它們不在資料庫內定義該模式。實際上,這樣做可以解決另一個問題:可重用性。如果你只有一個應用程式,那麼在代碼中定義模式並不是什麼大問題。然而,如果你有許多應用程式的話,這將很快會成為一個大麻煩。

無模式存儲引擎希望通過刪除對模式的限制的方式,讓你的工作變得更簡單。但現實的情況是,確保數據一致性的責任推到了用戶自己的身上。有時候無模式引擎可以工作,但我打賭,更多的時候是事與願違。

好資料庫的需求

有了更多的特殊需求後,迫使Olery尋求一款更好的資料庫來解決問題。對於系統,特別是資料庫,Olery非常註重以下幾點:

  • 一致性
  • 數據和系統行為的可視化
  • 正確性和明確性
  • 可拓展

一致性是重要的在於它有助於幫助Olery對系統設定明確的期望。如果數據總是按照同樣的方式存儲,那麼系統可以很方便的使用這些數據。如果在資料庫層面要求表的莫一列必須存在,那麼在應用層面就不用檢查這列數據是否存在。資料庫即使實在高壓情況下,也必須保證每一次操作的完整性。沒有什麼事情比單純的插入數據,過了幾分鐘後卻找不到數據的事更讓人沮喪了。

可見性包含了兩點:系統本身以及從中獲取數據的容易程度。如果一個系統出錯那麼應該易於調試。反過來,用戶應很容易查到想要查詢的數據。

正確性是指系統的行為如Olery所期望的那樣。如果某個欄位定義為一個數值型,沒有人可以像其中插入文本。這方面MySQL是臭名昭著,一旦你這樣做你將得到偽結果。

可擴展性不僅針對性能而言,而且也涉及財務方面和系統能夠多麼好地應對不斷變化的需求。一個系統在沒有大量資金成本或減緩系統所依賴的開發周期情況下,很難表現得非常好。

 

放棄MongoDB

上面的需求牢記於心後,Olery就開始尋找一個取代MongoDB的資料庫。上面提到的特性通常是傳統RDBM特征的一組核心集,所以Olery鎖定了兩個候選者:MySQL和PostgreSQL。

本來,MySQL是第一候選,因為Olery的一些關鍵數據已經在使用它存儲。然而,MySQL也有一些問題。例如,當將一個欄位定義為int(11)時,你卻可以輕鬆地向該欄位插入文本數據,因為MySQL會試圖對它進行轉換。下麵是一些例子:

  1. mysql> create table example ( `number` int(11) not null ); 
  2.  
  3. Query OK, 0 rows affected (0.08 sec) 
  4.  
  5. mysql> insert into example (number) values (10); 
  6.  
  7. Query OK, 1 row affected (0.08 sec) 
  8.  
  9. mysql> insert into example (number) values ('wat'); 
  10.  
  11. Query OK, 1 row affected, 1 warning (0.10 sec) 
  12.  
  13. mysql> insert into example (number) values ('what is this 10 nonsense'); 
  14.  
  15. Query OK, 1 row affected, 1 warning (0.14 sec) 
  16.  
  17. mysql> insert into example (number) values ('10 a'); 
  18.  
  19. Query OK, 1 row affected, 1 warning (0.09 sec) 
  20.  
  21. mysql> select * from example; 
  22.  
  23. +--------+ 
  24.  
  25. | number | 
  26.  
  27. +--------+ 
  28.  
  29. | 10 | 
  30.  
  31. | 0 | 
  32.  
  33. | 0 | 
  34.  
  35. | 10 | 
  36.  
  37. +--------+ 
  38.  
  39. rows in set (0.00 sec) 

值得註意的是,MySQL在這些情況下會發出警告。但是,僅僅是警告而已,它們通常(若非總是)會被忽略。

此外,MySQL的另一個問題是,任何表的修改操作(例如:添加一列)都會導致表被鎖,此時將無法進行讀或寫操作。這就意味著,使用這種表的任何操作都不得不等待修改完成之後才能進行。對於包含有大量數據的表,這可能會花費幾個小時才能完成,很可能會導致應用程式宕機。這已經導致一些公司(例如 SoundCloud)不得不自己開發工具(例如lhm)來解決該問題。

瞭解到上面的問題後,Olery開始考察PostgreSQL。PostgreSQL可以解決很多MySQL不能解決的問題。例如,PostgreSQL中你不能將文本數據插入一個數字欄位:

  1. olery_development=# create table example ( number int not null ); 
  2.  
  3. CREATE TABLE 
  4.  
  5. olery_development=# insert into example (number) values (10); 
  6.  
  7. INSERT 0 1 
  8.  
  9. olery_development=# insert into example (number) values ('wat'); 
  10.  
  11. ERROR: invalid input syntax for integer: "wat" 
  12.  
  13. LINE 1: insert into example (number) values ('wat'); 
  14.  
  15.  
  16. olery_development=# insert into example (number) values ('what is this 10 nonsense'); 
  17.  
  18. ERROR: invalid input syntax for integer: "what is this 10 nonsense" 
  19.  
  20. LINE 1: insert into example (number) values ('what is this 10 nonsen... 
  21.  
  22.  
  23. olery_development=# insert into example (number) values ('10 a'); 
  24.  
  25. ERROR: invalid input syntax for integer: "10 a" 
  26.  
  27. LINE 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一,效果圖。二,工程目錄。三,代碼。//點擊任何處,出現城市-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UIActionSheet *city=[[UIActionSheet alloc] initWithT...
  • apache ab test使用轉載自:http://www.cnblogs.com/super-d2/p/3831155.html#tophttp://blog.chinaunix.net/uid-20382003-id-3032167.html先查看一下版本信息 ab -V(註意是大寫的V)2、...
  • 2016.1.11今天學了改變PS1的顏色,怎麼增加PS1變數找到文件(.bash_profile),或者bashrc export PS1="\[\e[32;1m\]Test $PWD> \[\e[0m\]" #顯示綠色,其中Test是額外增加要顯示的內容 export PS1="\[\e[35;...
  • 一、簡介 游戲目標:在地下城的最底層取得炎多的護符項鏈(Amulet of Yendor),並返回最上層,在聖祭壇上供奉給神靈。完成整個游戲的獎賞是,玩家會成為不朽的半神。 二、安裝 1)下載源碼 http://www.nethack.org/v360/downloads.html 2)編譯安裝 c...
  • Linux安裝tomcat。
  • 安裝svn需要依賴apr和apr-util這兩個軟體,所以先安裝這兩個軟體下載安裝APRwget http://apache.fayea.com//apr/apr-1.5.2.tar.gztar -zxvf apr-1.5.2.tar.gzcd apr-1.5.2./configure --pref...
  • Linux視頻教程集:序列之一:Linux基本操作和系統管理序列之二:Linux_C編程(IO+多線程+進程管理+進程通信+網路)序列之三:C++精講精煉(語法+STL+IO編程)序列之四:Qt編程式列之五:ARM嵌入式Linux開發(ARM硬體體系+指令集彙編+Linux開發) 鏈接序列1鏈接: ...
  • 概述 SQLite提供了一系列介面供用戶訪問資料庫,主要包括連接資料庫,處理SQL,迭代查詢結果等。本文會針對我們使用SQLite的主要場景,列出核心的API,詳細介紹API的用法並給出代碼用例。1.打開關閉資料庫sqlite3_open_v2原型:int sqlite3_open_v2(cons....
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...