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

分享MySQL?主從延遲與讀寫分離的七種解決方案

 更新時間:2022年03月28日 11:33:08   作者:微觀技術  
這篇文章主要介紹了分享MySQL?主從延遲與讀寫分離的七種解決方案,常見的解決方式是分庫分表,每次讀寫都是操作主庫的一個分表,從庫只用來做數據備份。當主庫發(fā)生故障時,主從切換,保證集群的高可用性,下面詳細的相關資料介紹,需要的小伙伴可以參考一下

前言:

我們都知道互聯網數據有個特性,大部分場景都是 讀多寫少,比如:微博、微信、淘寶電商,按照 二八原則,讀流量占比甚至能達到 90%。

結合這個特性,我們對底層的數據庫架構也會做相應調整。采用 讀寫分離。

處理過程:

  • 客戶端會集成 SDK,每次執(zhí)行 SQL 時,會判斷是 寫 或 讀 操作。
  • 如果是 寫 SQL,請求會發(fā)到 主庫。
  • 主數據庫執(zhí)行SQL,事務提交后,會生成 binlog ,并同步給 從庫。
  • 從庫 通過 SQL 線程回放 binlog ,并在從庫表中生成相應數據。
  • 如果是 讀 SQL,請求會通過 負載均衡 策略,挑選一個 從庫 處理用戶請求。

看似非常合理,細想卻不是那么回事。

主庫 與 從庫 是采用異步復制數據,如果這兩者之間數據還沒有同步怎么辦?

主庫剛寫完數據,從庫還沒來得及拉取最新數據,讀 請求就來了,給用戶的感覺,數據丟了?

針對這個問題,今天,我們就來探討下有什么解決方案?

一、強制走主庫

針對不用的業(yè)務訴求,區(qū)別性對待。

場景一:

如果是對數據的 實時性 要求不是很高,比如:大V有千萬粉絲,發(fā)布一條微博,粉絲晚幾秒鐘收到這條信息,并不會有特別大的影響。這時,可以走 從庫。

場景二:

如果對數據的 實時性 要求非常高,比如金融類業(yè)務。我們可以在客戶端代碼標記下,讓查詢強制走主庫。

二、從庫延遲查詢

由于主從庫之間數據同步需要一定的時間間隔,那么有一種策略是延遲從從庫查詢數據。

比如:

select sleep(1)
select * from order where order_id=11111;

在正式的業(yè)務查詢時,先執(zhí)行一個sleep 語句,給從庫預留一定的數據同步緩沖期。

因為是采用一刀切,當面對高并發(fā)業(yè)務場景時,性能會下降的非常厲害,一般不推薦這個方案。

三、判斷主從是否延遲?決定選主庫還是從庫

之前寫過一篇文章 《京東一面:MySQL 主備延遲有哪些坑?主備切換策略 》。

有講過 什么是主備延遲?、主備延遲的常見原因?

方案一:

在從庫 執(zhí)行 命令 show slave status。

查看seconds_behind_master 的值,單位為秒,如果為 0,表示主備庫之間無延遲。

方案二:

比較主從庫的文件點位。

還是執(zhí)行show slave status,響應結果里有截個關鍵參數。

  • Master_Log_File 讀到的主庫最新文件。
  • Read_Master_Log_Pos 讀到的主庫最新文件的坐標位置。
  • Relay_Master_Log_File 從庫執(zhí)行到的最新文件。
  • Exec_Master_Log_Pos 從庫執(zhí)行到的最新文件的坐標位置。

兩兩比較,上面的參數是否相等。

方案三:

比較 GTID 集合。

  • Auto_Position=1 主從之間使用 GTID 協議。
  • Retrieved_Gtid_Set 從庫收到的所有binlog日志的 GTID 集合。
  • Executed_Gtid_Set 從庫已經執(zhí)行完成的 GTID 集合。

比較 Retrieved_Gtid_Set Executed_Gtid_Set 的值是否相等。

在執(zhí)行業(yè)務SQL操作時,先判斷從庫是否已經同步最新數據。從而決定是操作主庫,還是操作從庫。

缺點:

無論采用上面哪一種方案,如果主庫的寫操作頻繁不斷,那么從庫的值永遠跟不上主庫的值,那么讀流量永遠是打在了主庫上。

1.針對這個問題,有什么解決方案?

這個問題跟 MQ消息隊列 既要求高吞吐量又要保證順序是一樣的,從全局來看確實無解,但是縮小范圍就容易多了,我們可以保證一個分區(qū)內的消息有序。

回到 主從庫 之間的數據同步問題,從庫查詢哪條記錄,我們只要保證之前對應的寫binglog已經同步完數據即可,可以不用管主從庫的所有的事務binlog 是否同步。

問題是不是一下簡單多了。

四、從庫節(jié)點判斷主庫位點

在從庫執(zhí)行下面命令,返回是一個正整數 M,表示從庫從參數節(jié)點開始執(zhí)行了多少個事務。

select master_pos_wait(file, pos[, timeout]);
  • file 和 pos 表示主庫上的文件名和位置。
  • timeout 可選, 表示這個函數最多等待 N 秒。

缺點:

master_pos_wait 返回結果無法與具體操作的數據行做關聯,所以每次接收讀請求時,從庫還是無法確認是否已經同步數據,方案實用性不高。

五、比較 GTID

執(zhí)行下面查詢命令:

  • 阻塞等待,直到從庫執(zhí)行的事務中包含gtid_set,返回 0。
  • 超時,返回 1。
select wait_for_executed_gtid_set(gtid_set, 1);

MySQL 5.7.6 版本開始,允許在執(zhí)行完更新類事務后,把這個事務的 GTID 返回給客戶端。具體操作,將參數session_track_gtids 設置為OWN_GTID,調用 API 接口mysql_session_track_get_first 返回結果解析出 GTID。

處理流程:

  • 發(fā)起 寫 SQL 操作,在主庫成功執(zhí)行后,返回這個事務的 GTID。
  • 發(fā)起 讀 SQL 操作時,先在從庫執(zhí)行 select wait_for_executed_gtid_set (gtid_set, 1)。
  • 如果返回 0,表示已經從庫已經同步了數據,可以在從庫執(zhí)行 查詢 操作。
  • 否則,在主庫執(zhí)行 查詢 操作。

缺點:

跟上面的 master_pos_wait 類似,如果 寫操作 與 讀操作 沒有上下文關聯,那么 GTID 無法傳遞 。方案實用性不高。

六、引入緩存中間件

高并發(fā)系統,緩存作為性能優(yōu)化利器,應用廣泛。我們可以考慮引入緩存作為緩沖介質。

處理過程:

  • 客戶端 寫 SQL ,操作主庫。
  • 同步將緩存中的數據刪除。
  • 當客戶端讀數據時,優(yōu)先從緩存加載。
  • 如果 緩存中沒有,會強制查詢主庫預熱數據。

缺點:

K-V 存儲,適用一些簡單的查詢條件場景。如果復雜的查詢,還是要查詢從庫。

七、數據分片

參考 Redis Cluster 模式, 集群網絡拓撲通常是 3主 3從,主節(jié)點既負責寫,也負責讀。

通過水平分片,支持數據的橫向擴展。由于每個節(jié)點都是獨立的服務器,可以提高整體集群的吞吐量。

1.轉換到數據庫方面

常見的解決方式,是分庫分表,每次讀寫都是操作主庫的一個分表,從庫只用來做數據備份。當主庫發(fā)生故障時,主從切換,保證集群的高可用性。

到此這篇關于分享MySQL 主從延遲與讀寫分離的七種解決方案的文章就介紹到這了,更多相關MySQL主從延遲讀寫分離解決方案內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MySQL的savepoint簡介及實例

    MySQL的savepoint簡介及實例

    MySQL中的保存點Savepoint是一個用于控制事務的重要工具,本文主要介紹了MySQL的savepoint簡介及實例,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • Mysql數據庫從5.6.28版本升到8.0.11版本部署項目時遇到的問題及解決方法

    Mysql數據庫從5.6.28版本升到8.0.11版本部署項目時遇到的問題及解決方法

    這篇文章主要介紹了Mysql數據庫從5.6.28版本升到8.0.11版本過程中遇到的問題及解決方法,解決辦法有三種,每種方法給大家介紹的都很詳細,感興趣的朋友跟隨腳本之家小編一起學習吧
    2018-05-05
  • 淺談MYSQL主鍵約束和唯一約束的區(qū)別

    淺談MYSQL主鍵約束和唯一約束的區(qū)別

    本文主要介紹了MYSQL主鍵約束和唯一約束的區(qū)別,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 詳解MySQL下InnoDB引擎中的Memcached插件

    詳解MySQL下InnoDB引擎中的Memcached插件

    這篇文章主要介紹了詳解MySQL下InnoDB引擎中的Memcached插件,并且給出了實例演示,需要的朋友可以參考下
    2015-04-04
  • 通過MySQL日志實時查看執(zhí)行語句以及更新日志的教程

    通過MySQL日志實時查看執(zhí)行語句以及更新日志的教程

    這篇文章主要介紹了通過MySQL日志實時查看執(zhí)行語句以及更新日志的教程,文中所講的方法使用到了mysqladmin命令,需要的朋友可以參考下
    2015-12-12
  • MySQL最新版8.1.0安裝配置教程(圖文)

    MySQL最新版8.1.0安裝配置教程(圖文)

    MySQL是一種廣泛使用的開源數據庫管理系統,MySQL 8.0是最新版本,它具有更好的性能和安全性,本文主要介紹了MySQL最新版8.1.0安裝配置教程,感興趣的可以了解一下
    2023-09-09
  • MySQL鎖情況查看命令

    MySQL鎖情況查看命令

    本文主要介紹了MySQL鎖情況查看命令,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • MySQL?數據庫范式化設計理論總結

    MySQL?數據庫范式化設計理論總結

    這篇文章主要介紹了MySQL?數據庫范式設計理論總結,數據庫的規(guī)劃化范式設計,在邏輯結構上可以讓結構更加細粒度,容易理解,下文我們就來了解具體的內容介紹吧
    2022-04-04
  • MySQL實現快速刪除所有表而不刪除數據庫的方法

    MySQL實現快速刪除所有表而不刪除數據庫的方法

    這篇文章主要介紹了MySQL實現快速刪除所有表而不刪除數據庫的方法,涉及mysql批量執(zhí)行語句的相關操作技巧,需要的朋友可以參考下
    2017-09-09
  • MySQL 如何查找刪除重復行

    MySQL 如何查找刪除重復行

    對MySQL 如何查找刪除重復行好奇得小伙伴想必也知道MySQL 操作刪除重復行,難免有時會需要查看被刪除的重行,今天小編就來給大家詳解,感興趣的小伙伴可以參考下面的文章內容
    2021-09-09

最新評論