1. 程式人生 > 資料庫 >MySQL主從原理及配置詳解

MySQL主從原理及配置詳解

MySQL主從配置及原理,供大家參考,具體內容如下

一、環境選擇:

1.Centos 6.5

2.MySQL 5.7

二、什麼是MySQL主從複製

MySQL主從複製是其最重要的功能之一。主從複製是指一臺伺服器充當主資料庫伺服器,另一臺或多臺伺服器充當從資料庫伺服器,主伺服器中的資料自動複製到從伺服器之中。對於多級複製,資料庫伺服器即可充當主機,也可充當從機。MySQL主從複製的基礎是主伺服器對資料庫修改記錄二進位制日誌,從伺服器通過主伺服器的二進位制日誌自動執行更新。

三、MySQL主從複製的型別

1.基於語句的複製

主伺服器上面執行的語句在從伺服器上面再執行一遍,在MySQL-3.23版本以後支援。

缺點:時間上可能不完全同步造成偏差,執行語句的使用者也可能是不同一個使用者。

2.基於行的複製

把主伺服器上面改編後的內容直接複製過去,而不關心到底改變該內容是由哪條語句引發的,在MySQL-5.0版本以後引入。

缺點:比如一個工資表中有一萬個使用者,我們把每個使用者的工資+1000,那麼基於行的複製則要複製一萬行的內容,由此造成的開銷比較大,而基於語句的複製僅僅一條語句就可以了。

3.混合型別的複製

MySQL預設使用基於語句的複製,當基於語句的複製會引發問題的時候就會使用基於行的複製,MySQL會自動進行選擇。

在MySQL主從複製架構中,讀操作可以在所有的伺服器上面進行,而寫操作只能在主伺服器上面進行。主從複製架構雖然給讀操作提供了擴充套件,可如果寫操作也比較多的話(多臺從伺服器還要從主伺服器上面同步資料),單主模型的複製中主伺服器勢必會成為效能瓶頸。

四、原理

1.主從(master-slave)

主伺服器上面的任何修改都會儲存在二進位制日誌Binary log裡面,從伺服器上面啟動一個I/O thread(實際上就是一個主伺服器的客戶端程序),連線到主伺服器上面請求讀取二進位制日誌,然後把讀取到的二進位制日誌寫到本地的一個Realy log裡面。從伺服器上面開啟一個SQL thread定時檢查Realy log,如果發現有更改立即把更改的內容在本機上面執行一遍。

2.主從從(master-slave-slave)

一主多從的話,這時主庫既要負責寫又要負責為幾個從庫提供二進位制日誌。此時可以稍做調整,將二進位制日誌只給某一從,這一從再開啟二進位制日誌並將自己的二進位制日誌再發給其它從。或者是乾脆這個從不記錄只負責將二進位制日誌轉發給其它從,這樣架構起來效能可能要好得多,而且資料之間的延時應該也稍微要好一些。

【注意】

1.在老版本的MySQL中,主從複製的slave段並不是由兩個程序完成的,而是由一個程序完成的,之後就出現了很多風險和效能的相關問題。具體有以下問題:

  1.一個程序會使複製bin-log日誌和解析日誌並在自身執行的過程成為一個序列的過程,效能受到了一定的限制,非同步複製的延遲也會比較長。

2. Slave端從Master端獲取bin-log過來之後,需要接著解析日誌內容,然後在自身執行。在這個過程中,Master端可能又產生了大量變化並新增了大量的日誌。如果在這個階段Master端的儲存出現了無法修復的錯誤,那麼在這個階段所產生的所有變更都將永遠無法找回。如果在Slave端的壓力比較大的時候,這個過程的時間可能會比較長。

五、MySQL主從複製的過程

1.兩種情況:同步複製和非同步複製,生產環境中大多數採用非同步複製。

2. 複製的基本過程:

  1.slave上面的I/O程序連線上master,並請求從指定檔案的指定位置(或者從最開始的日誌)之後的日誌內容。

  2.Master接收到來自Slave的IO程序的請求後,負責複製的IO程序會根據請求資訊讀取日誌指定位置之後的日誌資訊,返回給Slave的IO程序。返回資訊中除了日誌所包含的資訊之外,還包括本次返回的資訊已經到Master端的bin-log檔案的名稱以及bin-log的位置。

3.Slave的IO程序接收到資訊後,將接收到的日誌內容依次新增到Slave端的relay-log檔案的最末端,並將讀取到的Master端的 bin-log的檔名和位置記錄到master-info檔案中,以便在下一次讀取的時候能夠清楚的告訴Master“我需要從某個bin-log的哪個位置開始往後的日誌內容,請發給我”。

4.Slave的Sql程序檢測到relay-log中新增加了內容後,會馬上解析relay-log的內容成為在Master端真實執行時候的那些可執行的內容,並在自身執行。

六、配置:

1.首先明確兩種情況:

  1.兩臺相互獨立的伺服器或虛擬機器。

  2.兩臺通過模板建立的虛擬機器。

2.下面對兩臺伺服器進行命名,分別為:MySQL主伺服器,MySQL從伺服器。

3.主從伺服器分別進行如下操作:

  1.MySQL版本一致

  2.初始化表

4.修改MySQL主伺服器和MySQL從伺服器:

vim /etc/my.cnf 
[mysqld] 
log-bin=取任意名稱 //啟用二進位制日誌
server-id=任意取數字 //伺服器唯一ID,預設值是1,一般設定為IP地址的最後一段數字

5.若是第一種情況,直接重啟兩臺伺服器;若是第二種情況,還需將兩臺伺服器的auto.cnf檔案重新命名為auto.cnf.bak,然後重啟MySQL服務。

6.在MySQL主伺服器上建立賬戶並授權slave

grant replication slave on *.* to '使用者名稱'@'%' identified by '任意密碼';

7.查詢MySQL主伺服器的狀態

show master status;

8.配置MySQL從伺服器

change master to 
master_host='MySQL主伺服器IP地址',master_user='之前在MySQL主伺服器上面建立的使用者名稱', 
master_password='之前建立的密碼',master_log_file='MySQL主伺服器狀態中的二進位制檔名',master_log_pos='MySQL主伺服器狀態中的position值';

9.啟用slave

start slave;

10.檢視MySQL從伺服器的狀態

show slave status\G

檢視

Slave_IO_Running: Yes //此狀態必須YES

Slave_SQL_Running: Yes //此狀態必須YES

全變YES說明主從配置成功,當MySQL主伺服器有更新變化時,從伺服器會根據具體配置做相應的同步。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。