現場填坑系列:使用bulk操作提高性能,解決mongoshake 向ES同步延遲。

来源:https://www.cnblogs.com/yizhu2000/archive/2020/05/11/12866577.html
-Advertisement-
Play Games

MongoDB向ES同步數據延遲越來越大,有的已經超過10個小時,造成客戶新加入的用戶無法被搜索出來。由於在系統中ES類似於數倉,很多統計和第三方接系統都需要從ES獲取數據,所以也影響了一些其他依賴ES數據的功能和業務。 ...


接到現場報告,MongoDB向ES同步數據延遲越來越大,有的已經超過10個小時,造成客戶新加入的用戶無法被搜索出來。由於在系統中ES類似於數倉,很多統計和第三方接系統都需要從ES獲取數據,所以也影響了一些其他依賴ES數據的功能和業務。

架構簡圖

tomcat------日誌數據----->logstash-------日誌數據--->|      E  S

mongodb---業務數據--->mongoshake---業務數據 -->|      集群

日誌通過logstash同步到ES,業務數據通過mongoshake自己實現的ES推送組件推送到ES。ES 5台構成一個集群。

問題現象

  1. 延遲只發生在第二條通路,第一條通路雖然也有較大併發,但不發生延遲;
  2. 且延遲在業務峰期才會出現,非高峰期延遲不嚴重或沒有延遲;
  3. 通過上面的描述可以確定此延遲於業務相關,且與mongoshake推送的實現方式相關;

初步分析

這個結構在兩個異地機房各有一套,中間通過同步機制同步。由於業務數據是從本地mongodb同步到本地ES發生延遲,首先排除是雙機房間傳輸帶寬問題。

會不會是ES在業務高峰期負載過高,造成推送延遲:可能性有,但是較低,因為如果是ES查詢並不慢,且如果是由此造成,logstash 推送也應該受到影響。對ES的性能監控也可以印證這個問題。

會不會是兩種數據業務的不同造成的性能差異:logstash的數據主要是日誌,插入為主,mongoshake的數據是業務數據,涉及到對以前的數據進行修改:確實有可能,但比較起來延遲不應該有如此之大,一個秒級延遲,一個天級延遲,還是首先考慮實現機制問題。

同步機制

mongoshake向ES同步機制,是將需要在ES存放的幾張表的oplog在ES回放,此程式由我們的開發人員擴展的mongoshake ES組件完成。

oplog ----- mongoshake----- oplog replay----->ES

聯合高峰期延遲增加的現象,可以猜測高峰期業務數據操作造成的oplog有大量增加,由於mongoshake本身(除非修改源碼)只能篩選表,不能篩選哪些表的具體日誌,只要是這幾張包的oplog都會同步,所以造成延遲。到底是oplog過多需要篩選,還是同步能力太低需要改進,我們需要進一步查證。

推送能力統計

現場人員查看了一段時間的同步量,對現有機制的oplog處理及回放能力進行統計。

第一次統計:130秒同步 2186

第二次統計:180秒同步 2714

可見平均每秒能力不足20條日誌,肯定是過低。那麼客戶現場實際業務每秒到底要產生多少條數據?這個問題要查清楚,作為推送性能優化的底線。

實際業務oplog情況分析

對客戶業務能力進行統計,需要將一整天的oplog導出,oplog由於沒有索引,雖然可以直接通過find,並給出ts 查詢,但由於有40G數據,查詢及其緩慢 。所以我們選擇將數據導出到文本文件,進行分析

start=$(date +%s -d "2020-03-24 08:00:00")
end=$(date +%s -d "2020-03-24 10:00:00")
mongodump -h localhost -d local -c oplog.rs -q '{"ts":{$gt:Timestamp('$start',1),$lt:Timestamp('$end',1)}}' -o /home/backup
cd /home/backup/local
bsondump oplog.rs.bson > oplog.rs.txt

進一步對oplog進行分析,在vim中分別統計每個小時的日誌數量,可以得到下表:橫軸是北京時間24個小時,縱軸是oplog數量,其中灰色是oplog中需要同步到ES的

可以看出高峰期oplog大量增長,需要同步的日誌超過150000,平均每秒42條oplog需要同步。而處理能力不到20,所以高峰期一個小時的數據往往需要2-3個小時才能同步完成,且從8點開始,一直都下午18點,實際oplog產生都超過處理能力。

往下的優化方向,一個是減少日誌,一個是增加處理能力,高峰期每秒42條日誌已經不高,雖然可以優化,但可優化範圍有限。增加處理能力才是關鍵。

開發查看ES同步代碼,原有代碼使用逐條同步模式,同步一條,獲取一條,同時採用性能較低的腳本同步方式,現在使用批量處理(實現參照mongoshake 向mongodb同步的 direct writer實現。批量調用elastic Client 提供的bulk api進行操作)

bulkRequest := bw.client.Bulk()
	
for _, log := range oplogs {

   ......
   bulkRequest.Add(elastic.NewBulkDeleteRequest().Index(index).Type(doc_type).Id(id))
		
}

bulkResponse, err := bulkRequest.Do(context.Background())

對update 中的unset(刪除欄位) 進行處理,因為unset執行有速度有瓶頸,所以根據實際情況直接改為將欄位置空;

for _, v := range unsets {
	doc[v] = nil
}

效果

在進行上述操作後,單線程情況下數據處理的速度超過每秒1000條(未嚴格測試),新同步代碼幾分鐘就能同步一個小時的oplog,完全達到性能要求。

討論

oplog優化

由於ES同步性能大幅提高,所以可以不用繼續優化oplog,但是oplog可以反映關鍵業務對資料庫的訪問情況,特別是寫入,在mongodb replica set中只能在primary 節點完成,即使增加節點也無法分擔流量,所以對oplog的進一步分析依然必要。同時oplog中包含數量的大小,也對replicaset 的同步帶寬有影響,特別是出現跨機房同步的情況時。

所以更進一步,我們還對業務oplog進行了分析,此分析我們會在別的文章中討論。

多線程執行

註意這裡ES同步沒有使用多線程處理,主要是考慮業務數據多線程操作的事務性。要實現此種事務,需要對mongodb本身進行一定改造。對mongodb源碼改造實現雙向同步和多線程寫入會在其他文章中討論。

 


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

-Advertisement-
Play Games
更多相關文章
  • 我覺得我可以加入歷史博物館了,加入微軟歷史博物館,本文也是和大家吹歷史的博客 ...
  • 全屏應用對應的是視窗模式應用,全屏應用指的是整個屏幕都是被咱一個應用獨占了,屏幕上沒有顯示其他的應用,此時的應用就叫全屏應用。如希沃白板這個程式。本文主要告訴大家從微軟官方的文檔以及考古瞭解到的 Windows 對全屏應用的優化,以及是如何進行的優化,方便小伙伴在撕的時候可以找到根據 ...
  • "TOC" Shell學習 shell概述 shell是一個命令行解釋器,它接收應用程式/用戶命令,然後調用操作系統內核。 shell解釋器 1. Linux提供的解釋器有 2. bash和sh的關係 3. Centos預設的解析器是bash Shell腳本入門 1. 腳本格式 腳本以 !/bin/ ...
  • 進程管理類命令 信號: 在linux當中所有的進行管理都是靠信號來管理的.像我們平時要結束某個進程就是使用的15信號SIGTERM,還有想要強制殺死某個進程,就是使用的9信號SIGKILL等等. 在linux可以查看信號有哪些的指定太多了,kill -l ; trap -l; man 7 signa ...
  • liunx中各種監控工具,量大.本篇全是命令介紹,筆者把各個命令的都實驗一遍,給同學們看看. ...
  • 阻塞IO模型(Blocking I/O) 內核一開始提供了 與 阻塞式操作。 當客戶端連接時,會在對應進程的文件描述符目錄(/proc/進程號/fd)生成對應的文件描述符(0 標準輸入;1 標準輸出;2 標準錯誤輸出;),比如 fd 8 , fd 9; 應用程式需要讀取的時候,通過系統調用 讀取,如 ...
  • 自上世紀80年代末至90年代初互聯網誕生以來,Web服務可以說是在互聯網的普及過程當中起到了巨大的作用。而Web服務應該是當今世界上普通用戶訪問互聯網的最廣泛的方式了,用戶只需在瀏覽器中輸入所謂網址的方式即可瀏覽互聯網上的海量信息,而瀏覽器這種瘦客戶端的交互方式也是目前最主流的交互方式。 Web服務 ...
  • 在丟包率0.3%的情況下,mongodb的replicaSet發生了比較嚴重的問題。表現為同步速率大幅下降,然後產生延遲。有的已經超過2-3個小時,造成有些打到延遲mongodb上面的資料庫請求無法反應資料庫的最新更改 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...