當master(主)庫的數據發生變化的時候,變化會實時的同步到slave(從)庫。mysql
水平擴展數據庫的負載能力。sql
容錯,高可用。Failover(失敗切換)/High Availability數據庫
數據備份。segmentfault
首先咱們來了解master-slave的體系結構。函數
以下圖:spa
無論是delete、update、insert,仍是建立函數、存儲過程,全部的操做都在master上。
當master有操做的時候,slave會快速的接收到這些操做,從而作同步。線程
可是,這個機制是怎麼實現的呢?3d
在master機器上,主從同步事件會被寫到特殊的log文件中(binary-log);
在slave機器上,slave讀取主從同步事件,並根據讀取的事件變化,在slave庫上作相應的更改。code
如此,就實現了主從同步了!blog
下面咱們來詳細的瞭解。
上面說到:
在master機器上,主從同步事件會被寫到特殊的log文件中(binary-log);
主從同步事件有3種形式:statement、row、mixed。
statement:會將對數據庫操做的sql語句寫入到binlog中。
row:會將每一條數據的變化寫入到binlog中。
mixed:statement與row的混合。Mysql決定何時寫statement格式的,何時寫row格式的binlog。
當master上的數據發生改變的時候,該事件(insert、update、delete)變化會按照順序寫入到binlog中。
當slave鏈接到master的時候,master機器會爲slave開啓binlog dump線程。
當master 的 binlog發生變化的時候,binlog dump線程會通知slave,並將相應的binlog內容發送給slave。
當主從同步開啓的時候,slave上會建立2個線程。
I/O線程。該線程鏈接到master機器,master機器上的binlog dump線程會將binlog的內容發送給該I/O線程。該I/O線程接收到binlog內容後,再將內容寫入到本地的relay log。
SQL線程。該線程讀取I/O線程寫入的relay log。而且根據relay log的內容對slave數據庫作相應的操做。
使用SHOW PROCESSLIST
命令能夠查看。
如圖,在master機器上查看binlog dump線程。
如圖,在slave機器上查看I/O、SQL線程。
關於實戰,請參考個人另外一篇文章:Mysql主從同步實戰
What is MySQL Replication and How Does It Work?
MySQL Master-Slave Replication on the Same Machine
更多精彩,請關注公衆號「聊聊代碼」,讓咱們一塊兒聊聊「左手代碼右手詩」的事兒。