127.數據異構方案

文章目錄

  • 前言
  • 一、數據異構的常用方法
    • 1. 完整克隆
    • 2. MQ方式
    • 3. binlog方式
  • 二、MQ與Binlog方案實現
    • MQ方式
    • binlog方式
    • 注意點
  • 三、總結

前言

何謂數據異構:把數據按需(數據結構、存取方式、存取形式)異地構建存儲。比如我們將DB里面的數據持久化到Redis或者ES里面去,就是一種數據異構的方式。

常見應用場景
分庫分表中有一個最為常見的場景,為了提升數據庫的查詢能力,我們都會對數據庫做分庫分表操作。比如訂單庫,開始的時候我們是按照訂單ID作為分片鍵去分庫分表,后來的業務需求想按照商家維度去查詢,比如想查詢某一個商家下的所有訂單,就非常麻煩。

這個時候通過數據異構就能很好的解決此問題,如下圖:
在這里插入圖片描述

異構維度

數據異構總結起來大概有以下幾種場景

  • 數據庫鏡像(DB→DB)
  • 數據庫實時備份
  • 多級索引(DB→ClickHouse)
  • search build(比如分庫分表后的多維度數據查詢)(DB→ES)
  • 業務cache刷新(DB→Redis)
  • 價格、庫存變化等重要業務消息

數據異構方向
圖片

異構的幾種方向

在日常業務開發中大致可以分為以上幾種數據去向,DB-DB這種方式,一般常見于分庫分表后,聚合查詢的時候,比如我們按照訂單ID去分庫分表,那么這個時候我們要按照用戶ID去查詢,查詢這個用戶下面的訂單就非常不方便了(因為分庫分表后的查詢where條件必須帶分片鍵),當然可以使用統一加到內存中去,但這樣不太好。

所以我們就可以用數據庫異構的方式,重新按照用戶ID的維度來分一個表,像在上面常見應用場景中介紹的那樣。把數據異構到redis、elasticserach、slor中去要解決的問題跟按照多維度來查詢的需求差不多。這些存儲天生都有聚合的功能。當然同時也可以提高查詢性能,應對大訪問量,比如redis這種抗量銀彈。

一、數據異構的常用方法

1. 完整克隆

這個很簡單就是將數據庫A,全部拷貝一份到數據庫B,這樣的使用場景是離線統計跑任務腳本的時候可以,如MySQL→Hive,用于離線數據業務。缺點也很突出,不適用于持續增長的數據。

2. MQ方式

業務數據寫入DB的同時,也發送MQ一份,也就是業務里面實現雙寫。這種方式比較簡單,但也很難保證數據一致性,對簡單的業務場景可以采用這種方式。

3. binlog方式

通過實時的訂閱MySQLbinlog日志,消費到這些日志后,重新構建數據結構插入一個新的數據庫或者是其他存儲,比如es、slor等等。訂閱binlog日志可以比較好的能保證數據的一致性。

二、MQ與Binlog方案實現

MQ方式

在這里插入圖片描述
mq的方式,相對簡單,實際上是在業務邏輯中寫DB的同時去寫一次MQ,但是這種方式不能夠保證數據一致性,就是不能保證跨資源的事務,因為MQ可能出現消息堆積、重復消息、消息丟失等問題。

注:調用第三方遠程RPC的操作一定不要放到事務中。否則可能造成大事務問題,影響程序性能

binlog方式

在這里插入圖片描述

canal異構方式

binglog是數據的日志記錄方式,每次對數據的操作都會有binlog日志。現在有很多開源的訂閱binlog日志的組件,比如使用比較廣泛的canal,它是阿里開源的基于mysql數據庫binlog的增量訂閱和消費組件。

由于canal服務器目前讀取的binlog事件只保存在內存中,并且只有一個canal客戶端可以進行消費。所以如果需要多個消費客戶端,可以引入activemq或者kafka。如上圖綠色虛線框部分。

我們還需要確保全量對比來保證數據的一致性(canal+mq的重試機制基本可以保證寫入異構庫之后的數據一致性),這個時候可以有一個全量同步WORKER程序來保證,如上圖深綠色部分。

canal的工作原理
先來看下mysql主備(主從)復制原理如下圖,在此原理基礎之上我們再來理解canal的實現原理就一眼能明白了。

mysql主備復制實現原理
在這里插入圖片描述

mysql主備(主從)復制原理,從上層來看,復制分成三步:

  • master將改變記錄到二進制日志(binary log)中(這些記錄叫做二進制日志事件,binary log events,可以通過show binlog events進行查看);

  • slavemasterbinary log events拷貝到它的中繼日志(relay log);

  • slave重做中繼日志中的事件,將改變反映到它自己的數據。

再來看下canal的原理,如下圖:

在這里插入圖片描述
cannal實現原理相對比較簡單(參照上面的mysql主備復制實現原理):

  • canal模擬mysql slave的交互協議,偽裝自己為mysql slave,向mysql master發送dump協議

  • mysql master收到dump請求,開始推送binary logslave(也就是canal)

  • canal解析binary log對象(原始為byte流)

我們在部署canal server的時候要部署多臺,來保證高可用。但是canal的原理,是只有一臺服務器在跑處理,其它的服務器作為熱備。canal server的高可用是通過zookeeper來維護的。

有關canal更具體的使用和詳細原理請參照:https://github.com/alibaba/canal

注意點

  1. 確認MySQL開啟binlog,使用show variables like 'log_bin'; 查看ON為已開啟,一般都是已經開啟的
  2. 確認目標庫可以產生binlogshow master status 注意Binlog_Do_DBBinlog_Ignore_DB參數
  3. 確認binlog格式為ROW,使用show variables like 'binlog_format'; ROW模式則可以登錄MySQL執行 set global binlog_format=ROW; flush logs; 或者通過更改MySQL配置文件并重啟MySQL生效。
  4. 為保證binlake服務可以獲取Binlog,需添加授權,執行 GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'admin'@'%' identified by 'admin'; FLUSH PRIVILEGES;

三、總結

本文主要敘述了數據異構的使用場景,方法。這里面涉及到的kafka以及canal并沒有深入分析,關于這塊的內容可以直接參考相關具體文檔,文中已給了鏈接地址。

根據數據異構的定義,將數據異地構建存儲,我們可以應用的地方就非常多,文中說的分庫分表之后按照其它維度來查詢的時候,我們想脫離DB直接用緩存比如redis來抗量的時候。數據異構這種方式都能夠很好的幫助我們來解決諸如此類的問題。

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

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

相關文章

Android 安全補丁介紹

Android 安全補丁介紹 每月安全補丁更新:https://source.android.com/docs/security/bulletin CEV 全稱: Common Vulnerabilities and Exposures (CVE) 常見漏洞和暴露 (CVE) 安全補丁版本查看:設置,關于手機,Andro…

前端基礎入門三大核心之HTML篇:無序列表的深度探索

前端基礎入門三大核心之HTML篇:無序列表的深度探索 一、無序列表基礎概念與作用1.1 什么是無序列表?1.2 無序列表的作用 二、基本用法與代碼示例2.1 最簡單的無序列表2.2 添加自定義樣式 三、進階應用與技巧3.1 列表嵌套3.2 利用CSS實現復雜布局3.3 安全…

云和恩墨海外首秀在吉隆坡召開的2024中國智能科技與文化展覽會

作為中馬建交50周年官方重點推薦的活動之一,2024中國智能科技與文化展覽會(第四屆)于5月20至21日在毗鄰吉隆坡雙子塔的吉隆坡國際會展中心舉辦。本次展覽會獲得馬來西亞科學技術創新部、馬來西亞通訊部、中國駐馬來西亞大使館和馬來西亞中華總…

【Linux學習】進程地址空間與寫時拷貝

文章目錄 Linux進程內存布局圖&#xff1a;內存布局的驗證 進程地址空間寫時拷貝 Linux進程內存布局圖&#xff1a; 地址空間的范圍&#xff0c;在32位機器上是2^32比特位,也就是[0,4G]。 內存布局的驗證 代碼驗證內存布局&#xff1a; 驗證代碼&#xff1a; #include<s…

linux系統安全加固

目錄 1、賬戶安全基本措施 1&#xff09;系統賬戶清理 2&#xff09;密碼安全控制 3&#xff09;命令歷史限制 2、用戶切換及提權 1&#xff09;使用 su命令切換用戶 2&#xff09;使用sudo機制提升權限 3、系統引導和安全登錄控制 1&#xff09;開機安全控制 2&…

頭歌實踐教學平臺:Junit實訓入門篇

第2關&#xff1a;Junit注解 任務描述 給出一個帶有注解的Junit代碼及其代碼打印輸出&#xff0c;要求學員修改注解位置&#xff0c;讓輸出結果變為逆序。 相關知識 Junit注解 Java注解&#xff08;(Annotation&#xff09;的使用方法是" 注解名" 。借助注解&a…

python數據處理與分析入門-Pandas數據可視化例子

相關內容 Matplotlib可視化練習 Pandas 數據可視化總結 柱狀圖 reviews[points].value_counts().sort_index().plot.bar()散點圖 reviews[reviews[price] < 100].sample(100).plot.scatter(xprice, ypoints)蜂窩圖 reviews[reviews[price] < 100].plot.hexbin(xprice…

Helm安裝kafka3.7.0無持久化(KRaft 模式集群)

文章目錄 2.1 Chart包方式安裝kafka集群 5.開始安裝2.2 命令行方式安裝kafka集群 搭建 Kafka-UI三、kafka集群測試3.1 方式一3.2 方式二 四、kafka集群擴容4.1 方式一4.2 方式二 五、kafka集群刪除 參考文檔 [Helm實踐---安裝kafka集群 - 知乎 (zhihu.com)](https://zhuanlan.…

virtualbox共享文件夾沒有訪問權限

設置好共享文件夾之后&#xff0c;進入虛擬機&#xff0c;共享文件夾的地址是/media/sf_shared。 想要使用cd命令進入該文件夾時&#xff0c;你可能會發現此文件夾無法訪問&#xff0c;系統提示的原因是權限不足。 在虛擬機下查看共享文件夾的屬性&#xff0c;發現該目錄的所…

Nginx - 健康檢查終極指南:探索Upstream Check模塊

文章目錄 概述upstream_check_module模塊安裝和配置指南模塊安裝步驟基本配置示例詳細配置說明檢查類型和參數常見問題及解決方案 SSL檢查和DNS解析功能SSL檢查配置示例和說明配置示例 DNS解析配置示例和說明配置示例 結合實際應用場景的高級配置示例綜合SSL檢查與DNS解析 總結…

Doris【部署 03】Linux環境Doris數據庫部署異常問題收集解決(不斷更新)

Linux環境Doris數據庫部署異常問題 1.FE1.1 Unknown system variable character_set_database1.2 notify new FE type transfer: UNKNOWN1.3 mysql_load_server_secure_path1.4 Only unique table could be updated1.5 too many filtered rows 2.BE2.1 Have not get FE Master …

python:大文件分批/塊導入數據庫方式記錄

一、問題背景 對于數據文件比較大的數據&#xff0c;一次性串聯sql進行入庫&#xff0c;往往會受到數據庫本身對sql長度的限制&#xff0c;從而需要分塊或者分批次&#xff0c;將大數據文件一點一點的進行入庫。特針對這種入庫方式&#xff0c;進行一個簡單記錄&#xff0c;各…

spring的控制反轉(IoC)容器作用是什么?

控制反轉&#xff08;Inversion of Control&#xff0c;IoC&#xff09;容器是一種強大的設計模式&#xff0c;在現代軟件開發&#xff0c;特別是在使用Spring框架等企業級Java應用中至關重要。IoC容器主要作用是管理應用程序中對象的生命周期和依賴關系。我會逐步解釋它的作用…

YOLOv8改進 | 主干網絡 | 增加網絡結構增強小目標檢測能力【獨家創新——附結構圖】

??????本專欄所有程序均經過測試,可成功執行?????? 在目標檢測領域內,盡管YOLO系列的算法傲視群雄,但在某些方面仍然存在改進的空間。在YOLOv8提取特征的時候,由于卷積的緣故,會導致很多信息的丟失。對于小目標來說更是如此,這樣將大幅度降低小目標的檢測能…

pinpoint服務監控

Pinpoint是一個開源的APM&#xff08;應用性能管理&#xff09;系統&#xff0c;主要用于監控和管理Java應用程序的性能。它提供了實時的性能指標、分布式追蹤和診斷等功能&#xff0c;幫助開發和運維快速定位和解決應用程序中的性能問題。 pinpoint其他部分不變&#xff0c;H…

正確可用--Notepad++批量轉換文件編碼為UTF8

參考了:Notepad批量轉換文件編碼為UTF8_怎么批量把ansi轉成utf8-CSDN博客??????https://blog.csdn.net/wangmy1988/article/details/118698647我參考了它的教程,但是py腳本寫的不對. 只能改一個.不能實現批量更改. 他的操作步驟沒問題,就是把腳本代碼換成我這個. #-*-…

graspnet+Astra2相機實現部署

graspnetAstra2相機實現部署 &#x1f680; 環境配置 &#x1f680; ubuntu 20.04Astra2相機cuda 11.0.1cudnn v8.9.7python 3.8.19pytorch 1.7.0numpy 1.23.5 1. graspnet的復現 具體的復現流程可以參考這篇文章&#xff1a;Ubuntu20.04下GraspNet復現流程 這里就不再詳細…

數據庫系統概論(第5版)復習筆記

筆記的Github倉庫地址 &#x1f446;這是筆記的gihub倉庫&#xff0c;內容是PDF格式。 因為圖片和代碼塊太多&#xff0c;放到CSDN太麻煩了&#xff08;比較懶&#x1f923;&#xff09; 如果感覺對各位有幫助的話歡迎點一個?\^o^/

41-4 DDOS攻擊防護實戰

一、UDP FLOOD攻擊 # hping3 -q -n -a <攻擊IP> -S -s <源端口> --keep -p <目的端口> --flood <被攻擊IP> hping3 --udp -s 6666 -p 53 -a 192.168.1.6 --flood 192.168.1.13 這個命令是使用hping3工具進行UDP Flood攻擊的命令。下面是各個選項的作…

three.js能實現啥效果?看過來,這里都是它的菜(06)

這是第五期了&#xff0c;本期繼續分享three.js可以實現的3D動畫案例&#xff0c;有老鐵反饋再發案例的時候&#xff0c;是否可以順道分享一下three.js的知識點&#xff0c;好吧&#xff0c;安排。 材質動畫 材質動畫可以實現各種復雜的視覺效果&#xff0c;包括但不限于以下…