數據一致性解決方案總結

數據一致性解決方案總結

我們在系統中,主要進行了數據冗余,那么就會帶來數據一致性的問題。常見的數據一致性問題有:數據庫主從同步延遲導致的讀數據不一致;數據庫主主之間數據的不一致;緩存和數據庫之間的數據不一致。

一、數據庫主從數據不一致解決方案

問題產生:

? 數據庫主從數據不一致問題的產生一般是由于數據庫主從同步時延導致的,當我們往主庫中寫數據之后,立刻對這個數據發起了讀請求,但是此時可能數據還沒有從主庫同步到從庫中,從而產生了數據不一致的問題。

解決方案:

? 我們可以借助于一個緩存,當我們操作數據庫主庫的時候,我們同時往緩存中放入一個 “數據庫名稱:表名稱:主鍵” 組合的key,然后過期時間設置為主從同步的時延,當我們發起讀請求的時候,會先去判斷這個key是否存在,如果存在會強制要求讀主庫,如果這個key不存在,則去讀取從庫

二、數據庫主主之間數據不一致問題解決方案

問題產生:

? 主庫與主庫之間數據不一致問題,一般出現在兩個主庫都提供寫服務的時候,當兩個主庫都對外提供寫服務的時候,同時兩個主庫之間是需要進行數據同步的,那么可能會產生相同主鍵的數據被覆蓋掉的問題

解決方案:

? 1.只有一個主庫對外提供寫服務,另外一個主庫作為一個影子主庫,當主庫宕機之后,立刻將流量切換到這個影子主庫中

? 2.如果使用數據表的主鍵遞增,那么兩個主庫中的表的起始ID不同步長相等,這樣可以防止同步的時候,相同主鍵的數據被覆蓋掉

? 3.在業務層使用分布式ID發號器生成全局唯一的ID進行插入

三、緩存數據庫數據不一致解決方案

問題產生:

? 當我們使用了緩存的時候,有一個無法避免的問題就是,先操作數據庫還是先操作緩存,大部分業務都是需要先操作數據庫的,如果更新數據庫的數據成功,但是緩存操作還沒有完成,此時讀取操作從緩存中讀取到的就是臟數據

解決方案:

? 常見的緩存和數據庫數據的更新有兩大類分別是:

? 1.寫時緩存

? 寫時緩存就是 先更新數據庫,然后再更新緩存 ,這種方案有個問題,那就是 容易出現讀到臟數據的問題 ,比如一個線程更新完數據庫后還沒有更新完緩存,此時有另一個線程來讀取緩存,那么就會讀取到之前的老數據。

? 但是寫時緩存的這個問題也不是沒有解決辦法,那就是 通過加鎖,讓更新數據庫和更新緩存同時只能有一個線程來操作 ,但是這個解決方案的顯著問題就是系統性能會變得很差。但是并不是說這種方案沒有好處,它的好處就是 數據的實時性強 。線程讀到的一定是最新的數據。對于對數據一致性有很強要求的場景比如 ‘金融系統’,這種方案是可以考慮的。

? 但是這種方案還有一個缺點就是: 如果對緩存的更新失敗,需要寫操作才能重新操作緩存 ,但是對于大部分業務來說,都是讀多寫少。這個原因其實也是寫時緩存方案使用少的 主要原因

? 2.讀時緩存

? 讀時緩存就是 先更新數據庫,然后將緩存刪除,等下次讀取操作到來時,去更新最新的緩存數據

? 注意:對于 單機的數據庫 來說是可以的,但是如果是對于 主從架構 的數據庫來說, 可能不太適用 ,因為會帶來更多的讀取臟數據問題。

? 對于數據庫主從架構的系統來說,讀時緩存有兩個常用的方案:

? 1.延遲雙刪方案

? 更新數據庫的時候,刪除緩存 ,同時可以引入消息中間件mq來 發送一個延遲消息延遲一個時間之后再去刪除一次緩存 。這種方案是為了 保證最終一致性 ,對于強一致性的實現支持不太好。

? 2.訂閱binlog刪除緩存方案

? 更新數據庫的時候,等到slave數據庫接收到master的binlog之后再去刪除緩存 。這種方案也是為了 保證最終一致性 ,對于強一致性的實現支持不太好。

四、Redis Sentinel模式下的主從數據不一致問題解決方案

問題產生:

? 當我們使用Redis的Sentinel模式進行部署的時候,會遇到我們往主節點中寫入數據,但是數據還沒有同步到從節點中,此時又有讀請求到來,讀請求分配到了從節點上,就無法讀取到最新的數據。

解決方案:

? 1.對于數據一致性要求非常強的業務場景,比如‘金融行業’我們可以在業務層使用LettuceJedis Cluster客戶端來將讀請求強制指定到讀取主節點中的數據

? 2.使用 min-slaves-to-writemin-slaves-max-lag 配置主節點寫入條件,當主節點和指定數量的從節點完成同步之后才給主節點返回寫入成功,這個方案會損失一定的寫入可用性

e** 和 min-slaves-max-lag 配置主節點寫入條件,當主節點和指定數量的從節點完成同步之后才給主節點返回寫入成功,這個方案會損失一定的寫入可用性

后續如果我遇到其他數據不一致的情況,會持續進行更新

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

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

相關文章

17.Spring Boot的Bean詳解(新手版)

文章目錄1. 什么是Bean?從零開始理解1.1 Bean的定義1.2 為什么需要Bean?1.3 Bean vs 普通對象的區別2. Spring容器:Bean的家2.1 什么是Spring容器?2.2 容器的工作流程3. Bean的聲明方式詳解3.1 使用Component及其專門化注解3.1.1 …

cherryStudio electron因為環境問題無法安裝解決方法或打包失敗解決方法

$env:ELECTRON_MIRROR"https://npmmirror.com/mirrors/electron/"; $env:ELECTRON_CUSTOM_DIR"{{ version }}"; yarn install1. 上面是關于electron安裝失敗的解決方法. 也可以通過到git上下面包,解壓后,放到對應的目錄下面,并把里面的build文件夾刪除, b…

微服務架構中數據一致性保證機制深度解析

在微服務架構中,數據一致性是分布式系統設計的核心挑戰。由于服務拆分后數據自治(每個服務獨立數據庫),跨服務操作的一致性保障需突破傳統單體事務的局限。本文從一致性模型、核心解決方案、技術實現及面試高頻問題四個維度&#…

【Gin】HTTP 請求調試器

文章目錄 項目概述代碼功能詳解1. 導入必要的包2. 主函數和路由設置3. 請求信息捕獲4. 請求參數和頭信息5. 請求體處理5.1 JSON 數據處理5.2 表單數據處理5.3 Multipart 表單數據處理5.4 其他類型數據處理6. 構造響應對象7. 返回 JSON 響應功能特點使用場景完整代碼項目概述 這…

物聯網(IoT)領域的協議

物聯網(IoT)領域的通信協議種類繁多,不同協議適用于不同的應用場景(如低功耗設備、工業自動化、家庭智能設備等)。以下是主要物聯網協議的分類及詳細解釋:一、物聯網協議分類物聯網協議通常分為兩大類&…

專題一_雙指針_四數之和

一:題目解析 題目鏈接:18. 四數之和 - 力扣(LeetCode) 注:本題是在上題的基礎上講解的:專題一_雙指針_三數之和-CSDN博客 解析:和三數之區別在于找四元組和為targe的數字 而不是0 二&#xff1a…

Spring Boot多數據源配置詳解

Spring Boot多數據源配置詳解 在實際企業開發中,隨著業務復雜度提升,單一數據源已無法滿足所有場景需求。比如:讀寫分離、分庫分表、數據遷移、微服務整合等,這時就需要用到多數據源配置。本文將從原理、配置、常見問題和最佳實踐…

項目進度嚴重依賴關鍵人,如何分散風險

項目進度嚴重依賴關鍵人的風險,可以通過建立知識共享機制、強化團隊協作模式、實施交叉培訓和培養后備人才、優化流程標準化等措施有效分散。其中,實施交叉培訓和培養后備人才尤為重要,通過培養多個成員具備相似的關鍵技能,能夠迅…

【RK3568+PG2L50H開發板實驗例程】FPGA部分 | 以太網傳輸實驗例程

本原創文章由深圳市小眼睛科技有限公司創作,版權歸本公司所有,如需轉載,需授權并注明出處(www.meyesemi.com)1.實驗簡介實驗目的:完成 DDR3 的讀寫測試。實驗環境:Window11 PDS2022.2-SP6.4芯片型號&#x…

《每日AI-人工智能-編程日報》--2025年7月9日

介紹:AI 方面1. Manus 通用智能體初成型,開啟 AIAgent 新時代?中泰證券發布研報稱,首款通用型 AI 智能體 Manus 已問世,能夠將復雜任務拆解為可執行的步驟鏈,并在虛擬環境中靈活調用工具,標志著 AI 從 “Reasoner” 走…

MyBatis之數據操作增刪改查基礎全解

目錄 1. ?MyBatis添加數據 1.1. 持久層接口添加方法 1.2. 映射文件添加標簽 1.3. 編寫測試方法 2. ??MyBatis修改數據 2.1. 代碼的優化 2.2. 持久層接口添加方法 2.3. 映射文件添加標簽 2.4. 編寫測試方法 3. 🗑?MyBatis刪除數據與根據Id查詢 3.1. 刪…

kbmMemTable Pro 7.82 Delphi 11 源代碼

kbmMemTable Pro 7.82 Delphi 11 源代碼KbmMemTable 是一個用于在 Win 32/64、Mac OS、Android 和 iOS 32/64 應用程序中存儲臨時數據的組件,這些應用程序可以使用 RAD Studio、Delphi、C Builder 或 FPC 等編程語言創建,同時您還可以高速訪問存儲在數據…

LeetCode Hot 100 除自身以外數組的乘積

給你一個整數數組 nums,返回 數組 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。題目數據 保證 數組 nums之中任意元素的全部前綴元素和后綴的乘積都在 32 位 整數范圍內。請 不要使用除法,且在 O(n) 時間復雜度內…

VC Code--常用的配置

原文網址:VC Code--常用的配置-CSDN博客 簡介 本文介紹VC Cod常用的配置。 1.字體大小 整體字體大小 左下角齒輪> Settings> Windows> Window: Zoom Level> 改為:2 編輯器字體大小(如果調整了整體字體大小,此處…

大模型驅動的智能體:從GPT-4到o1的能力躍升

大模型驅動的智能體:從GPT-4到o1的能力躍升 🌟 嗨,我是IRpickstars! 🌌 總有一行代碼,能點亮萬千星辰。 🔍 在技術的宇宙中,我愿做永不停歇的探索者。 ? 用代碼丈量世界&#xf…

200nl2sql

‘train_runtime’: 1375.1089, ‘train_samples_per_second’: 0.025, ‘train_steps_per_second’: 0.007, ‘train_loss’: 0.0, ‘num_tokens’: 115914.0, ‘completions/mean_length’: 76.4125, ‘completions/min_length’: 27.8, ‘completions/max_length’: 151.2, …

Transformer、BERT、GPT以及Embedding之間的關系

1. Transformer架構的兩大方向 Transformer分為兩大類應用,但劃分標準不是"分類vs生成",而是編碼方式: Encoder架構(代表:BERT): 使用Transformer的??編碼器??(Encode…

ARM匯編編程(AArch64架構)課程 - 第7章:SIMD與浮點運算

目錄1. NEON寄存器關鍵特性數據排列示例2. 浮點指令2.1 FMUL指令2.2 FADD指令2.3 FCMP指令1. NEON寄存器 AArch64架構提供32個128位NEON向量寄存器(V0-V31),支持SIMD并行計算 關鍵特性 寄存器類型數量位寬數據視圖Q寄存器32128bQ0-Q31D寄存…

Word2Vec模型詳解:CBOW與Skip-gram

Word2Vec模型詳解:CBOW與Skip-gram 目錄 模型概述理論基礎CBOW模型詳解Skip-gram模型詳解模型對比代碼實現詳解訓練過程分析應用場景實驗結果總結 模型概述 Word2Vec是一種用于生成詞向量的神經網絡模型,由Google在2013年提出。它包含兩種主要架構&am…

跨服務sqlplus連接oracle數據庫

背景:ogg程序同步數據。 目標庫:客戶oracle數據庫11.0.2.4.0,也就是11g的數據庫。源庫:業務組搭建的19c數據庫,剛安裝的oracle數據庫。ogg在源庫和目標庫系統都部署好了并且也可以通信。在目標庫系統使用sqlplus測試連…