您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Mysql中讀寫分離過期后怎么解決,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
mysql讀寫分離的坑
讀寫分離的主要目標是分攤主庫的壓力,由客戶端選擇后端數據庫進行查詢。還有種架構就是在MYSQL和客戶端之間有一個中間代理層proxy,客戶端之連接proxy,由proxy根據請求類型和上下文決定請求的分發路由。
無論使用哪種架構,由于主從可能存在延遲,客戶端執行完一個更新事務后馬上發起查詢,如果查詢選擇的是從庫的話,就有可能讀到剛剛的事務更新之前的狀態。這種“在從庫上會讀到系統的一個過期狀態”的現象,我們暫且稱之為“過期讀”。
方案一:強制走主庫方案
將查詢請求分為兩類:
方案二:Sleep方案
主庫更新后,讀從庫之前先sleep一下,類似執行了select sleep(1)命令,這個方案的假設是,大多數情況下主備延遲在1秒之內,做一個sleep可以有很大概率拿到最新的數據。
以賣家發布商品為例,商品發布后,用Ajax直接把客戶端輸入的內容作為“新的商品”顯示在頁面上,而不是真正地去數據庫做查詢。這樣,賣家就可以通過這個顯示,來確認產品已經發布成功了。等到賣家再刷新頁面,去查看商品的時候,其實已經過了一段時間,也就達到了sleep的目的,進而也就解決了過期讀的問題。
方案三:判斷主備無延遲方案:
第一種方法:先用show slave status結果里的seconds_behind_master參數的值,可以用來衡量主備延遲時間的長短。先判斷這個參數值是否為0,如果不為0,必須等到這個參數變為0才能執行請求。
第二種方法:對比位點確保主備無延遲。
如果Master_Log_File和Relay_Master_Log_File、Read_Master_Log_Pos和Exec_Master_Log_Pos這兩組值完全相同,就表示接收到的日志已經同步完成。
第三種方法:對比GTID(全局事物ID)確保主備無延遲
如果這兩個集合相同,表示備庫接收到的日志都已經同步完成。
方案四:等主庫位點方案
select master_pos_wait(file, pos[, timeout]);
這條命令是在從庫執行的 ,參數file和pos指的是主庫上的文件名和位置,timeout表示這個函數最多等待N秒。
如圖:先執行trx1,再執行一個查詢請求的邏輯,要保證能夠查到正確的數據,我們可以使用
這個邏輯
1. trx1事物更新完成后,馬上執行show master status得到當前主庫執行到的File和Position;
2. 選定一個從庫執行查詢語句;
3. 在從庫上執行select master_pos_wait(File, Position, 1);
4. 如果返回值是>=0的正整數,則在這個從庫執行查詢語句;
5. 否則,到主庫執行查詢語句。
這里我們假設,這條select查詢最多在從庫上等待1秒。那么,如果1秒內master_pos_wait返回
一個大于等于0的整數,就確保了從庫上執行的這個查詢結果一定包含了trx1的數據。
5到主庫執行查詢語句,是這類方案常用的退化機制。因為從庫的延遲時間不可控,不能無
限等待,所以如果等待超時,就應該放棄,然后到主庫去查。按照我們設定不允許過期讀的要求,就只有兩種選擇,一種是超時放棄,一種是轉到主庫查詢。
并發連接和并發查詢
innodb_thread_concurrency參數是控制innodb的并發線程上限。一旦超過這個數值,新請求就會進入等待。
關于Mysql中讀寫分離過期后怎么解決就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。