MYSQL主從複制原理
Mysql内建的複制功能是建構大型,高性能應用程式的基礎。将Mysql的資料分布到多個系統上去,這種分布的機制,是通過将Mysql的某一台主機的資料複制到其它主機(slaves)上,并重新執行一遍來實作的。複制過程中一個伺服器充當主伺服器,而一個或多個其它伺服器充當從伺服器。主伺服器将更新寫入二進制日志檔案,并維護檔案的一個索引以跟蹤日志循環。這些日志可以記錄發送到從伺服器的更新。當一個從伺服器連接配接主伺服器時,它通知主伺服器從伺服器在日志中讀取的最後一次成功更新的位置。從伺服器接收從那時起發生的任何更新,然後封鎖并等待主伺服器通知新的更新。
請注意當你進行複制時,所有對複制中的表的更新必須在主伺服器上進行。否則,你必須要小心,以避免使用者對主伺服器上的表進行的更新與對從伺服器上的表所進行的更新之間的沖突。
(1):基于語句的複制: 在主伺服器上執行的SQL語句,在從伺服器上執行同樣的語句。MySQL預設采用基于語句的複制,效率比較高。
一旦發現沒法精确複制時, 會自動選着基于行的複制。
(2):基于行的複制:把改變的内容複制過去,而不是把指令在從伺服器上執行一遍. 從mysql5.0開始支援
(3):混合類型的複制: 預設采用基于語句的複制,一旦發現基于語句的無法精确的複制時,就會采用基于行的複制。
該過程的第一部分就是master記錄二進制日志。在每個事務更新資料完成之前,master在二日志記錄這些改變。MySQL将事務串行的寫入二進制日志,即使事務中的語句都是交叉執行的。在事件寫入二進制日志完成後,master通知存儲引擎送出事務。
下一步就是slave将master的binary log拷貝到它自己的中繼日志。首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接配接,然後開始binlog dump process。Binlog dump process從master的二進制日志中讀取事件,如果已經跟上master,它會睡眠并等待master産生新的事件。I/O線程将這些事件寫入中繼日志。
SQL slave thread(SQL從線程)處理該過程的最後一步。SQL線程從中繼日志讀取事件,并重放其中的事件而更新slave的資料,使其與master中的資料一緻。隻要該線程與I/O線程保持一緻,中繼日志通常會位于OS的緩存中,是以中繼日志的開銷很小。
此外,在master中也有一個工作線程:和其它MySQL的連接配接一樣,slave在master中打開一個連接配接也會使得master開始一個線程。複制過程有一個很重要的限制——複制在slave上是串行化的,也就是說master上的并行更新操作不能在slave上并行操作。
有兩台MySQL資料庫伺服器Master和slave,Master為主伺服器,slave為從伺服器,初始狀态時,Master和slave中的資料資訊相同,當Master中的資料發生變化時,slave也跟着發生相應的變化,使得master和slave的資料資訊同步,達到備份的目的。
要點:
負責在主、從伺服器傳輸各種修改動作的媒介是主伺服器的二進制變更日志,這個日志記載着需要傳輸給從伺服器的各種修改動作。是以,主伺服器必須激活二進制日志功能。從伺服器必須具備足以讓它連接配接主伺服器并請求主伺服器把二進制變更日志傳輸給它的權限。
環境:
Master和slave的MySQL資料庫版本同為5.7
作業系統:Centos7.2
master IP位址:192.168.0.6
Slave IP 位址 :192.168.0.8
一:(1)建立事件同步環境,在主節點上搭建時間同步伺服器
安裝NTP
<code>[root@localhost /]# yum -y install ntp</code>
(2)配置NTP
<code>[root@localhost /]# vim /etc/ntp.conf</code>
重新開機服務
(2)在從節點上進行時間同步
<code>[root@localhost /]# yum -y install ntpdate</code>
<code>[root@localhost /]# /usr/sbin/ntpdate </code><code>192.168</code><code>.</code><code>0.6</code>
在每台伺服器上關閉firewalled也可以進行開放
[root@localhost /]# setenforce 0
[root@localhost /]# systemctl stop firewalld.service
安裝資料庫過程直接就不用太多描述
(2)配置mysql master主伺服器
在/etc/my.cnf中修改或者添加下面内容
<code>[root@localhost /]# systemctl restart mysqld</code>
登陸mysql程式 給從伺服器進行授權
其中File列顯示日志名 Position顯示編譯量 這倆個值在後面配置從伺服器的時候需要slave從該節點在master上進行更新
(2)配置從伺服器
在/etc/my.cnf中修改或者添加下面内容 server ID不能相同 啟動服務
(2)登陸mysql 配置同步
按主伺服器結果更改下面指令中 master-log-file 和 master—log-pos參數
啟動同步
mysql> start slave;
mysql> show slave status\G;
(2)驗證主從複制效果
在主伺服器登陸MYSQL 建立庫 在從伺服器檢視
在從伺服器檢視效果 主從複制是否成功
後面更新mysql資料庫讀寫分離
本文轉自柴鑫旺 51CTO部落格,原文連結:http://blog.51cto.com/chaixinwang/2060840,如需轉載請自行聯系原作者