一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

從MongoDB遷移到ES后,我們減少了80%的服務(wù)器 - InfoQ

 黃爸爸好 2020-04-21

2020 年 4 月 19 日 14:06

本文由 dbaplus 社群授權(quán)轉(zhuǎn)載。

序言

從MongoDB遷移到ES后,我們減少了80%的服務(wù)器

圖示:MongoDB 與 Elasticsearch 熱度排名

本文內(nèi)容涉及到 MongoDB 與 Elasticsearch 兩大陣營,可能會引起口水之爭,僅代表個人經(jīng)驗之談,非陣營之說,圍繞兩個話題展開:

  • 為什么要從 MongoDB 遷移到 Elasticsearch?

  • 如何從 MongoDB 遷移到 Elasticsearch?

現(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ù)制代碼

{


"dataId": 1,


"traceId": "abc",


"moduleCode": "crm_01",


"operateTime": "2019-11-11 12:12:12",


"operationId": 100,


"operationName": " 張三 ",


"departmentId": 1000,


"departmentName": " 客戶部 ",


"operationContent": " 拜訪客戶。。。"


}

2)變更從數(shù)據(jù),實際變更數(shù)據(jù)的變化前后,此類數(shù)據(jù)條數(shù)很多,一行數(shù)據(jù)多個字段變更就記錄多條。

復(fù)制代碼

[


{


"dataId": 1,


"traceId": "abc",


"moduleCode": "crm_01",


"operateTime": "2019-11-11 12:12:12",


"operationId": 100,


"operationName": " 張三 ",


"departmentId": 1000,


"departmentName": " 客戶部 ",


"operationContent": " 拜訪客戶 ",




"beforeValue": "20",


"afterValue": "30",


"columnName": "customerType"


},


{


"dataId": 1,


"traceId": "abc",


"moduleCode": "crm_01",


"operateTime": "2019-11-11 12:12:12",


"operationId": 100,


"operationName": " 張三 ",


"departmentId": 1000,


"departmentName": " 客戶部 ",


"operationContent": " 拜訪客戶 ",




"beforeValue": "2019-11-02",


"afterValue": "2019-11-10",


"columnName": "lastVisitDate"


}


]

2、項目架構(gòu)項目背景

項目架構(gòu)描述如下:

  • 業(yè)務(wù)系統(tǒng)新增或者編輯數(shù)據(jù),產(chǎn)生操作日志記錄發(fā)送到 Kafka 集群,基于 dataid 字段作為 key;

  • 新增或編輯數(shù)據(jù)實際存儲到 MySQL 數(shù)據(jù)庫;

  • canal 集群訂閱 MySQL 集群,按照業(yè)務(wù)系統(tǒng)模塊配置監(jiān)控的數(shù)據(jù)庫與表;

  • canal 將監(jiān)控到的變更業(yè)務(wù)數(shù)據(jù)發(fā)送到 Kafka 集群,基于 dataid 字段作為 key;

  • 操作日志系統(tǒng)從 Kafka 獲取主記錄數(shù)據(jù)與從記錄數(shù)據(jù);

  • 操作日志系統(tǒng)寫入數(shù)據(jù)到 MongoDB,同時需要反查詢。

從MongoDB遷移到ES后,我們減少了80%的服務(wù)器

圖示:操作日志記錄業(yè)務(wù)流程說明

3、MongoDB 架構(gòu)項目背景

集群架構(gòu)說明:

  • 服務(wù)器配置 8c/32gb/500gb ssd;

  • Router 路由服務(wù)器部署了 3 個節(jié)點;

  • Config 配置服務(wù)器部署了 3 個節(jié)點;

  • Shard 分片服務(wù)器部署了 9 個節(jié)點;

  • 主操作記錄設(shè)計 3 個分片;

  • 從操作記錄設(shè)計 3 個分片。

從MongoDB遷移到ES后,我們減少了80%的服務(wù)器

問題說明

MongoDB 的信徒們可能懷疑我們沒有使用好,或者我們的運維能力欠缺,或者認為我們有 Elasticsearch 的高手在。不是這樣的,棄用 MongoDB 選擇 Elasticsearch 其實并非技術(shù)偏見問題,而是我們的實際場景需求,原因如下:

1、搜索查詢項目背景

  • MongoDB 內(nèi)部采用 B-Tree 作為索引結(jié)構(gòu),此索引基于最左優(yōu)先原則,且必須保證查詢順序與索引字段的順序一致才有效,這個即是優(yōu)點,但在現(xiàn)在復(fù)雜業(yè)務(wù)場景也是致命的;

  • 業(yè)務(wù)系統(tǒng)查詢操作日志記錄會有很多過濾條件,且查詢條件是任意組合的,現(xiàn)有 MongoDB 是不支持的,或者說所有關(guān)系型數(shù)據(jù)庫都不支持,如果要支持,得創(chuàng)建好多組合的 B+ 數(shù)索引,想法很不理智,這個我們已經(jīng)在《DB 與 ES 混合之應(yīng)用系統(tǒng)場景分析探討》文中探討過,詳細可以閱讀;

  • 同時主記錄與從記錄中有很多字符類的數(shù)據(jù),這些數(shù)據(jù)查詢即要支持精確查詢,也要支持全文檢索,這幾個方面 MongoDB 功能很單一,性能也很糟糕,業(yè)務(wù)系統(tǒng)查詢時經(jīng)常超時,反倒是 Elasticsearch 非常合適。

2、技術(shù)棧成熟度項目背景

  • 分片與副本實現(xiàn)問題,MongoDB 集合數(shù)據(jù)在設(shè)計時是需要綁定到具體的機器實例的,哪些分片分布在哪些節(jié)點上,哪些副本分布在哪些節(jié)點上,這些都需要在配置集群時就要綁定死,跟傳統(tǒng)的關(guān)系型數(shù)據(jù)庫做分庫分表本質(zhì)上沒有什么兩樣,其實現(xiàn)在很多數(shù)據(jù)產(chǎn)品的集群還是這種模式偏多,比如 Redis-cluster,ClickHouse 等。而 Elasticsearc 的集群與分片和副本沒有直接的綁定關(guān)系,可以任意的平衡調(diào)整,且節(jié)點的性能配置也可以很容易差異化;

  • 操作日志數(shù)據(jù)量增加很快,單日寫入超過千萬條,不用多久,運維人員就需要對服務(wù)器進行擴容,且相對 Elasticsearch 復(fù)雜很多;

  • MongoDB 單集合數(shù)據(jù)量超過 10 億條,此情況下即使簡單條件查詢性能也不理想,不如 Elasticsearch 倒排索引快;

  • 公司對于 ES 與 MongoDB 技術(shù)棧的經(jīng)驗積累不同,Elasticsearc 在很多項目中運用,非常核心的項目也是大量運用,對于其技術(shù)與運維經(jīng)驗更豐富,而 MongoDB 如果除去核心業(yè)務(wù)場景,幾乎找不到合適的切入口,實際沒有人敢在核心項目中使用 MongoDB,這就很尷尬。

3、文檔格式相同項目背景

MongoDB 與 Elasticsearch 都屬于文檔型數(shù)據(jù)庫 ,Bson 類同與 Json,_objectid 與 _id 原理一樣,所以主數(shù)據(jù)與從數(shù)據(jù)遷移到 Elasticsearch 平臺,數(shù)據(jù)模型幾乎無需變化。

遷移方案

異構(gòu)數(shù)據(jù)系統(tǒng)遷移,主要圍繞這兩大塊內(nèi)容展開:

  • 上層應(yīng)用系統(tǒng)遷移,原來是針對 MongoDB 的語法規(guī)則,現(xiàn)在要修改為面向 Elasticsearch 語法規(guī)則;

  • 下層 MongoDB 數(shù)據(jù)遷移到 Elasticsearch。

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)建索引生成足以。

從MongoDB遷移到ES后,我們減少了80%的服務(wù)器

圖示:Elastic 操作日志索引創(chuàng)建規(guī)則

3、核心實現(xiàn)邏輯設(shè)計項目背景

Elasticsearch 不是關(guān)系型數(shù)據(jù)庫,不具備事務(wù)的機制。操作日志系統(tǒng)的數(shù)據(jù)來源都是 Kafka,消費數(shù)據(jù)是有順序機制的,有 2 種場景特別注意,如下:

  • 主數(shù)據(jù)先到操作日志系統(tǒng),從數(shù)據(jù)后到,從數(shù)據(jù)寫的時候先拼湊主數(shù)據(jù)記錄和 Binlog 字段數(shù)據(jù);

  • 從數(shù)據(jù)先到操作日志系統(tǒng),主數(shù)據(jù)后到,主數(shù)據(jù)更新從索引的相關(guān)的索引字段。

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ù)制代碼

{


"dataId": 1,


"traceId": "abc",


"moduleCode": "crm_01",


"operationId": 100,


"operationName": " 張三 ",


"departmentId": 1000,


"departmentName": " 客戶部 ",


"operationContent": " 拜訪客戶 ",


"detailId": [


1,


2,


3,


4,


5,


6


]


}

前面我們講過主記錄和從記錄都是一個 Kafka 的分區(qū)上,我們拉一批數(shù)據(jù)的時候,操作 ES 用的用到的核心 API:

復(fù)制代碼

#批量獲取從索引的記錄


_mget


#批量插入


bulk


#批量刪除中間臨時索引


_delete_by_query

遷移過程

1、數(shù)據(jù)遷移項目背景

選擇 DataX 作為數(shù)據(jù)同步工具由以下幾個因素:

  • 歷史型數(shù)據(jù)。操作日志記錄數(shù)據(jù)屬于歷史性的數(shù)據(jù),記錄產(chǎn)生之后幾乎無需二次修改,等同于離線數(shù)據(jù);

  • 非持續(xù)性遷移。項目全部完工之后,原有的 MongoDB 集群會全部銷毀,不會有二次遷移需求;

  • 數(shù)據(jù)量問題。原有 MongoDB 操作日志數(shù)據(jù)量有幾十億條,遷移過程不能太快也不能太慢,速度太快,MongoDB 集群會出現(xiàn)性能問題,速度太慢,項目周期太長,增加運維的成本與復(fù)雜度。否則可以選擇 Hadoop 作為中轉(zhuǎn)平臺的遷移;

  • DataX 源碼特定場景改造。如日期類型的轉(zhuǎn)換、索引主鍵 _id 的生成、索引主鍵 _id 映射,支持重復(fù)同步;

  • 多實例多線程并行。主數(shù)據(jù)同步部署多個實例,從數(shù)據(jù)同步也部署多個實例,單實例中配置多個 Channel。

從MongoDB遷移到ES后,我們減少了80%的服務(wù)器

圖示:DataX 同步數(shù)據(jù)示意圖

2、遷移索引設(shè)置項目背景

臨時修改索引的一些設(shè)置,當數(shù)據(jù)同步完之后再修改回來,如下:

復(fù)制代碼

"index.number_of_replicas": 0,


"index.refresh_interval": "30s",


"index.translog.flush_threshold_size": "1024M"


"index.translog.durability": "async",


"index.translog.sync_interval": "5s"

3、應(yīng)用遷移項目背景

操作日志項目采用 Springboot 構(gòu)建,增加了自定義配置項,如下:

復(fù)制代碼

#應(yīng)用寫入 mongodb 標識


writeflag.mongodb: true


#應(yīng)用寫入 elasticsearch 標識


writeflag.elasticsearch: true

項目改造說明:

  • 第一次上線的時候,先將 2 個寫入標識設(shè)置為 true,雙寫 MongoDB 和 ES;

  • 對于讀,提供 2 個不同接口,前端自由的切換;

  • 等數(shù)據(jù)遷移完,沒有差異的時候,重新更改 flag 的值。

從MongoDB遷移到ES后,我們減少了80%的服務(wù)器

圖示:應(yīng)用平衡遷移

結(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)實施。

原文鏈接

https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=2650787182&idx=1&sn=d3543f9a62ec56c58fe72a0d63e35999&chksm=f3f978fbc48ef1ed23736de22fd812ca195acdb16c3869ddab8b2c29aa3ca50f0f35042f5d71&scene=27#wechat_redirect

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产一区二区三区av在线| 亚洲男人的天堂色偷偷| 亚洲中文字幕视频在线播放| av中文字幕一区二区三区在线| 中文字幕人妻综合一区二区| 欧美二区视频在线观看| 国产av熟女一区二区三区蜜桃| 欧美日韩精品一区二区三区不卡| 成人精品欧美一级乱黄| 中文字幕禁断介一区二区| 国产精品激情在线观看| 国产美女精品午夜福利视频| 欧美做爰猛烈叫床大尺度| 日本精品啪啪一区二区三区| 亚洲中文字幕在线视频频道| 欧美一级特黄大片做受大屁股| 欧美成人一区二区三区在线| 国产成人午夜在线视频| 中国美女偷拍福利视频| 成人免费在线视频大香蕉| 欧美日韩视频中文字幕| 亚洲专区中文字幕视频| 日韩精品综合免费视频| 尤物久久91欧美人禽亚洲| 亚洲欧洲一区二区综合精品| 中文字幕免费观看亚洲视频| 久久精品中文字幕人妻中文| 九九热最新视频免费观看| 久久国产亚洲精品成人| 午夜激情视频一区二区| 99久久精品免费看国产高清| 欧美日韩国产欧美日韩| 好吊日视频这里都是精品| 日韩人妻一区二区欧美| 一区二区三区国产日韩| 久久亚洲午夜精品毛片| 国产av一区二区三区久久不卡| 国产成人在线一区二区三区| 台湾综合熟女一区二区| 久热久热精品视频在线观看| 视频一区二区黄色线观看|