1. 程式人生 > >MySQL半同步複製原理配置與介紹

MySQL半同步複製原理配置與介紹

環境介紹:

Ubuntu Server 16.04.2+MySQL 5.7.17 Community Server (GPL)

MySQL安裝

1、下載mysql-apt-config_0.8.3-1_all.deb

這裡寫圖片描述

2、安裝deb

>sudo dpkg -i mysql-apt-config_0.8.3-1_all.deb

3、更新源

>sudo apt-get update

4、安裝MySQL

>sudo apt-get install mysql-server

5、根據提示選擇安裝和設定密碼。

另外,還需要對其進行設定,繫結的IP和開啟防火牆的3306埠,這裡主要是學習MySQL半同步複製,對MySQL的安裝不做多解釋,如果疑問歡迎留言。

MySQL半同步複製介紹

這裡寫圖片描述

(1)預設情況下,MySQL的複製功能是非同步的,非同步複製可以提供最佳的效能, 主庫把binlog日誌傳送給從庫,這一動作就結束了,並不會驗證從庫是否接收完畢,這一過程,也就意味著有可能出現當主伺服器或從伺服器端發生故障的時候,有可能從伺服器沒有接收到主伺服器傳送過來的binlog日誌,這就會造成主伺服器和從伺服器的資料不一致,甚至在恢復時造成資料的丟失。

注意:

半同步複製模式必須在主伺服器和從伺服器端同時開啟,否則主伺服器預設使用非同步複製模式。

(2)非同步複製案例:

(3)為了解決上述可能發生的錯誤,MySQL 5.5 引入了一種半同步複製模式。該模式可以確保從伺服器接收完主伺服器傳送的binlog

日誌檔案並寫入到自己的中繼日誌relay log裡,然後會給主伺服器一個反饋,告訴主伺服器已經接收完畢,這時主服務執行緒才返回給當前session告知操作完成。

(4)當出現超時情況是,主伺服器會暫時切換到非同步複製模式,直到至少有一個從伺服器從及時收到資訊為止。

(5)中繼日誌的自我修復:

從MySQL 5.5.X 版本開始,增加了relay_log_recovery引數,這個引數的作用是:當slave從庫宕機後,假如relay.log損壞了,導致一部分中繼日誌沒有處理,則自動放棄所有未執行的relay-log,並且重新從master上獲取日誌,這樣就保證了relay-log的完整性。預設情況下該功能是關閉的,將relay_log_recovery

的值設定為1時,可在slave從庫上開啟該功能,建議開啟。

(6)半同步複製與非同步複製的切換:

半同步複製的工作原理就是當slave從庫IO_Thread執行緒將binlog日誌接收完畢之後,要給master主庫一個確認,如果rpl_semi_sync_master_timeout=10000 (10秒)超過10秒未收到slave從庫的接受確認訊號,那麼就會自動切換為傳統的非同步複製模式。

MySQL半同步複製配置

首先,需要安裝兩個MySQL,這裡是:

Master:192.168.1.227
Slave:192.168.1.224

原始資料庫的模樣如下:

這裡寫圖片描述

一、Master配置

(1)在Master資料庫安裝半同步複製外掛:

mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

這裡寫圖片描述

(2)設定Master上開啟半同步複製:

mysql>SET GLOBAL rpl_semi_sync_master_enabled = 1;

這裡寫圖片描述

(3)修改mysqld.cnf 配置檔案:

這裡寫圖片描述

上圖指出了MySQL配置的檔案路徑。

[mysqld]

log-bin=mysql-bin
server_id = 10086
server_id_bits = 33
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000

這裡寫圖片描述

(4)修改MySQL server-uuid配置檔案:

root@xuliugen:/var/lib/mysql# pwd
/var/lib/mysql

修改 auto.cnf檔案,server-uuid的值格式固定,為了和Slave的區別開

[auto]
server-uuid=8d90feb7-1a88-11e7-9d11-000c298a546f

(5)檢視配置是否成功:

mysql>SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';

這裡寫圖片描述

(6)引數說明:

1、rpl_semi_sync_master_enabled = 1,表示在master上已經開啟了半同步複製模式;

2、rpl_semi_sync_master_timeout = 10000,表示如果主庫在某次事務中的等待時間超過10000毫秒,則降級為非同步複製模式,不在等待slave從庫。如果主庫再次探測到slave從恢復了,則會自動切換回半同步複製模式;

3、rpl_semi_sync_master_wait_no_slave ,表示是否允許master每個事務提交後都要等待slave的接收確認訊號。預設為ON,即每一個事務都會等待。如果為OFF,則slave追趕上之後,也不會開啟半同步複製模式,需要手工開啟;

4、rpl_semi_sync_master_trace_level = 32,指用於開啟半同步複製模式時的除錯級別,預設為32。

可以看出,在配置Master的時候,只設置了1,其他的都採取的預設設定。

二、Slave配置

(1)在Slave資料庫安裝半同步複製外掛:

mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

這裡寫圖片描述

(2)設定Slave上開啟半同步複製:

mysql>SET GLOBAL rpl_semi_sync_slave_enabled = 1;

這裡寫圖片描述

(3)修改mysqld.cnf 配置檔案:

[mysqld]

log-bin=mysql-bin
server_id=10089
server_id_bits = 32
rpl_semi_sync_slave_enabled = 1

這裡寫圖片描述

(4)修改MySQL server-uuid配置檔案:

root@xuliugen:/var/lib/mysql# pwd
/var/lib/mysql

修改 auto.cnf檔案,server-uuid的值格式固定,為了和Slave的區別開

[auto]
server-uuid=8d90feb7-1a88-11e7-9d11-000c298a123f

確保和Master的server-uuid不一樣!

(5)檢視配置是否成功:

mysql>SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';

這裡寫圖片描述

(6)引數說明:

1、rpl_semi_sync_slave_enabled = 1,表示在slave上已經開啟了半同步複製模式;

2、rpl_semi_sync_slave_trace_level = 32,指用於開啟半同步複製模式時的除錯級別,預設為32。

三、為Slave指定Master

(1)命令列模式下重啟Master

root@xuliugen:~# service mysql restart

(2)命令列模式下重啟Slave

root@xuliugen:~# service mysql restart

(3)檢視Master狀態:

mysql> show master status\G;
*************************** 1. row ***************************
             File: mysql-bin.000004
         Position: 154
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.02 sec)

mysql>

這裡寫圖片描述

注意:

File: mysql-bin.000004
Position: 154

很重要,後邊需要使用!

(4)為Slave指定Master:

1、首先關閉Slave的半同步複製

mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

2、為Slave指定Master

mysql>change master to master_host='192.168.1.227',master_user='root',master_password='123456',master_log_file='mysql-bin.000004', master_log_pos=154;

Query OK, 0 rows affected, 2 warnings (0.02 sec)

其中:

master_host='192.168.1.227',Master主庫IP地址
master_user='root',Master主庫資料庫賬戶
master_password='123456',Master主庫資料庫root使用者密碼
master_log_file='mysql-bin.000004', Master主庫binlog檔案
master_log_pos=154,Master主庫binlog檔案position

注意:

在MySQL 5.6版本以後,在進行主從複製的時候可以使用GTID的方式,無需再找binglog和pos點,只需要知道主伺服器的IP、埠、賬戶、密碼就可以實現自動找點同步,開啟GTID功能的時候就不用再使用binlog和pos了。詳細資訊,請查閱相關資料進行學習。

3、開啟Slave的半同步複製

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

四、測試半同步複製是否成功

這裡寫圖片描述

五、如何優雅的關閉Slave同步資訊

在某些時候,一臺伺服器不再用來作為Slave,那麼我們就需要清楚他的同步資訊,一般會使用:

mysql> stop slave #先關閉
mysql> reset slave #清楚Slave同步資訊

但是,這樣再通過show master status\G顯示的時候:

mysql> show master status\G;

還是會出現同步的資訊,這是因為執行了 reset slave 只是把 master.inforelay-log.info 檔案刪除了,但同步資訊還在,如果有人在執行start slave命令開啟了同步功能,結果就會又從頭開始同步了,有可能還會造成資料的丟失。

如何讓其清除的更乾淨哪?請使用下邊的命令:

mysql> stop slave #先關閉
mysql> reset slave all#清楚Slave同步資訊

再次執行show master status\G就不會再有任何資訊了。

六、部分異常場景模擬

(1)半同步複製與非同步複製的切換:

上述已經介紹了為什麼會出現半同步複製到非同步複製的切換,那麼現在模擬一個場景進行演示。

場景如下:

1、關閉slave同步,停止IO接收binlog日誌

mysql> stop slave;

該操作就將IO執行緒關閉,等待10秒之後,如果master未收到來自slave的確認資訊,就會切換到非同步複製模式:

這裡寫圖片描述

上圖看到slave已經關閉了半同步複製模式,再次開啟:

mysql> start slave;

這裡寫圖片描述

此時,已經還原到半同步複製模式了。

(2)同步報錯案例演示:

我們,首先從slave庫上刪除資料庫表 ufind,然後到master再次刪除該庫ufind,該同步就會報錯:

這裡寫圖片描述

 Last_Error: Error 'Can't drop database 'ufind'; database doesn't exist' on query. Default database: 'ufind'. Query: 'DROP DATABASE `ufind`'

此時,檢視半同步狀態:

這裡寫圖片描述

是開啟的,因此沒有將半同步複製模式轉化為非同步複製模式,可以看出半同步複製模式跟IO_Thread是有直接關係的,但跟SQL_THREAD沒有關係。

也就是說,slave從庫接收完二進位制日誌後給master主庫一個確認,但是他不會管relay-log中繼日誌是否執行完畢。

六、半同步複製模式效能分析及優缺點

在通常情況下,由於非同步複製模式不需要等待從伺服器的響應,其速度較半同步複製模式要快,吞吐率要高,在資料進行更新、插入、刪除的時候其速度要高於半同步複製模式。但是,半同步複製模式有利於資料的一致性,對於一些資料一致性要求較高的,網路波動較小的可以採用半同步複製模式。

參考文章: