Infi-chu: http://www.cnblogs.com/Infi-chu/ MySQL主從配置及原理 一、環境選擇: 1.Centos 6.5 2.MySQL 5.7 二、什麼是MySQL主從複製 MySQL主從複製是其最重要的功能之一。主從複製是指一臺伺服器充當主資料庫伺服器,另一臺或多 ...
Infi-chu:
http://www.cnblogs.com/Infi-chu/
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主伺服器有更新變化時,從伺服器會根據具體配置做相應的同步。