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