MySQL讀寫分離原理詳細(xì)解析
一、讀寫分離的概念
讀寫分離是基于主從復(fù)制來(lái)實(shí)現(xiàn)的。在實(shí)際的應(yīng)用環(huán)境中,肯定是讀操作多,就像我們?cè)陔娚唐脚_(tái)上去購(gòu)買東西,可能看了100個(gè)也就買了一兩個(gè)。所以讀操作永遠(yuǎn)比寫這種更新操作多很多。所以我們基于主從復(fù)制的讀寫分離配置,就是讓一個(gè)主庫(kù)專門用來(lái)做數(shù)據(jù)的修改,寫的時(shí)候?qū)iT在主庫(kù)上寫,主庫(kù)通過(guò)主從復(fù)制把數(shù)據(jù)的更改通過(guò)binlog同步到從庫(kù)上去,那么其他的客戶端查詢的請(qǐng)求都會(huì)最終映射到從庫(kù)上去,而我們一個(gè)主庫(kù)帶上兩三個(gè)從庫(kù),主庫(kù)專門用來(lái)做數(shù)據(jù)的更新(寫操作),從庫(kù)專門用來(lái)做讀操作這樣一來(lái)可以很好的分?jǐn)傋x寫的壓力,不用全部都集中在主庫(kù)上,對(duì)于后端服務(wù)的并發(fā)處理能力有很大的提高,另外就是它的高可用容災(zāi),當(dāng)主庫(kù)掛了以后,可以把指定的從庫(kù)變成主庫(kù)。

MySQL client通過(guò)mysql 提供的API,用mysql自定義的基于TCP的數(shù)據(jù)協(xié)議(簡(jiǎn)稱mysql協(xié)議)與MySQL Server通信,訪問(wèn)MySQL Server數(shù)據(jù)庫(kù)。
如果只有一臺(tái)服務(wù)器(單機(jī)環(huán)境),所有數(shù)據(jù)的增刪改查都是在一臺(tái)服務(wù)器上進(jìn)行,隨著我們的服務(wù)被越來(lái)越多的人使用,流量逐漸變大,需要并發(fā)能力逐漸提升,所以如果我們發(fā)現(xiàn)數(shù)據(jù)庫(kù)性能到瓶頸了,我們可以做讀寫分離操作,提高后臺(tái)服務(wù)。

圖中的MySQL主服務(wù)器專門做寫操作,下面連著2個(gè)MySQL從服務(wù)器專門做讀操作,讀請(qǐng)求轉(zhuǎn)發(fā)到B、C,寫請(qǐng)求轉(zhuǎn)發(fā)到A。
如果我們?cè)诳蛻舳松现苯佑么a寫死,insert、update等寫操作在A上做,show、select等讀操作在B、C上做,相當(dāng)于代碼和主從環(huán)境就是強(qiáng)綁定的。這就導(dǎo)致代碼的穩(wěn)定性不太好,因?yàn)楹铜h(huán)境強(qiáng)相關(guān)了,我們寫代碼得時(shí)候必須得知道哪個(gè)機(jī)器是負(fù)責(zé)寫操作的主庫(kù),哪個(gè)機(jī)器是負(fù)責(zé)讀操作的從庫(kù),由代碼來(lái)選擇。而這時(shí)如果有某個(gè)機(jī)器掛掉了,代碼也不會(huì)知道,還是按照原來(lái)的方式轉(zhuǎn)發(fā)請(qǐng)求,通信就會(huì)出現(xiàn)問(wèn)題,所以把讀寫分離用代碼實(shí)現(xiàn)肯定不合適。所以在實(shí)際的解決方案中,讀寫分離需要依賴數(shù)據(jù)庫(kù)的中間件。
二、引入中間件MyCat
實(shí)際上,讀寫分離,分庫(kù)分表都是需要依賴數(shù)據(jù)庫(kù)中間件(mycat),mycat就是代理服務(wù)器的角色。

客戶端實(shí)際上區(qū)分不出來(lái)連的是MyCat還是MySQL,因?yàn)橥ㄐ哦际亲袷氐氖荕ySQL通信協(xié)議,之前怎么和MySQL通信,現(xiàn)在就怎么和MyCat通信,所以不用進(jìn)行區(qū)分。
在MyCat上配置讀寫分離,我們?cè)诳蛻舳松系拇a不用做任何變更,代碼上不需要區(qū)分哪個(gè)請(qǐng)求是讀,哪個(gè)請(qǐng)求是寫,代碼直接訪問(wèn)的是MyCat,由MyCat解析請(qǐng)求,根據(jù)SQL的讀寫性質(zhì)轉(zhuǎn)發(fā)到負(fù)責(zé)相應(yīng)操作的服務(wù)器,實(shí)現(xiàn)讀寫分離。
在MyCat上需要配置主服務(wù)器和從服務(wù)器的信息,有3種情況:一主一從、一主多從、多主多從
一主多從場(chǎng)景:當(dāng)寫庫(kù)(master)掛了,MyCat還可以馬上把一個(gè)從庫(kù)(slave)直接變成一個(gè)寫庫(kù)(master),那相當(dāng)于又回到一臺(tái)機(jī)器的處理,因?yàn)閺膸?kù)和從庫(kù)之間并沒有主從復(fù)制的配置,所以我們還需要把變成寫庫(kù)的從庫(kù)還要和其他從庫(kù)之間配置一下主從復(fù)制。
多主多從:

可以看到圖中,MyCat服務(wù)器掛了兩套環(huán)境,如果其中1套的主庫(kù)宕機(jī)了(它對(duì)應(yīng)的從庫(kù)也就不能用了),此時(shí)MyCat會(huì)自動(dòng)切到另一套環(huán)境,因?yàn)?strong>M1和M2之間也是配置成互為主從的,所以M2可以同步M1的數(shù)據(jù),提供與M1環(huán)境完全相同的服務(wù),所以它的高可用容災(zāi)能力是非常不錯(cuò)的。
三、MyCat服務(wù)端口和管理端口
MySQL的服務(wù)端口是3306,MyCat服務(wù)端口是8066(這個(gè)端口也是可以改的),也就是MySQL Client連接的是8066端口,登錄8066端口看到的界面就和登錄MySQL Server的3306端口一樣。MyCat還有一個(gè)管理端口9066,登錄這個(gè)管理端口可以查看MyCat正在工作的所有狀態(tài)以及和后端服務(wù)器的連接,以及連接數(shù)據(jù)源的狀態(tài)等。
到此這篇關(guān)于MySQL讀寫分離原理詳細(xì)解析的文章就介紹到這了,更多相關(guān)MySQL讀寫分離 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MYSQL中varchar和TEXT的相關(guān)問(wèn)題詳析
varchar 和 text 是 MySQL 字符存儲(chǔ)爭(zhēng)議比較多的領(lǐng)域,下面這篇文章主要給大家介紹了關(guān)于MYSQL中varchar和TEXT,文中介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
MySQL學(xué)習(xí)之?dāng)?shù)據(jù)庫(kù)操作DML詳解小白篇
本篇文章非常適合MySQl初學(xué)者,主要為大家講解了MySQL數(shù)據(jù)庫(kù)的常用操作,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家早日進(jìn)步升職加薪2021-09-09
MYSQL 高級(jí)文本查詢之regexp_like和REGEXP詳解
在MySQL中,regexp_like和REGEXP都是用于執(zhí)行正則表達(dá)式搜索的函數(shù),這篇文章主要介紹了MYSQL 高級(jí)文本查詢之regexp_like和REGEXP,需要的朋友可以參考下2023-05-05
詳解MySQL查詢時(shí)區(qū)分字符串中字母大小寫的方法
MySQL默認(rèn)是不區(qū)分大小寫的,這個(gè)涉及到collate字符集與校驗(yàn)規(guī)則方面的知識(shí),下面會(huì)講到,這里我們就來(lái)詳解MySQL查詢時(shí)區(qū)分字符串中字母大小寫的方法.2016-05-05
Workbench通過(guò)遠(yuǎn)程訪問(wèn)mysql數(shù)據(jù)庫(kù)的方法詳解
這篇文章主要給大家介紹了Workbench通過(guò)遠(yuǎn)程訪問(wèn)mysql數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-06-06

