亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL處理DB讀寫分離數(shù)據(jù)不一致問題的方案

 更新時間:2024年02月21日 08:40:58   作者:嗨森bao  
在互聯(lián)網中大型項目中,讀寫分離應該是我們小伙伴經常聽說的,這個主要解決大流量請求時,提高系統(tǒng)的吞吐量,本文給大家介紹了MySQL處理DB讀寫分離數(shù)據(jù)不一致問題的方案,需要的朋友可以參考下

前言

在互聯(lián)網中大型項目中,讀寫分離應該是我們小伙伴經常聽說的,這個主要解決大流量請求時,提高系統(tǒng)的吞吐量。因為絕大部分互聯(lián)網產品都是讀多寫少,大部分都是讀請求,很小部分是寫請求。

在這里插入圖片描述

1)一個主庫負責寫請求,更新數(shù)據(jù)

2)兩個從庫負責讀請求,可以提高系統(tǒng)吞吐量

3)主庫和從庫之間同步數(shù)據(jù)

為什么產生數(shù)據(jù)不一致

在這里插入圖片描述

上圖中業(yè)務流程

1)寫請求A進行數(shù)據(jù)更新,但寫庫還沒有來得及把更新的數(shù)據(jù)更新到讀庫
2)讀請求B進行數(shù)據(jù)查詢,請求B是訪問的讀庫,獲取的是舊值
3)因為寫庫和讀庫之間存在同步延遲,導致數(shù)據(jù)在不同庫中不一致

讀寫庫數(shù)據(jù)不一致問題我們如何解決?

方案一:利用數(shù)據(jù)庫自身特性

我們一般用的數(shù)據(jù)庫是mysql和oracle,mysql是我們互聯(lián)網項目都會用到的,oracle一般大公司用的比較多(很貴啊)。

我們分析一下問題,原因就是在主庫(寫庫)與從庫(讀庫)之間數(shù)據(jù)同步延遲導致,mysql中有全同步復制機制、半同步復制、異步復制三種復制方案(小伙伴可以自行去了解)。

mysql全同步復制

在這里插入圖片描述

全同步復制,當A提交更新請求主庫事務之后,不是立即返回,而是等到所有的從庫節(jié)點必須收到、APPLY并且提交這些事務,主庫線程才返回請求A結果,才能做后續(xù)操作。這樣就解決了數(shù)據(jù)同步延遲的問題。

問題:但這個同步方案嚴重的問題就是寫請求耗時會很長,而且會隨者從庫數(shù)量增加,耗時也會增加。(不推薦)

oracle共享存儲

在這里插入圖片描述

上圖采用了oracle RAC方案,DB服務其實就代表一個應用服務,所有的數(shù)據(jù)存儲在同一個地方,所有就不存在數(shù)據(jù)同步這個問題。當然這個部署方案不是我們嚴格意義上面的讀寫分離,存儲是獨立的。

方案二:不解決

我們設計任何架構方案,都要圍繞著業(yè)務,如果業(yè)務能夠接受可以不解決;其實很多互聯(lián)網產品都有短時間的數(shù)據(jù)不一致問題。如:58同城,美團,貼吧等。

但有些場景是不允許的。如

在這里插入圖片描述

上圖中:

1)用戶寫了一篇文章,點擊保存按鈕
2)系統(tǒng)執(zhí)行保存方法,提示用戶保存成功
3)保存成功后一般系統(tǒng)就會立即跳轉到文章列表,按照時間倒序,最新的文章排在第一個,這個業(yè)務是很正常的,讓用戶可以看到自己的文章列表
4)這樣就是調用獲取文章列表的方法getArticleList,但這個方法是讀請求,走的是從庫。
5)如果出現(xiàn)主庫和從庫同步延遲,就出現(xiàn)了不一致。

方案三:客戶端保存法

這個方案是:一些業(yè)務的操作是有前端頁面的,不管是網頁或App等。此方案的思路就是把之前保存的文章緩存到客戶端,在用戶到文章列表時,數(shù)據(jù)的組成就是(客戶端緩存文章 + 后端讀庫返回的文章數(shù)據(jù))。客戶端要做的就是緩存要設置一個時間(這個緩存時間,可以預估主庫同步到從庫的時間延遲);以及要做文章去重,防止讀庫已經同步完成,客戶端緩存沒有過期。

問題:客戶端邏輯復雜;客戶端有緩存數(shù)據(jù)大小的限制,不能保存大數(shù)據(jù)。列表分頁處理復雜。

方案四:緩存標記法

在這里插入圖片描述

上圖流程:

1)A發(fā)起寫請求,更新了主庫,但在緩存中設置一個標記,代表此數(shù)據(jù)已經更新,標記格式(業(yè)務代號:數(shù)據(jù)庫:表:主鍵ID)根據(jù)自己業(yè)務場景。
2)設置此標記,要加上過期時間,可以為預估的主庫和從庫同步延遲的時間
3)B發(fā)起讀請求的時候,先判斷此請求的業(yè)務在緩存中有沒有更新標記
4)如果存在標記,走主庫;如果沒有走從庫。

這個方案就有效了解決了數(shù)據(jù)不一致的問題。

但這個方案會有個嚴重的問題,也就是每次的讀請求都要到緩存中去判斷是否存在緩存標記,如果是單機部署用的是jvm緩存,對性能還好;但如果是集群部署緩存肯定用redis,每次讀都要和redis進行交互,這樣肯定會影響系統(tǒng)吞吐量。

那怎么辦?怎么辦?繼續(xù)往下看

方案五:本地緩存標記

在這里插入圖片描述

上圖流程:

1)用戶A發(fā)起寫請求,更新了主庫,并在客戶端設置標記,過期時間,如:cookies
2)用戶A再發(fā)起讀請求時,帶上這個本地標記在后端
3)后端在處理請求時,獲取請求傳過來的數(shù)據(jù),看有沒有這個標記(如:cookies)
4)有這個業(yè)務標記,走主庫;沒有走從庫。

這個方案就保證了用戶A的讀請求肯定是數(shù)據(jù)一致的,而且沒有性能問題,因為標記是本地客戶端傳過去的。

但有寫小伙伴就會問那其他用戶在本地客戶端是沒有這個標記的,他們走的就是從庫了。那其他用戶不就看不到這個數(shù)據(jù)了嗎?說的對,其他用戶是看不到,但看不到的時間很短,過個1~10秒就能夠看到。

但這個方案解決了當前用戶的數(shù)據(jù)一致性的問題,如上面舉的例子,寫文章,然后到文章列表,本用戶是能夠看到的。其他用戶暫時看不到是沒有關系的。還是那句話,脫離業(yè)務的方案是耍流氓。(推薦)

那DB讀寫分離情況下,如何解決緩存和數(shù)據(jù)庫不一致性問題呢?

方案一:延遲消息

其實在真實業(yè)務中,尤其互聯(lián)網項目中,數(shù)據(jù)短時間的不一致時能夠接受的。就像怎么解決DB讀寫分離,導致數(shù)據(jù)不一致問題?中提到的本地緩存標記法,保證了本用戶數(shù)據(jù)一致,其他用戶可暫時不一致,但最終是一致的這個思路。我們可以設置一個延遲消息,如下圖

在這里插入圖片描述

流程:

1)在訂閱到binlog更新日志時,先不刪除緩存,而是投遞一個延遲消息(如:延遲10秒的消息,就是過10秒此消息才會被消費者監(jiān)聽到,從而被消費)

2)延遲消息的延遲時間,設置為主庫與從庫的數(shù)據(jù)同步延遲的時間,可自行預估

3)監(jiān)聽到延遲消息,在刪除緩存。

這個方案的特點就是讀請求會在延遲時間內讀取到的是舊值,等到延遲時間一過,取到的就是新值。這個業(yè)務在互聯(lián)網產品中是允許的。

如果要保證本用戶(更新數(shù)據(jù)的用戶)一定讀到的是新值,這邊可以采用本地緩存標記方案,直接從主數(shù)據(jù)庫讀取,讀取到數(shù)據(jù)后,可以把新值設置到緩存中,這樣就保證了數(shù)據(jù)一致性。

方案二:更新用戶再次發(fā)起讀請求

在方案一中,其他用戶的讀請求會有暫時間讀取到的是舊值,如何縮短時間?其實是有一個方案,就是讓更新用戶再次發(fā)起讀請求,也就是在方案一最后提到的

1)更新用戶再次發(fā)起讀請求,根據(jù)本地緩存標記,直接走主數(shù)據(jù)庫,讀取的肯定是新值,

2)再把這個新值設置到緩存中。這樣就保證了緩存中的是新值,雖然從庫還沒有不同完成,但緩存中已經是新值了。

3)最后從庫同步數(shù)據(jù)完成,值就達到了一致性

以上就是MySQL處理DB讀寫分離數(shù)據(jù)不一致問題的方案的詳細內容,更多關于MySQL DB讀寫分離數(shù)據(jù)不一致的資料請關注腳本之家其它相關文章!

相關文章

  • 解決hibernate+mysql寫入數(shù)據(jù)庫亂碼

    解決hibernate+mysql寫入數(shù)據(jù)庫亂碼

    初次沒習hibernate,其中遇到問題在網上找的答案與大家共同分享!
    2009-07-07
  • 深入mysql主從復制延遲問題的詳解

    深入mysql主從復制延遲問題的詳解

    本篇文章是對mysql中主從復制延遲的問題進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • MySQL開啟慢查詢日志功能的方法

    MySQL開啟慢查詢日志功能的方法

    今天小編就為大家分享一篇關于MySQL開啟慢查詢日志功能的方法,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Mysql的游標的定義使用及關閉深入分析

    Mysql的游標的定義使用及關閉深入分析

    于游標的用法Mysql現(xiàn)在提供的還很特別,雖然使用起來沒有PL/SQL那么順手,不過使用上大致上還是一樣,本文將詳細介紹一下,需要了解的朋友可以參考下
    2012-12-12
  • 在centOS 7安裝mysql 5.7的詳細教程

    在centOS 7安裝mysql 5.7的詳細教程

    這篇文章主要介紹了在centOS 7安裝mysql 5.7的詳細教程,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2016-12-12
  • MySQL?Workbench菜單漢化為中文的簡單操作方法

    MySQL?Workbench菜單漢化為中文的簡單操作方法

    這篇文章主要給大家介紹了關于MySQL?Workbench菜單漢化為中文的簡單操作方法,文中通過圖文及實例代碼介紹的非常詳細,對大家學習或者使用MySQL?Workbench具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-11-11
  • MySql統(tǒng)計函數(shù)COUNT的具體使用詳解

    MySql統(tǒng)計函數(shù)COUNT的具體使用詳解

    本文主要介紹了MySql統(tǒng)計函數(shù)COUNT的具體使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • mysql alter語句用法實例

    mysql alter語句用法實例

    這里簡單分享幾個mysql alter語句用法,方便大家使用
    2013-02-02
  • 通過兩種方式增加從庫——不停止mysql服務

    通過兩種方式增加從庫——不停止mysql服務

    現(xiàn)在生產環(huán)境MySQL數(shù)據(jù)庫是一主一從,由于業(yè)務量訪問不斷增大,故再增加一臺從庫。前提是不能影響線上業(yè)務使用,也就是說不能重啟MySQL服務,為了避免出現(xiàn)其他情況,選擇在網站訪問量低峰期時間段操作
    2015-11-11
  • MySQL中create_time和update_time實現(xiàn)自動更新時間

    MySQL中create_time和update_time實現(xiàn)自動更新時間

    mysql建表的時候有兩個列,一個是createtime、另一個是updatetime,這兩個都是mysql自動填充時間的方式,本文就詳細的介紹這兩種方式的實現(xiàn),感興趣的可以了解一下
    2023-05-05

最新評論