磊哥評測之資料庫:騰訊雲MongoDB vs自建

来源:https://www.cnblogs.com/qcloud1001/archive/2019/02/26/10436381.html
-Advertisement-
Play Games

本文由雲+社區發表 作者:磊哥 上期文章我們聊到了redis。這期我們來說說另一個網紅nosql資料庫:MongoDB。有這麼一個介紹MongoDB的說法是:MongoDB是非關係資料庫當中功能最豐富,最像關係資料庫的。這麼說是因為作為一個面向文檔存儲型、數據結構非常鬆散自由的的資料庫,卻擁有著豐富 ...


本文由雲+社區發表

作者:磊哥

上期文章我們聊到了redis。這期我們來說說另一個網紅nosql資料庫:MongoDB。有這麼一個介紹MongoDB的說法是:MongoDB是非關係資料庫當中功能最豐富,最像關係資料庫的。這麼說是因為作為一個面向文檔存儲型、數據結構非常鬆散自由的的資料庫,卻擁有著豐富的功能特性如強大靈活的查詢語言、支持二級索引等特性,新版本的MongDB甚至還支持事務。聽小伙伴說MongoDB不僅功能豐富,而且讀性能強大到遠遠把MySQL甩在後面,今天我就代替大家來動手進行一下資料庫測試,揭開MongoDB的神秘“面紗”。

為了進行資料庫對比測試,這次我購買了騰訊雲MongoDB的主從版(1主2從),同時在同樣配置的雲主機自建MongoDB作為對比。

img

下麵給出CentOS7 64位上安裝MongoDB 3.6的實踐如下:

vim /etc/yum.repos.d/mongod-org.repo

編輯內容如下:

[mongodb-org]

name=MongoDB Repository

baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/

gpgcheck=1

enabled=1

gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc

執行指令yum install mongodb-org -y安裝

vim /etc/mongod.conf

此處根據自己需求修改bindIp: 0.0.0.0 #監聽地址 port: 27017 #監聽埠

systemctl start mongod.service #開啟服務

netstat -anpt | grep 27017 #檢查是否啟動

服務開啟後可以使用上面的指令測試服務是否啟動,如果成功啟動的話會看到結果如下圖所示:

img

如果無法啟動,需要根據日誌分析具體原因。根據筆者的實踐,大部分的原因會落在配置和許可權上。如果排除錯誤太難,建議重新安裝來的快一點。

接下來需要安裝資料庫測試工具,這次我們使用YCSB,雅虎開發的一個很強大的測試工具。

在安裝YCSB前需要安裝Java和Maven,測試前需要在workloads文件夾中創建配置文件,配置如下圖所示:

img

考慮到購買的mongoDB是副本集配置,一個主節點帶兩個從節點,我們在本地也配置好副本集群,使用用 ./mongod --replSet amymongo --dbpath /data/27019 --port 27019 --logpath /var/log/mongodb/27019.log --fork 配置從節點,具體配置和初始化方法參考https://cloud.tencent.com/developer/article/1379231(當然部署在本機的方案不能保證高可用)

在workloads中防止配置文件,我們選擇插入1千萬條記錄,執行1千萬次操作,測試兩種場景:read/update 9:1和純insert場景。

廢話少說,下麵就一起來看看測試結果吧。

場景讀更新read/update 9:1,單位ops/sec:

img

場景純寫入insert,單位ops/sec:

img

場景讀更新read/update 9:1,單位us(延時):

img

場景純寫入insert,單位us(延時):

img

看來mongodb真的是一個高性能的資料庫,為啥呢,因為mongo的延時單位居然是us微秒、微秒、微秒。。。16GB的記憶體基本上20線程之後延時就會大大增加,在100線程的時候基本上延時基本在1000us以上,而讀多場景跟寫入場景相比,寫入場景的性能略差一點,隨著線程數的增大,寫入場景的吞吐量和延時表現和讀更新場景的差距會擴大。

有讀者可能會有疑惑,既然資料庫測試是比較雲和自建,看起來差距也沒有那麼大,用自建好像也可以接受啊。這裡我要把測試中的發現講給大家聽,聽完之後大家就明白了。

第一點,筆者買的是16G記憶體的機器(流下了沒有錢的淚水),測試的時候發現cvm的記憶體占用基本到了百分之60左右,筆者在建立副本集和加大測試數據量(購買數據量的百分之80)之後發現,記憶體占用基本到了百分之80以上。看來mongo的第一個缺點,就是對記憶體的消耗真的非常可怕!!如果遇到高併發大數據量讀寫,恐怕分分鐘就存在著存在著OOM的風險。

所以這裡奉勸各位同學,如果要自建MongoDB,還是儘量購買超大記憶體滿足業務需求,避免在業務高峰的時候被“幹掉”。如果因為跟筆者一樣貧窮不想買那麼大的記憶體,可以考慮使用雲資料庫,雲MongoDB具備動態伸縮能力,即使沒有買夠大的記憶體,也完全來得及在業務高峰擴容, 即使發生故障,也有完善的數據自動備份和無損恢復機制來恢複數據,在可用性上保障就高多了。

第二點,筆者在後續測試本地副本集的時候,嘗試讀secondary節點的數據,結果遇到了讀延遲很高的情況。在網上研究了一下發現是因為,MongoDB 複製集里 Secondary 不斷從主上批量拉取 oplog,然後在本地重放,以保證數據與 Primary 一致。這裡為了防止臟讀,會加一個鎖阻塞所有的讀請求。

所以如果遇到 Secondary 重放 oplog 占用鎖時間長,讀取的延時也會對應變長。這個鎖最高能鎖多久呢,看到有個案例鎖了接近一個小時。。。看到的人內心一定是崩潰的,而在雲Mongo測試的時候沒有遇到這個情況,我想這一定是針對這個缺陷做了很大的改進,使用了其他方法實現同步。

總的來說,MongoDB確實可以不藉助其他第三方工具實現高可用和分片功能,具備的高可用的故障切換,分片可以實現數據的分部均衡,大數據量的時候通過路由實現了伺服器的負載均衡。所以MongoDB自身的可用性較高,也難怪會在短短時間內成為流行的nosql資料庫。

但是MongoDB也存在著一些坑:如對記憶體的占用過高、對網路的占用過高、存在從節點鎖導致讀幾乎不可用的情況,這些情況在實際業務使用的時候會導致很嚴重的問題,集群宕機、服務癱瘓、數據丟失無時不刻不是覆蓋在運維同學心頭的陰影。這個時候雲MongoDB幾乎就是救星,彈性伸縮、隨時擴容、真正安全的數據熱備以及強大的專業運維架構師團隊,才能真的確保業務安全無故障的運行下去。

寫到這裡,筆者也在思考,雲資料庫到底是什麼,它僅僅是把資料庫封裝一下,改改內核,提供給使用者嗎?不,雲資料庫應當是一整套專業服務,除了資料庫之外,還有監控、安全、遷移、災備、運維等一系列的服務提供。能讓業務開發專註於業務本身,把專業的交給專業的人去做。

此文已由騰訊雲+社區在各渠道發佈

獲取更多新鮮技術乾貨,可以關註我們騰訊雲技術社區-雲加社區官方號及知乎機構號


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文收錄在容器技術學習系列文章總目錄 1、configmap 1.1 認識configmap ConfigMap用於保存配置數據的鍵值對,可以用來保存單個屬性,也可以用來保存配置文件。ConfigMap跟secret很類似,但它可以更方便地處理不包含敏感信息的字元串。 1.2 創建configmap ...
  • 前邊我們提到了客戶端如何通過圖形化、netdom 、Powershell方式加域,這裡我們簡單補充下生產環境中如何通過有許可權的用戶賬號加域並指定對應的OU,以防止域策略下發對部分生產伺服器許可權等內容進行修改,本次為大家補充netdom join方式;如果不怕麻煩的話,我們也可以通過圖形化方式先加域不... ...
  • [20190226]刪除tab$記錄的恢復6.txt--//春節前幾天做了刪除tan$記錄的測試,鏈接:http://blog.itpub.net/267265/viewspace-2565245/=> [20190130]刪除tab$記錄的恢復.txthttp://blog.itpub.net/2 ...
  • 雖然前面兩篇已經說了redis的一些配置安裝什麼的,篇幅有點長,可能看完了也不知道怎麼操作,這裡再濃縮一下: 什麼是redis redis完全開源免費的,遵守BSD協議,是一個高性能的非關係型key-value資料庫, redis特點: redis支持數據的持久化,可以將記憶體中的數據保存在磁碟中... ...
  • 筆記記錄自林曉斌(丁奇)老師的《MySQL實戰45講》 3) --事務隔離,為什麼你改了我還看不見? 簡單來說,事務就是要保證一組數據操作,要麼全部成功,要麼全部失敗。在MySQL中,事務支持是在引擎層實現的。但並不是所有的引擎都支持事務,這也是MyISAM被InnoDB取代的重要原因之一。 本篇內 ...
  • MySql中當前時間,不能直接使用Date.Now傳輸。猜測:這個可能跟伺服器地理位置有關係;一般國外的伺服器時間展示位:月/日/年; 國內通常為:年-月-日;猜測,使用的時候應註意檢查 如下麵的代碼,可能會導致查詢數據不准:應改為:Date.Now.ToString("yyyy-MM-dd HH: ...
  • [20190226]測試使用bbed恢復索引.txt--//上午做tab$刪除恢複測試時發現,tab$的索引i_tab1很小.可以嘗試使用bbed解決這個問題.--//首先在普通表上做一個測試看看.1.環境:SCOTT@book> @ ver1PORT_STRING VERSION BANNER x ...
  • 前言goldengate 11g 在oracle 11g rac 上的配置 (源是rac+asm , 目標是單資料庫實例) 源端: 1. 配置tnsnames [oracle@rac1 admin]$ more tnsnames.ora # tnsnames.ora Network Configur ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...