什么是主從同步
MySQL 主從同步是指數(shù)據(jù)可以從一個MySQL數(shù)據(jù)庫服務(wù)器主節(jié)點(diǎn)復(fù)制到一個或多個從節(jié)點(diǎn)绊困。MySQL 默認(rèn)采用異步復(fù)制方式抓艳,這樣從節(jié)點(diǎn)不用一直訪問主服務(wù)器來更新自己的數(shù)據(jù),數(shù)據(jù)的更新可以在遠(yuǎn)程連接上進(jìn)行烫幕,從節(jié)點(diǎn)可以復(fù)制主數(shù)據(jù)庫中的所有數(shù)據(jù)庫或者特定的數(shù)據(jù)庫吹由,或者特定的表呛讲。
應(yīng)用場景
讀寫分離
在開發(fā)工作中庐镐,有時候會遇見某個sql 語句需要鎖表恩商,導(dǎo)致暫時不能使用讀的服務(wù),這樣就會影響現(xiàn)有業(yè)務(wù)必逆,使用主從復(fù)制怠堪,讓主庫負(fù)責(zé)寫,從庫負(fù)責(zé)讀名眉,這樣粟矿,即使主庫出現(xiàn)了鎖表的情景,通過讀從庫也可以保證業(yè)務(wù)的正常運(yùn)作璧针。當(dāng)讀的壓力增加時嚷炉,也可以通過配置多個從數(shù)據(jù)庫,一起分擔(dān)讀取數(shù)據(jù)的壓力探橱,提高系統(tǒng)的穩(wěn)定性。
架構(gòu)擴(kuò)展
隨著系統(tǒng)中業(yè)務(wù)訪問量的增大绘证,如果是單機(jī)部署數(shù)據(jù)庫隧膏,就會導(dǎo)致I/O訪問頻率過高。有了主從復(fù)制嚷那,增加多個數(shù)據(jù)存儲節(jié)點(diǎn)胞枕,將負(fù)載分布在多個從節(jié)點(diǎn)上,降低單機(jī)磁盤I/O訪問的頻率魏宽,提高單個機(jī)器的I/O性能腐泻。
原理圖
主從同步后的操作原則:
主數(shù)據(jù)庫一般只負(fù)責(zé)做增刪改操作,極少負(fù)責(zé)查詢,從數(shù)據(jù)庫只負(fù)責(zé)做查詢,不負(fù)責(zé)增刪改操作,此時主數(shù)據(jù)庫中數(shù)據(jù)的變動會通過某種方式,自動同步到所有的從數(shù)據(jù)庫中,最終保持?jǐn)?shù)據(jù)一致
1. Master中開啟一個線程,把數(shù)據(jù)變動記錄到一個二進(jìn)制的日志文件(binary log)中
2. Slave中開啟一個IO線程專門用于讀取Master中二進(jìn)制日志內(nèi)容,并且把數(shù)據(jù)寫入自己的回放日志文件(relay log)中
3. Slave中SQL線程去讀取回放日志(relay log)的內(nèi)容,把Master中執(zhí)行的DML進(jìn)行回放,完成主從同步
注意:主從同步是有一定延遲的,所以無法保證從數(shù)據(jù)庫中馬上能讀取到主數(shù)據(jù)庫同步的信息,因此只要業(yè)務(wù)方法中涉及到寫的操作,那么該操作必須在主數(shù)據(jù)庫上執(zhí)行
實現(xiàn)步驟
準(zhǔn)備工作: 先讓Master和Slave都擁有相同的數(shù)據(jù)庫,并且數(shù)據(jù)庫中的表數(shù)據(jù)一致
1. 在Master的配置文件中[mysqld]部分做以下配置,開啟binary-log
然后重啟MySQL服務(wù)器后,再次登錄進(jìn)去看使用SQL命令查看信息,顯示以下內(nèi)容及表示第一步成功了
2. 在Master數(shù)據(jù)庫中新建一個新用戶專門用于做主從同步
3. 在Slave的配置文件中[mysqld]部分做以下配置,然后重啟服務(wù)器
linux中重啟mysql則需要用到命名: service mysqld restart
linux中mysql配置文件的默認(rèn)路徑是: /etc/my.cnf
4. 登錄Slave中執(zhí)行SQL
讀寫分離
原理圖
1. 一個連接池只能操作一個數(shù)據(jù)庫,現(xiàn)在我們項目有多個數(shù)據(jù)庫,就必須為每一個數(shù)據(jù)庫配置對應(yīng)的連接池
2. 在執(zhí)行SQL語句的使用,根據(jù)執(zhí)行的操作來選擇使用哪個連接池進(jìn)行操作,如:執(zhí)行DML就必須是選擇MasterDataSource來操作,執(zhí)行DQL操作就選擇SlaveDataSource來操作
3. 此時應(yīng)當(dāng)再有一個對象,該對象擁有管理所有連接池和選擇連接池的來使用的功能,該對象就是具有路由功能的連接池
4. 當(dāng)調(diào)用者需要進(jìn)行數(shù)據(jù)庫操作時,再告訴路由連接池我需要你幫我選擇哪個連接池進(jìn)行操作數(shù)據(jù)庫即可