MySQL主從複製(1)——基本概念

MySQL主從複製(1)——基本概念

MySQL主從複製允許將來自一個MySQL數據庫服務器(主服務器)的數據複製到一個或多個MySQL數據庫服務器(從服務器)。

一、主從複製的基本原理

MySQL之間數據複製的基礎是二進制日誌(binary log)。一臺MySQL數據庫一旦啓用二進制日誌後,其作爲master,它的數據庫中所有操作都會以【事件】的方式記錄在二進制日誌中,其他數據庫作爲slave通過一個I/O線程與主服務器保持通信,並監控master的二進制日誌文件的變化,如果發現master二進制日誌文件發生變化,則會把變化複製到自己的中繼日誌(relay log)中,然後slave的一個SQL線程會把相關的【事件】執行到自己的數據庫中,以此實現從數據庫和主數據庫的一致性,也就實現了主從複製。主從複製的工作原理及工作過程如下圖所示:
在這裏插入圖片描述
主從複製的工作過程:

step1、對master服務器的任何修改都會通過自己的I/O線程保存在二進制日誌(Binary log)中;

step2、slave服務器上的I/O線程通過配置好的用戶名和密碼,連接到master服務器請求讀取二進制日誌,然後把讀取到的二進制日誌寫到本地的中繼日誌(Realy log)中。同時把master返回的binlog文件名(master_log_file)和最新的位置(master_log_pos)信息寫入master.info文件中;

step3、slave服務器的SQL線程會定時檢查Realy log(relay log和binary log格式完全一樣,也是二進制的),如果發現有更新,則立即把更新的內容在數據庫上執行。

上述的主從複製的工作過程也可以用下圖來表示:
在這裏插入圖片描述

說明:在主從複製架構中,所有的更新必須在主服務器上進行。否則會造成數據不一致問題。

二,mysql主從複製架構的優點

1、實現讀寫分離。將讀和寫應用在不同的數據庫與服務器上。一個寫入的數據庫(主庫,master),一個或多個讀的數據庫(從庫,slave),各個數據庫分別位於不同的服務器上,充分利用服務器性能和數據庫性能。

2、提高系統的可靠性。當主數據庫出現故障,從數據庫可以替代主數據庫繼續工作,不影響業務。

3、實現負載均衡。當系統的併發量很大時,可以擴展從庫的數量,並實現負載均衡。

三、MySQL支持的複製類型

MySQL主從複製的類型取決於主庫的binlog日誌的模式:

1、基於語句的複製。 在主服務器上執行的 SQL 語句,在從服務器上執行同樣的語句。配置:binlog_format = ‘STATEMENT’。

2、基於行的複製。把改變的內容複製過去,而不是把命令在從服務器上執行一遍。配置:binlog_format = ‘ROW’。

3、混合類型的複製。默認採用基於語句的複製,一旦發現基於語句的無法精確的複製時,就會採用基於行的複製。配置:binlog_format = ‘MIXED’。

四、MySQL主從複製架構

1、搭建主從複製的基本原則

(1)每個Slave只能有一個Master;

(2)每個master和Slave必須制定一個唯一的服務器ID(server-id);

(3)每個Master可以有很多 Slave;

(4)通過設置log_slave_updates參數,一個Slave可以成爲其他Slave的 Master(多級複製架構)。

2、一主多從複製架構

使用場景:在主庫讀取請求壓力非常大的場景下,可以通過配置一主多從複製架構實現讀寫分離,把大量對實時性要求不是特別高的讀請求通過負載均衡到多個從庫上,降低主庫的讀取壓力。在主庫出現異常宕機的情況下,可以把一個從庫切換爲主庫繼續提供服務。

注意事項:
(1)當 Slave 增加到一定數量時,Slave 對 Master 的負載以及網絡帶寬會成爲瓶頸;
(2)不同的 Slave 扮演不同的作用;
(3)用一個 Slave 作爲備用 Master,只進行復制;
(4)用一個遠程的 Slave,用於災難恢復。

3、多級複製架構

使用場景:一主多從的架構能夠解決大部分讀請求壓力特別大的場景需求,但主庫的I/O壓力和網絡壓力會隨着從庫的增加而增長,而使用多級複製架構就可以解決一主多從場景下,主庫額外的I/O和網絡壓力。但多級複製場景下主庫的數據是經歷兩次纔到達讀取的從庫,期間的延時比一主多從複製場景下只經歷一次複製的要大。

注意事項:可能存在延時較長的風險。

4、雙主複製架構

使用場景:雙主架構適用於寫壓力比較大的場景,或者DBA做維護需要主從切換的場景。

注意事項:最大問題是更新衝突。

五、配置主從同步

配置主從同步的過程,可以總結爲如下的步驟:

step1、主服務器:(1)開啓二進制日誌(binary log);(2)配置server-id;(3)創建用於複製的用戶。

step2、在每一個從服務器上:(1)開啓中繼日誌(relay log);(2)配置server-id。

step3、在開始複製進程前,在主服務器上記錄二進制文件的位置信息(show master status)。

step4、如果在開始複製之前,數據庫中已經有數據,必須先把主服務器的數據導入到從服務器(可以使用mysqldump導出數據庫,或者直接複製數據文件)。

step5、使用change master命令配置主從複製的信息。

step6、從複製開啓主從複製(start slave),檢查主從複製是否配置成功(show slave status)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章