2020 年 4 月 19 日 14:06 本文由 dbaplus 社群授權(quán)轉(zhuǎn)載。 序言圖示:MongoDB 與 Elasticsearch 熱度排名 本文內(nèi)容涉及到 MongoDB 與 Elasticsearch 兩大陣營,可能會引起口水之爭,僅代表個人經(jīng)驗之談,非陣營之說,圍繞兩個話題展開:
現(xiàn)狀背景MongoDB 本身定位與關(guān)系型數(shù)據(jù)庫競爭,但工作中幾乎沒有見到哪個項目會將核心業(yè)務(wù)系統(tǒng)的數(shù)據(jù)放在上面,依然選擇傳統(tǒng)的關(guān)系型數(shù)據(jù)庫。 1、項目背景項目背景公司所在物流速運行業(yè),業(yè)務(wù)系統(tǒng)復(fù)雜且龐大,用戶操作者很多,每日有大量業(yè)務(wù)數(shù)據(jù)產(chǎn)生,同時業(yè)務(wù)數(shù)據(jù)會有很多次流轉(zhuǎn)狀態(tài)變化,為了便于記錄追蹤分析,系統(tǒng)操作日志記錄項目應(yīng)運而生,考慮到原有的日均數(shù)據(jù)量,操作日志數(shù)據(jù)基于 MongoDB 存儲。 操作日志記錄系統(tǒng)需要記錄兩種數(shù)據(jù),如下說明: 1)變更主數(shù)據(jù),什么人在什么時間在系統(tǒng)哪個模塊做了什么操作,數(shù)據(jù)編號是什么,操作跟蹤編號是什么。 復(fù)制代碼 2)變更從數(shù)據(jù),實際變更數(shù)據(jù)的變化前后,此類數(shù)據(jù)條數(shù)很多,一行數(shù)據(jù)多個字段變更就記錄多條。 復(fù)制代碼 2、項目架構(gòu)項目背景項目架構(gòu)描述如下:
3、MongoDB 架構(gòu)項目背景集群架構(gòu)說明:
問題說明MongoDB 的信徒們可能懷疑我們沒有使用好,或者我們的運維能力欠缺,或者認為我們有 Elasticsearch 的高手在。不是這樣的,棄用 MongoDB 選擇 Elasticsearch 其實并非技術(shù)偏見問題,而是我們的實際場景需求,原因如下: 1、搜索查詢項目背景
2、技術(shù)棧成熟度項目背景
3、文檔格式相同項目背景MongoDB 與 Elasticsearch 都屬于文檔型數(shù)據(jù)庫 ,Bson 類同與 Json,_objectid 與 _id 原理一樣,所以主數(shù)據(jù)與從數(shù)據(jù)遷移到 Elasticsearch 平臺,數(shù)據(jù)模型幾乎無需變化。 遷移方案異構(gòu)數(shù)據(jù)系統(tǒng)遷移,主要圍繞這兩大塊內(nèi)容展開:
1、Elastic 容量評估項目背景原有 MongoDB 集群采用了 15 臺服務(wù)器,其中 9 臺是數(shù)據(jù)服務(wù)器,遷移到 Elastic 集群需要多少臺服務(wù)器?我們采取簡單推算辦法,如假設(shè)生產(chǎn)環(huán)境上某個 MongoDB 集合的數(shù)據(jù)有 10 億條數(shù)據(jù), 我們先在測試環(huán)境上從 MongoDB 到 ES 上同步 100 萬條數(shù)據(jù),假設(shè)這 100 萬條數(shù)據(jù)占用磁盤 10G,那生產(chǎn)上環(huán)境上需要 1 個 T 磁盤空間,然后根據(jù)業(yè)務(wù)預(yù)期增加量擴展一定冗余。根據(jù)初步評估,Elastic 集群設(shè)置 3 臺服務(wù)器, 配置 8c/16g 內(nèi)存 /2T 機械磁盤。服務(wù)器數(shù)量一下從 15 臺縮減到 3 臺,且配置也降低不少。 2、Elastic 索引規(guī)則項目背景系統(tǒng)操作日志是時序性數(shù)據(jù),寫完整后基本上無需再次修改。操作日志記錄查詢主要是當月的居多,后續(xù)的歷史性數(shù)據(jù)查詢頻率很低,根據(jù)評估,核心數(shù)據(jù)索引按月創(chuàng)建生成, 業(yè)務(wù)查詢時候必須帶上操作時間范圍,后端根據(jù)時間反推需要查詢哪些索引,Elastic-Api 支持多索引匹配查詢,完美利用 Elastic 的特性解決跨多個月份的查詢合并。對于非核心數(shù)據(jù)索引,按年創(chuàng)建索引生成足以。 3、核心實現(xiàn)邏輯設(shè)計項目背景Elasticsearch 不是關(guān)系型數(shù)據(jù)庫,不具備事務(wù)的機制。操作日志系統(tǒng)的數(shù)據(jù)來源都是 Kafka,消費數(shù)據(jù)是有順序機制的,有 2 種場景特別注意,如下:
Elasticsearch 索引數(shù)據(jù)更新是近實時的刷新機制,數(shù)據(jù)提交后不能馬上通過 Search-Api 查詢到,主記錄的數(shù)據(jù)如何更新到從記錄呢?而且業(yè)務(wù)部門不規(guī)范的使用,多條主記錄的 dataId 和 tracId 可能一樣。 由于主數(shù)據(jù)與從數(shù)據(jù)關(guān)聯(lián)字段是 dataId 和 traceId。如果主數(shù)據(jù)與從數(shù)據(jù)在同時達到操作日志系統(tǒng),基于 update_by_query 命令肯定失效不 準確, 主從數(shù)據(jù)也可能是多對多的關(guān)聯(lián)關(guān)系,dataId 和 traceId 不能唯一決定一條記錄。 Elasticsearch 其實也是一個 NoSQL 數(shù)據(jù)庫, 可以做 key-value 緩存。這時新建一個 Elastic 索引作為中間緩存, 原則是主數(shù)據(jù)與從數(shù)據(jù)誰先到緩存誰,索引的 _id=(dataId+traceId) , 通過這個中間索引可以找到主數(shù)據(jù)記錄的 Id 或者從記錄 Id, 索引數(shù)據(jù)模型多如下,detailId 為從索引的 _id 的數(shù)組記錄。 復(fù)制代碼 前面我們講過主記錄和從記錄都是一個 Kafka 的分區(qū)上,我們拉一批數(shù)據(jù)的時候,操作 ES 用的用到的核心 API: 復(fù)制代碼 遷移過程1、數(shù)據(jù)遷移項目背景選擇 DataX 作為數(shù)據(jù)同步工具由以下幾個因素:
2、遷移索引設(shè)置項目背景臨時修改索引的一些設(shè)置,當數(shù)據(jù)同步完之后再修改回來,如下: 復(fù)制代碼 3、應(yīng)用遷移項目背景操作日志項目采用 Springboot 構(gòu)建,增加了自定義配置項,如下: 復(fù)制代碼 項目改造說明:
結(jié)語1、遷移效果項目背景棄用 MongoDB 使用 ElasticSearch 作為存儲數(shù)據(jù)庫,服務(wù)器從原來的 15 臺 MongoDB,變成了 3 臺 ElasticSearch,每月為公司節(jié)約了一大筆費用。同時查詢性能提高了 10 倍以上,而且更好的支持了各種查詢,得到了業(yè)務(wù)部門的使用者,運維團隊和領(lǐng)導(dǎo)的一致贊賞。 2、經(jīng)驗總結(jié)項目背景整個項目前后歷經(jīng)幾個月,多位同事參與,設(shè)計、研發(fā),數(shù)據(jù)遷移、測試、數(shù)據(jù)驗證、壓測等各個環(huán)節(jié)。技術(shù)方案不是一步到位,中間也踩了很多坑,最終上線了。ES 的技術(shù)優(yōu)秀特點很多,靈活的使用,才能發(fā)揮最大的威力。 作者介紹: 李猛 (ynuosoft),Elastic-stack 產(chǎn)品深度用戶,ES 認證工程師,2012 年接觸 Elasticsearch,對 Elastic-Stack 開發(fā)、架構(gòu)、運維等方面有深入體驗,實踐過多種 Elasticsearch 項目,最暴力的大數(shù)據(jù)分析應(yīng)用,最復(fù)雜的業(yè)務(wù)系統(tǒng)應(yīng)用;業(yè)余為企業(yè)提供 Elastic-stack 咨詢培訓(xùn)以及調(diào)優(yōu)實施。 原文鏈接: |
|