Mysql主從同步的實現原理與配置實戰


1、什么是mysql主從同步?

當master(主)庫的數據發生變化的時候,變化會實時的同步到slave(從)庫。

2、主從同步有什么好處?

  • 水平擴展數據庫的負載能力。
  • 容錯,高可用。Failover(失敗切換)/High Availability
  • 數據備份。

3、主從同步的原理是什么?

首先我們來了解master-slave的體系結構。如下圖:



不管是delete、update、insert,還是創建函數、存儲過程,所有的操作都在master上。當master有操作的時候,slave會快速的接收到這些操作,從而做同步。

 

但是,這個機制是怎么實現的呢?在master機器上,主從同步事件會被寫到特殊的log文件中(binary-log);在slave機器上,slave讀取主從同步事件,並根據讀取的事件變化,在slave庫上做相應的更改。

如此,就實現了主從同步了!

下面我們來詳細的了解。3.1主從同步事件有哪些上面說到:在master機器上,主從同步事件會被寫到特殊的log文件中(binary-log);

主從同步事件有3種形式:statement、row、mixed。

  1. statement:會將對數據庫操作的sql語句寫入到binlog中。
  2. row:會將每一條數據的變化寫入到binlog中。
  3. mixed:statement與row的混合。Mysql決定什么時候寫statement格式的,什么時候寫row格式的binlog。


3.2在master機器上的操作

當master上的數據發生改變的時候,該事件(insert、update、delete)變化會按照順序寫入到binlog中。binlog dump線程當slave連接到master的時候,master機器會為slave開啟binlog dump線程。當master 的 binlog發生變化的時候,binlog dump線程會通知slave,並將相應的binlog內容發送給slave。

 

3.3在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數據庫做相應的操作。

3.4如何在master、slave上查看上述的線程?

使用SHOW PROCESSLIST命令可以查看。如圖,在master機器上查看binlog dump線程

如圖,在slave機器上查看I/O、SQL線程。


接下來給大家講解mysql主從同步實戰系統環境:系統的話大同小異,都差不多,我這里用的是ubuntu16.04+mysql5.7,用到兩台服務器:其中master IP:192.168.33.22,另一個slave IP:192.168.33.33

 

master機器上的操作

1、更改配置文件我們找到文件/etc/mysql/mysql.conf.d/mysqld.cnf

配置如下:

bind-address = 192.168.33.22 #your master ip
server-id = 1 #在master-slave架構中,每台機器節點都需要有唯一的server-id
log_bin = /var/log/mysql/mysql-bin.log #開啟binlog

 

2、重啟mysql,以使配置文件生效。

sudo systemctl restart mysql

 

3、創建主從同步的mysql user。

$ mysql -u root -p
Password:

##創建slave1用戶,並指定該用戶只能在主機192.168.33.33上登錄。
mysql> CREATE USER 'slave1'@'192.168.33.33' IDENTIFIED BY 'slavepass';
Query OK, 0 rows affected (0.00 sec)

##為slave1賦予REPLICATION SLAVE權限。
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'192.168.33.33';
Query OK, 0 rows affected (0.00 sec)

 

4、為MYSQL加讀鎖為了主庫與從庫的數據保持一致,我們先為mysql加入讀鎖,使其變為只讀。

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)

 

5、記錄下來MASTER REPLICATION LOG 的位置該信息稍后會用到。

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File    | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |  613 |    |     |     |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
 
 

6、將master DB中現有的數據信息導出

$ mysqldump -u root -p --all-databases --master-data > dbdump.sql

 

7、接觸master DB的讀鎖

mysql> UNLOCK TABLES;

 

8、將步驟6中的dbdump.sql文件copy到slave

scp dbdump.sql ubuntu@192.168.33.33:/home/ubuntu

 

 

slave機器上的操作

1、更改配置文件我們找到文件/etc/mysql/mysql.conf.d/mysqld.cnf

更改配置如下:

bind-address = 192.168.33.33 #your slave ip
server-id = 2 #master-slave結構中,唯一的server-id
log_bin = /var/log/mysql/mysql-bin.log #開啟binlog

 

2、重啟mysql,以使配置文件生效

sudo systemctl restart mysql

 

 

3、導入從master DB。導出的dbdump.sql文件,以使master-slave數據一致

$ mysql -u root -p < /home/ubuntu/dbdump.sql

 

4、使slave與master建立連接,從而同步

$ mysql -u root -p
Password:

mysql> STOP SLAVE;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CHANGE MASTER TO
 -> MASTER_HOST='192.168.33.22',
 -> MASTER_USER='slave1',
 -> MASTER_PASSWORD='slavepass',
 -> MASTER_LOG_FILE='mysql-bin.000001',
 -> MASTER_LOG_POS=613;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

MASTER_LOG_FILE='mysql-bin.000001'與MASTER_LOG_POS=613的值,是從上面的SHOW MASTER STATUS得到的。經過如此設置之后,就可以進行master-slave同步了

 

~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM