行業案例| MongoDB在騰訊零售優碼中的應用
本文主要分享騰訊智慧零售團隊優碼業務在MongoDB中的應用,採用騰訊雲MongoDB作為主儲存服務給業務帶來了較大收益,主要包括: 高效能、快捷的DDL操作、低儲存成本、超大儲存容量等收益,極大的降低了業務儲存成本,並提高了業務迭代開發效率。
一. 業務場景
1.1 正品通
1.2 門店通
1.3 會員通
二.碼儲存選型
2.1 需求和方案
-
海量資料: 騰訊優碼做的商品二維碼,隨著越來越多的商品使用騰訊優碼業務,二維碼資料開始呈現指數級增長。
-
關聯儲存: 碼與碼之間存在1:1和1:N:N的關聯關係,需要儲存這種關係,並且提供相應的關聯查詢。
-
多維度查詢: 針對不同的應用場景需要提供不同維度的條件查詢。
-
資料同步和一致性問題: 這個問題在資料量不大的情況下不會有影響。但是如果資料量百億甚至千億時就是一個非常嚴重的問題。
-
資料容量問題: 一般情況下 MySql 的單表資料最好維持在百萬級一下,如果單表資料量過大之後讀寫都是個問題。那麼如果要儲存千億資料就要幾千上萬張表,如此多的分表需要業務自己維護時開發運維都是幾乎不可行的。
-
成本問題: 資料冗餘儲存,會增加額外的儲存成本。同時ES 為了保證資料可靠性和查詢效能,需要更多的機器和記憶體。而且 ES 存在資料膨脹問題,對於同樣的資料,需要相當MySql來說更大的磁碟。
-
DDL運維問題: MySql 在分庫分佈之後,因為DDL語句需要操作大量的庫表,因此非常耗時,同時也容易出錯。根據我們以前的專案經驗來說,當有幾百張表,單表幾十萬資料時,一個簡單的增加欄位的DDL語句也需要1小時甚至更久才能完成。
-
開發成本問題: 此方案需要業務自己維護分庫分表、資料同步和根據需求選取不同的查詢引擎。不僅整個架構複雜,同時在做業務需求時需要慎重考慮,稍不注意使用錯的儲存引擎就可能導致效能問題。
-
水平擴容問題: MySql 分庫分表要擴容需要業務手動 rehash 搬遷資料,成本非常高,而且很難處理擴容過程中的資料讀寫問題。
-
無DDL問題: 因為MongoDB 是No Schema 的,因此可以避免MySql的DDL問題。
-
資料自動均勻: MongoDB 有自動rebalance 功能,可以在資料分佈不均勻的時候,自動搬遷資料,保證各個分片間的負載均勻。
-
更低的成本: MongoDB 自帶資料壓縮,在同等資料下,MongoDB 需求的磁碟更少。
-
更高的效能: MongoDB 最大化的利用了記憶體,在大部分場景下擁有接近記憶體資料庫的效能。經過測試MongoDB的單分片讀效能約為3萬QPS。
-
更多的讀寫方式: 雖然MongoDB沒有ES的倒排索引,其支援的查詢方式略遜於ES。但是,MongoDB在擁有大部分ES的查詢能力的同時,其效能遠高與ES;而且相對MySql 來說MongoDB 的欄位型別支援內嵌物件和陣列物件,因此能滿足跟多的讀寫需求。
2.3 方案對比
通過前面的分析,我們初步判斷MongoDB擁有更好的表現。因此為了進一步確定MongoDB的優勢,我們深入對比了MySQL + ES 與MongoDB在各方面的表現。
2.3.1 儲存成本對比
-
無資料同步鏈路 :使用MongoDB不需要資料同步,因此就不需要維護canal服務和kafka佇列,大大減少開發和運維難度。
-
人力成本收益: 在MySQL+ES架構下每次對MySQL叢集做新增欄位變更,都需運維 一定的人日投入,並且存在業務抖動風險,同時影響業務迭代釋出進度,迭代釋出耗時且風險大。
-
開發維護成本: MongoDB儲存架構簡單,一份儲存,無資料一致性壓力。
-
動態擴容: MongoDB 支援隨時動態擴容,基本不存在容量上限問題,而MySQL在擴容時需要業務手動rehash變遷資料,並自己保證資料一致性和完整性。
2.3.3 效能對比
三.MongoDB分片
叢集優化過程
3.1 分片叢集片建選擇+預分片
use db_code_xx sh.enableSharding("db_code_xx") //n為實際分片數 sh.shardCollection("db_code_xx.t_code_xx", {"id": "hashed"}, false,{numInitialChunks:8192*n})
3.2 低峰期滑動視窗設定
-
CPU消耗過高,遷移過程甚至消耗90%左右CPU
-
業務訪問抖動,耗時增加
-
慢日誌增加
-
異常告警增多
use config db.settings.update({"_id":"balancer"},{"$set":{"activeWindow":{"start":"00:00","stop":"06:00"}}},true)
3.3 寫多數派優化
cmgo-xx:SECONDARY> rs.conf().settings.chainingAllowed true cmgo-xx:SECONDARY>
cmgo-xx:SECONDARY> rs.status().syncSourceHost xx.xx.xx.xx:7021 cmgo-xx:SECONDARY>
cfg = rs.config() cfg.settings.chainingAllowed = falsers.reconfig(cfg)
-
鏈式複製好處: 可以大大減輕主節點同步oplog的壓力。
-
鏈式複製不足: 當寫策略為majority時,寫請求的耗時變大。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69961190/viewspace-2892861/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MongoDB在vivo評論中臺的應用案例MongoDB
- 行業案例 | MongoDB 在 QQ 小世界 Feed 雲系統中的應用及業務架構優化實踐行業MongoDB架構優化
- 行業案例| 千億級高併發MongoDB叢集在某頭部金融機構中的應用及效能優化實踐(上)行業MongoDB優化
- 區塊鏈在零售業和銀行業的廣泛應用區塊鏈行業
- Elasticsearch 在業界的大量應用案例Elasticsearch
- 資料分析在金融行業中的應用行業
- 因果推斷在騰訊遊戲中的應用遊戲
- 人工智慧在新零售中的應用人工智慧
- 雲流化技術在汽車行業中的應用行業
- 移動端VIN碼識別在汽車行業中的前景與應用行業
- “網際網路+”在醫療行業中的應用行業
- ERP在汽車製造行業中的應用(轉)行業
- 行業|人工智慧在醫療方面最新8大應用案例行業人工智慧
- chatGPT在金融行業的應用前景ChatGPT行業
- 家電行業中的MES應用行業
- 人工智慧技術在24個行業中的應用人工智慧行業
- 物聯網在環境保護行業中的應用行業
- MongoDB 在 Spring的資料應用MongoDBSpring
- 揭秘|Axway API在銀行業的應用API行業
- Docker容器雲在金融行業的應用Docker行業
- 【效能優化】CBO,RBO在ORACLE中的應用優化Oracle
- 汽車行業的CRM應用(中) (轉)行業
- ERP在企業中的應用(轉)
- 條碼倉庫管理系統在食品行業中的應用行業
- 工業交換機在數字化變電站中的應用優勢
- 在 OpenFunction 中執行 Serverless 應用FunctionServer
- mongoDB在網際網路金融的應用MongoDB
- 在Python應用中使用MongoDBPythonMongoDB
- 開發高效能的MongoDB應用:淺談MongoDB效能優化MongoDB優化
- 元明粉在水產品養殖行業中的應用IPE行業
- 探索優傲機器人|UR5在塑膠行業注塑的應用機器人行業
- 投影互動牆在廣告行業的應用行業
- 大資料在電信行業的應用大資料行業
- 機器學習在實時性欺詐檢測中的應用案例機器學習
- 物聯網在智慧林業中的應用
- IPsec在企業網中的應用!(vpn)
- Ubuntu在企業應用中的地位幾何?Ubuntu
- 專案管理在企業中的應用(轉)專案管理