這篇文章將為大家詳細(xì)講解有關(guān)Mysql中讀寫分離過期后怎么解決,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
創(chuàng)新互聯(lián)是專業(yè)的阿巴嘎網(wǎng)站建設(shè)公司,阿巴嘎接單;提供成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行阿巴嘎網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!mysql讀寫分離的坑
讀寫分離的主要目標(biāo)是分?jǐn)傊鲙?kù)的壓力,由客戶端選擇后端數(shù)據(jù)庫(kù)進(jìn)行查詢。還有種架構(gòu)就是在MYSQL和客戶端之間有一個(gè)中間代理層proxy,客戶端之連接proxy,由proxy根據(jù)請(qǐng)求類型和上下文決定請(qǐng)求的分發(fā)路由。
無論使用哪種架構(gòu),由于主從可能存在延遲,客戶端執(zhí)行完一個(gè)更新事務(wù)后馬上發(fā)起查詢,如果查詢選擇的是從庫(kù)的話,就有可能讀到剛剛的事務(wù)更新之前的狀態(tài)。這種“在從庫(kù)上會(huì)讀到系統(tǒng)的一個(gè)過期狀態(tài)”的現(xiàn)象,我們暫且稱之為“過期讀”。
方案一:強(qiáng)制走主庫(kù)方案
將查詢請(qǐng)求分為兩類:
方案二:Sleep方案
主庫(kù)更新后,讀從庫(kù)之前先sleep一下,類似執(zhí)行了select sleep(1)命令,這個(gè)方案的假設(shè)是,大多數(shù)情況下主備延遲在1秒之內(nèi),做一個(gè)sleep可以有很大概率拿到最新的數(shù)據(jù)。
以賣家發(fā)布商品為例,商品發(fā)布后,用Ajax直接把客戶端輸入的內(nèi)容作為“新的商品”顯示在頁(yè)面上,而不是真正地去數(shù)據(jù)庫(kù)做查詢。這樣,賣家就可以通過這個(gè)顯示,來確認(rèn)產(chǎn)品已經(jīng)發(fā)布成功了。等到賣家再刷新頁(yè)面,去查看商品的時(shí)候,其實(shí)已經(jīng)過了一段時(shí)間,也就達(dá)到了sleep的目的,進(jìn)而也就解決了過期讀的問題。
方案三:判斷主備無延遲方案:
第一種方法:先用show slave status結(jié)果里的seconds_behind_master參數(shù)的值,可以用來衡量主備延遲時(shí)間的長(zhǎng)短。先判斷這個(gè)參數(shù)值是否為0,如果不為0,必須等到這個(gè)參數(shù)變?yōu)?才能執(zhí)行請(qǐng)求。
第二種方法:對(duì)比位點(diǎn)確保主備無延遲。
如果Master_Log_File和Relay_Master_Log_File、Read_Master_Log_Pos和Exec_Master_Log_Pos這兩組值完全相同,就表示接收到的日志已經(jīng)同步完成。
第三種方法:對(duì)比GTID(全局事物ID)確保主備無延遲
如果這兩個(gè)集合相同,表示備庫(kù)接收到的日志都已經(jīng)同步完成。
方案四:等主庫(kù)位點(diǎn)方案
select master_pos_wait(file, pos[, timeout]);
這條命令是在從庫(kù)執(zhí)行的 ,參數(shù)file和pos指的是主庫(kù)上的文件名和位置,timeout表示這個(gè)函數(shù)最多等待N秒。
如圖:先執(zhí)行trx1,再執(zhí)行一個(gè)查詢請(qǐng)求的邏輯,要保證能夠查到正確的數(shù)據(jù),我們可以使用
這個(gè)邏輯
1. trx1事物更新完成后,馬上執(zhí)行show master status得到當(dāng)前主庫(kù)執(zhí)行到的File和Position;
2. 選定一個(gè)從庫(kù)執(zhí)行查詢語句;
3. 在從庫(kù)上執(zhí)行select master_pos_wait(File, Position, 1);
4. 如果返回值是>=0的正整數(shù),則在這個(gè)從庫(kù)執(zhí)行查詢語句;
5. 否則,到主庫(kù)執(zhí)行查詢語句。
這里我們假設(shè),這條select查詢最多在從庫(kù)上等待1秒。那么,如果1秒內(nèi)master_pos_wait返回
一個(gè)大于等于0的整數(shù),就確保了從庫(kù)上執(zhí)行的這個(gè)查詢結(jié)果一定包含了trx1的數(shù)據(jù)。
5到主庫(kù)執(zhí)行查詢語句,是這類方案常用的退化機(jī)制。因?yàn)閺膸?kù)的延遲時(shí)間不可控,不能無
限等待,所以如果等待超時(shí),就應(yīng)該放棄,然后到主庫(kù)去查。按照我們?cè)O(shè)定不允許過期讀的要求,就只有兩種選擇,一種是超時(shí)放棄,一種是轉(zhuǎn)到主庫(kù)查詢。
并發(fā)連接和并發(fā)查詢
innodb_thread_concurrency參數(shù)是控制innodb的并發(fā)線程上限。一旦超過這個(gè)數(shù)值,新請(qǐng)求就會(huì)進(jìn)入等待。
關(guān)于Mysql中讀寫分離過期后怎么解決就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。