主從復(fù)制就是用來建立一個(gè)或多個(gè)和主庫一樣的數(shù)據(jù)庫,稱為從庫,然后可以在這兩者之上進(jìn)行一個(gè)讀寫分離,主庫少寫,從庫多讀的操作,這樣就能大大緩解數(shù)據(jù)庫的并發(fā)壓力。
1)做數(shù)據(jù)的熱備份,作為后備數(shù)據(jù)庫,主數(shù)據(jù)庫服務(wù)器故障后,可切換到從數(shù)據(jù)庫繼續(xù)工作,避免數(shù)據(jù)丟失。
2)架構(gòu)的擴(kuò)展。業(yè)務(wù)量越來越大,I/O訪問頻率過高,單機(jī)無法滿足,此時(shí)做多庫的存儲(chǔ),降低磁盤I/O訪問的評(píng)率,提高單個(gè)機(jī)器的I/O性能。
3)讀寫分離,使數(shù)據(jù)庫能支持更大的并發(fā)。在線上環(huán)境中,一般都是讀多寫少,那么我們可以在主庫中實(shí)現(xiàn)寫操作,然后在從庫實(shí)現(xiàn)讀操作,這樣就能很好的分擔(dān)壓力.
1. 首先從庫創(chuàng)建I/O線程去請(qǐng)求主庫 的binlog
2. 然后主庫創(chuàng)建一個(gè)binlog dump線程將數(shù)據(jù)同步到binlog文件中.
3. 然后從庫I/O線程將binlog文件數(shù)據(jù)同步到自身的redo log文件中.
4. 然后從庫創(chuàng)建一個(gè)sql線程將redo log文件里的數(shù)據(jù)同步到數(shù)據(jù)庫里.
1.因?yàn)閺膸鞆?fù)制binlog文件的這個(gè)IO線程是單線程,所以如果出現(xiàn)網(wǎng)絡(luò)阻塞等情況,那么主庫的寫操作肯定要比復(fù)制數(shù)據(jù)要快,這個(gè)時(shí)候就會(huì)導(dǎo)致從庫復(fù)制延遲,數(shù)據(jù)不一致.
2.在從庫用sql線程將redo log文件里的數(shù)據(jù)復(fù)制到數(shù)據(jù)庫里的時(shí)候,可能會(huì)被對(duì)該表的操作阻塞,比如有另外的線程進(jìn)行鎖表的操作,那么該導(dǎo)入數(shù)據(jù)的sql線程就會(huì)被阻塞.此時(shí)也會(huì)導(dǎo)致復(fù)制延遲.
3.如果中間過程出現(xiàn)了宕機(jī),可能會(huì)產(chǎn)生數(shù)據(jù)丟失的問題.
1.解決數(shù)據(jù)丟失,很簡單,可以采用半同步復(fù)制策略.即在進(jìn)行同步復(fù)制的時(shí)候,主庫要求必須要有一個(gè)從庫進(jìn)行回應(yīng)后才能確定復(fù)制成功,確保數(shù)據(jù)至少復(fù)制到了一臺(tái)從機(jī)了.
2.解決復(fù)制延遲問題可以采用并行復(fù)制,這是自5.6后提出的,到5.7后得以升級(jí)傳播,此后多個(gè)數(shù)據(jù)庫版本出現(xiàn)就有多個(gè)版本的并行復(fù)制,這里截取網(wǎng)上一種通用說法,跟面試官說說就可以了,畢竟我們是剛出去工作的小白:
MySQL為了解決這個(gè)問題,將sql_thread演化了多個(gè)worker的形式,在slave端并行應(yīng)用relay log中的事務(wù),從而提高relay log的應(yīng)用速度,減少復(fù)制延遲。
水平分庫
概念:以字段為依據(jù),按照一定策略(hash、range等),將一個(gè)庫中的數(shù)據(jù)拆分到多個(gè)庫中。
結(jié)果:每個(gè)庫的結(jié)構(gòu)都一樣,擁有相同的表數(shù)量;每個(gè)庫的數(shù)據(jù)都不一樣,沒有交集,所有庫的并集是全量數(shù)據(jù);
垂直分庫
概念:以表為依據(jù),按照業(yè)務(wù)歸屬不同,將不同的表拆分到不同的庫中。拆分對(duì)象是表
結(jié)果:每個(gè)庫的結(jié)構(gòu)都不一樣,比如abcd四張表,ab表放x庫,cd表放y庫;每個(gè)庫的數(shù)據(jù)也不一樣,沒有交集,所有庫的并集是全量數(shù)據(jù);
水平分表
概念:以字段為依據(jù),按照一定策略(hash、range等),將一個(gè)表中的數(shù)據(jù)拆分到多個(gè)表中。
結(jié)果:每個(gè)表的結(jié)構(gòu)都一樣;每個(gè)表的數(shù)據(jù)都不一樣,沒有交集;所有表的并集是全量數(shù)據(jù);
垂直分表
概念:以字段為依據(jù),按照字段的活躍性,將熱點(diǎn)字段放在一張表,非熱點(diǎn)字段放一張表。
結(jié)果:每個(gè)表的結(jié)構(gòu)都不一樣,idabcd五個(gè)字段,idab字段放x表,idcd字段放y表;都存有主鍵,通過主鍵來關(guān)聯(lián)