Elasticsearch聚合查詢,提高系統查詢、導出性能

隨着業務的發展,線上生產環境數據量猛增,財務信息一個表的數據自從2008年系統上線以來已接近7千萬,而且現在每天的增量也越來越快,由於業務中存在退費場景,所以歷史財務數據也不容易歸檔處理。但是財務應用場景中含有大量的查詢和導出,顯然,將財務數據都存儲在Mysql(建議單表數據量不超過2千萬)中已經滿足不了實際應用場景。

如何解決財務數據的查詢和導出問題成爲我們必須解決的一個難題,經過技術選型,我們最終選擇了數據依然存儲在Mysql(需要支持事務)中,使用ES來聚合數據進行查詢。

那如何將數據從Mysql同步到ES並保證數據一致性是重點。一共梳理出來以下幾種同步方式:
1.數據庫建觸發器方式,但是影響系統性能;
2.對數據行進行MD5加密對比,也會影響系統性能;
3.採用MQ方式增量新增,但增加了系統複雜度,同時需要保證MQ精準投遞、消費;
4.根據時間戳定時任務同步,但是需要保證時間戳實時更新;
5.利用cancel監聽binlog動態新增,但是存在cancel單點問題,同時系統複雜度會增高。

經過和運維溝通,採用binlog方式同步,由於涉及到老數據源(按照分校分庫)太多,而且需要引入cancel中間件還需要進行數據映射,成本較高,所以我們採用定時任務Elastic-job分片(城市分片)進行同步,根據修改時間時間戳新增或者修改的變化每1分鐘進行數據同步,同時在ES中需要按照ID進行新增或覆蓋。

接下來就是如何保證數據庫和ES數據的一致性,這是非常重要的。主要通過2步來完成,1.同步ES時建立了一個同步log表,記錄下同步開始時間和結束時間,結束時間只有當ES返回同步成功當時候才進行更新,這樣來保證即使中間同步過程出現問題,下次再同步時可以將上次未完成同步的數據接着進行同步。如果同步ES沒有問題的話,取下次同步的開始時間爲上次同步的結束時間;2.每天凌晨通過定時任務對前一天ES同步的數據和Mysq中新增或修改的數據條數進行check,如果同步條數不一致的話,將會將前一天的數據重新進行同步。
ES數據圖 以上是實現Mysql同步ES的主要過程,但是還有許多優化的點,比如: 1.數據的實時性,現在數據會有1分鐘延遲,後續會增加MQ直接監聽數據的新增或修改並推送ES; 2.ES查詢和導出服務是通過Dubbo採用RPC的方式對外提供服務,會存在鏈接超時和導出數據量大小限制的問題(現在只能批次導出); 3.現在數據量猛增,數據存在Mysql中需要考慮分庫、分表處理,不然以後同步ES數據查詢時性能會有一定的影響。