分庫分表后復雜查詢的應對之道:基于DTS實時性ES寬表構建技術實踐

1 問題域

業務發展的初期,我們的數據庫架構往往是單庫單表,外加讀寫分離來快速的支撐業務,隨著用戶量和訂單量的增加,數據庫的計算和存儲往往會成為我們系統的瓶頸,業界的實踐多數采用分而治之的思想:分庫分表,通過分庫分表應對存系統讀寫性能瓶頸和存儲瓶頸;分庫分表幫我們解決問題的同時,也帶來了復雜性;比如多條件的分頁查詢,多條件的聯表查詢變得復雜起來,通過調研我們發現針對這些分頁,聯表的復雜查詢,業界常用的解決方案有以下兩種:1 構建ES寬表2 構建查詢條件到表主鍵Mapping映射表;本表文章介紹我們的實踐:基于公司的中間件DTS構建實時性的ES寬表。所謂的寬表是通過主鍵將多張表關聯成一張表,比如訂單維度的寬表字段包含:訂單主表,訂單明細表,商品表,用戶表等表字段。

2 ES寬表構建解決方案域

2.1 同步雙寫

應用在接收到寫請求后,同步寫DB成功,然后再同步寫ES。

2.2 異步雙寫

應用在接收到寫請求后,同步寫DB成功,異步發送MQ,消費MQ異步寫ES。

2.3 基于Binlog的實時同步

2.3.1 Binlog作為消息

將Binlog作為消息,或者驅動的Event,接收到消息后,RPC調取下游的業務系統,獲取業務數據進行數組的組裝,寫入ES。

2.3.2 Binlog作為數據

解析Binlog中的數據,獲取庫表,字段變更前后的內容,INSERT, UPDATE, DELETE事件,基于Binlog中的數據去構建寬表,寫入ES。

3 解決方案優缺點對比

4 我們的實踐

4.1 Binlog作為數據構建ES寬表

4.1.1 順序性的保證

上游DTS監聽的binlog是有序的;發送消息時,業務方可以配置業務主鍵例如uep_order_no,DTS可以根據業務主鍵進行hash,將該條消息發送到對應的隊列保證局部有序性;消費者消費時,同一個訂單號uep_order_no映射到同一個分區,保證順序消費;

4.1.2 冪等性的保證

DTS可以保證消息不丟失,但不保證消息不重復,可能發送重復的消息需要業務方保證冪等性,

UPDATE/DELETE操作天然具有冪等性

INSERT操作在進行操作前需要先判斷下數據是否存在,不存在則插入,存在則更新

4.1.3 數據一致性的保證

由于數據存儲在Mysql和ES兩種存儲媒介,可以采用定時任務對賬機制保證數據的一致性,如果數據不一致采用補償任務進行補償操作

4.1.4 存量數據遷移

采用定時任務分頁將數據從Mysql遷移到ES

4.2 ES復雜檢索

4.2.1 檢索的分類

多條件的復雜查詢,采用Bool查詢;

4.2.2 查詢條件構建

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78939.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78939.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78939.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CVE-2024-4577:Windows 編碼錯誤

CVE-2024-4577是一個 PHP-CGI 漏洞,就是其中一種情況:雖然有這個版本,但由于 PHP 經常被反向移植,因此無法可靠地使用。 這篇博文詳細介紹了如何研究 CVE-2024-4577 以及當前用于檢測它的方法。 CVE-2024-4577 CVE-2024-4577 是 Windows 版 PHP 安裝中的一個高危漏洞,會…

NetBox Docker 全功能部署方案(Ubuntu 22.04 + Docker)

環境準備 檢查操作系統版本: 本方案使用 Ubuntu 22.04,并在 VMware 虛擬機中運行。通過以下命令檢查系統版本: lsb_release -a 如果未安裝 Ubuntu 22.04,請下載并安裝一個全新的系統。 更新系統軟件源: 更新軟件包列表…

DeepSeek Copilot idea插件推薦

🌌 DeepSeek Copilot for IntelliJ IDEA 讓 AI 成為你的編程副駕駛,極速生成單元測試 & 代碼注釋驅動開發! 🚀 簡介 DeepSeek Copilot 是一款為 IntelliJ IDEA 打造的 AI 編程助手插件,它能夠智能分析你的代碼邏輯…

QT中的JSON

1.JSON的兩種數據格式 JSON有兩種數據格式:JSON對象和JSON數組 JSON數組: JSON數組格式:[元素1,元素2,元素3,......元素n] JSON數組中的元素可以是同一類型,也可以使不同類型,可以嵌套JSON數組…

詳細剖析傳輸層協議(TCP和UDP)

詳細講解傳輸層的網絡協議,為什么TCP是可靠連接協議,憑什么能做到不丟包,有哪些機制保證可靠呢? TCP/UDP UDPTCP**三次握手和四次揮手****滑動窗口****擁塞控制**(socket套接字)**listen的第二個參數** UD…

數據可視化:藝術與科學的交匯點,如何讓數據“開口說話”?

數據可視化:藝術與科學的交匯點,如何讓數據“開口說話”? 數據可視化,是科技與藝術的結合,是讓冰冷的數字變得生動有趣的橋梁。它既是科學——講究準確性、邏輯性、數據處理的嚴謹性;又是藝術——強調美感…

解決使用lettuce連接Redis超時的問題(tcpUserTimeout 參數失效問題)

問題背景 lettuce 連接Redis的主從實例,當主節的主機異常下電重啟后,由于沒有發送RST 包,導致 lettuce 一直在復用之前的TCP鏈接,然后會出現連接超時的情況。一直出現io.lettuce.core.RedisCommandTimeoutException: Command tim…

如何使用python保存字典

在Python中,可以通過多種方式將字典(dict)保存到文件中,并能夠隨時讀取恢復。以下是幾種常見的方法: 1. 使用 json 模塊(推薦) 適用場景:需要人類可讀的文件格式,且數據不…

SQL 與 Python:日期維度表創建的不同選擇

文章目錄 一、日期維度表概述日期維度表結構 二、使用 SQL 創建日期維度表2.1 表結構設計2.2 數據插入2.3 SQL 創建方式的優勢與局限 三、使用 Python 創建日期維度表3.1 依賴庫引入3.2 代碼實現3.3 Python 創建方式的優勢與局限 四、應用場景與選擇建議4.1 應用場景4.2 選擇建…

如何用postman進行批量操作

業務場景: 有些時候,我們會需要批量的將SAP B1系統中的幾千條的數據刪除或者取消單據,這個時候,一條條去操作,指定是到猴年馬月了。SAP Business One本身提供了DTW這個工具,但是這個更新,可以操…

Mysql如何完成數據的增刪改查(詳解從0到1)

前言: Mysql可能是每個程序員的必修課,可以說是使用起來是沒有什么問題的,但是作為一名合格的程序猿,深入學習Mysql的內部工作原理是非常有必要的,主要是理解和學習Mysql的底層思想,希望在日后如遇到一些&…

單片機嵌入式按鍵庫

kw_btn庫說明 本庫主要滿足嵌入式按鍵需求,集成了常用的按鍵響應事件:高電平、低電平、上升沿、下降沿、單擊、雙擊、長按鍵事件。可以裸機運行,也可以配合實時操作系統運行。 本庫開源連接地址:連接 實現思路 本庫采用C語言進行…

Qt—鼠標移動事件的趣味小程序:會移動的按鈕

1.項目目標 本次根據Qt的鼠標移動事件實現一個趣味小程序:當鼠標移動到按鈕時,按鈕就會隨機出現在置,以至于根本點擊不到按鈕。????? 2.項目步驟 首先現在ui界面設計控件(也可以用代碼的方式創建,就不多說了) 第一個按鈕不需…

MySQL的information_schema在SQL注入中的關鍵作用與防御策略

目錄 一、information_schema的核心價值 二、攻擊利用場景與示例 1. 聯合查詢注入(Union-Based) 2. 報錯注入(Error-Based) 3. 布爾盲注(Boolean Blind) 4. 時間盲注(Time-Based&#xff0…

c語言 關鍵字--目錄

下面是詳細介紹的鏈接 1.c語言 關鍵字 2.typedef 關鍵字 3.volatile 關鍵字 4.register 關鍵字 5.const關鍵字用法 6.extern關鍵字 7.sizeof關鍵字

python爬蟲爬取網站圖片出現403解決方法【僅供學習使用】

基于CSDN第一篇文章,Python爬蟲之入門保姆級教程,學不會我去你家刷廁所。 這篇文章是2021年作者發表的,由于此教程,網站添加了反爬機制,有作者通過添加cookie信息來達到原來的效果,Python爬蟲添加Cookies以…

docker創建一個centOS容器安裝軟件(以寶塔為例)的詳細步驟

備忘:后續偶爾忘記了docker虛擬機與宿主機的端口映射關系,來這里查看即可: docker run -d \ --name baota \ --privilegedtrue \ -p 8888:8888 \ -p 8880:80 \ -p 8443:443 \ -p 8820:20 \ -p 8821:21 \ -v /home/www:/www/wwwroot \ centos…

linux 使用nginx部署ssl證書,將http升級為https

前言 本文基于:操作系統 CentOS Stream 8 使用工具:Xshell 8、Xftp 8 服務器基礎環境: nginx - 請查看 linux 使用nginx部署vue、react項目 所需服務器基礎環境,請根據提示進行下載、安裝。 1.下載證書 以騰訊云為例&#x…

日常開發中,iOS 性能調優我們怎么做?

日常開發中,iOS 性能調優我們怎么做?聊聊我用過的幾款工具 最近在給一個 iOS 視頻類 App 做性能優化,過程中踩了不少坑,也用了一些不錯的工具,今天就以一個開發者視角隨便聊聊我在調試過程中的一些經驗。 一、性能問…

Redis ⑨-Jedis | Spring Redis

Jedis 通過 Jedis 可以連接 Redis 服務器。 通過 Maven 引入 Jedis 依賴。 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><versi…