偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

MySQL 主從延遲,讀寫分離七種解決方案

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

大家好,我是Tom哥。

我們都知道互聯(lián)網(wǎng)數(shù)據(jù)有個(gè)特性,大部分場(chǎng)景都是 讀多寫少,比如:微博、微信、淘寶電商,按照 二八原則,讀流量占比甚至能達(dá)到 90%。

結(jié)合這個(gè)特性,我們對(duì)底層的數(shù)據(jù)庫(kù)架構(gòu)也會(huì)做相應(yīng)調(diào)整。采用 讀寫分離。

處理過程:

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

看似非常合理,細(xì)想?yún)s不是那么回事。

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

主庫(kù)剛寫完數(shù)據(jù),從庫(kù)還沒來得及拉取最新數(shù)據(jù),讀 請(qǐng)求就來了,給用戶的感覺,數(shù)據(jù)丟了?

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

一、強(qiáng)制走主庫(kù)

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

場(chǎng)景一:

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

場(chǎng)景二:

如果對(duì)數(shù)據(jù)的 實(shí)時(shí)性 要求非常高,比如金融類業(yè)務(wù)。我們可以在客戶端代碼標(biāo)記下,讓查詢強(qiáng)制走主庫(kù)。

二、從庫(kù)延遲查詢

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

比如:

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

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

因?yàn)槭遣捎靡坏肚?,?dāng)面對(duì)高并發(fā)業(yè)務(wù)場(chǎng)景時(shí),性能會(huì)下降的非常厲害,一般不推薦這個(gè)方案。

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

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

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

方案一:

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

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

方案二:

比較主從庫(kù)的文件點(diǎn)位。

還是執(zhí)行 show slave status,響應(yīng)結(jié)果里有截個(gè)關(guān)鍵參數(shù)。

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

兩兩比較,上面的參數(shù)是否相等。

方案三:

比較 GTID 集合。

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

比較 Retrieved_Gtid_Set 和 Executed_Gtid_Set 的值是否相等。

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

缺點(diǎn):

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

針對(duì)這個(gè)問題,有什么解決方案?

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

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

問題是不是一下簡(jiǎn)單多了。

四、從庫(kù)節(jié)點(diǎn)判斷主庫(kù)位點(diǎn)

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

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

缺點(diǎn):

master_pos_wait 返回結(jié)果無法與具體操作的數(shù)據(jù)行做關(guān)聯(lián),所以每次接收讀請(qǐng)求時(shí),從庫(kù)還是無法確認(rèn)是否已經(jīng)同步數(shù)據(jù),方案實(shí)用性不高。

五、比較 GTID

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

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

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

處理流程:

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

缺點(diǎn):

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

六、引入緩存中間件

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

處理過程:

  • 客戶端 寫 SQL ,操作主庫(kù)。
  • 同步將緩存中的數(shù)據(jù)刪除。
  • 當(dāng)客戶端讀數(shù)據(jù)時(shí),優(yōu)先從緩存加載。
  • 如果 緩存中沒有,會(huì)強(qiáng)制查詢主庫(kù)預(yù)熱數(shù)據(jù)。

缺點(diǎn):

K-V 存儲(chǔ),適用一些簡(jiǎn)單的查詢條件場(chǎng)景。如果復(fù)雜的查詢,還是要查詢從庫(kù)。

七、數(shù)據(jù)分片

參考 Redis Cluster 模式, 集群網(wǎng)絡(luò)拓?fù)渫ǔJ?3主 3從,主節(jié)點(diǎn)既負(fù)責(zé)寫,也負(fù)責(zé)讀。

通過水平分片,支持?jǐn)?shù)據(jù)的橫向擴(kuò)展。由于每個(gè)節(jié)點(diǎn)都是獨(dú)立的服務(wù)器,可以提高整體集群的吞吐量。

轉(zhuǎn)換到數(shù)據(jù)庫(kù)方面

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

責(zé)任編輯:姜華 來源: 微觀技術(shù)
相關(guān)推薦

2025-02-24 16:00:00

SpringBoot定時(shí)任務(wù)開發(fā)

2017-12-27 13:07:52

數(shù)據(jù)庫(kù)MySQL主從復(fù)制

2021-11-29 09:15:57

Github網(wǎng)絡(luò)Python

2022-03-30 07:52:16

.NET應(yīng)用程序C#

2010-10-15 10:02:01

Mysql表類型

2019-07-16 06:30:19

MySQL同步延遲數(shù)據(jù)庫(kù)

2025-03-31 10:40:52

2022-12-30 17:52:44

分布式容錯(cuò)架構(gòu)

2024-08-01 11:38:40

2023-09-19 15:33:50

Web實(shí)時(shí)消息推送

2024-03-08 17:54:44

MySQL函數(shù)數(shù)據(jù)

2017-08-31 14:57:53

數(shù)據(jù)庫(kù)MySQLJOIN

2025-05-13 08:20:58

2024-11-28 09:37:28

2025-04-07 04:45:00

數(shù)據(jù)架構(gòu)訂單

2018-04-08 15:20:15

數(shù)據(jù)庫(kù)MySQL主從復(fù)制

2011-08-30 13:08:55

Mysql ProxyLua分離

2011-02-17 15:26:27

IADVoIPPPPoE

2022-07-30 10:08:06

MQTT?協(xié)議物聯(lián)網(wǎng)

2019-10-29 06:30:31

告警疲勞網(wǎng)絡(luò)安全安全風(fēng)險(xiǎn)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)