您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)怎么在MySQL中配置半同步復(fù)制,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
MySQL安裝
通過(guò)APT的方式安裝,官方指導(dǎo)文檔地址:
https://dev.mysql.com/downloads/repo/apt/
1、下載mysql-apt-config_0.8.3-1_all.deb
2、安裝deb
A Quick Guide to Using the MySQL APT Repository:
https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/
>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、根據(jù)提示選擇安裝和設(shè)置密碼。
另外,還需要對(duì)其進(jìn)行設(shè)置,綁定的IP和打開防火墻的3306端口,這里主要是學(xué)習(xí)MySQL半同步復(fù)制,對(duì)MySQL的安裝不做多解釋,如果疑問(wèn)歡迎留言。
MySQL半同步復(fù)制介紹
(1)默認(rèn)情況下,MySQL的復(fù)制功能是異步的,異步復(fù)制可以提供最佳的性能, 主庫(kù)把binlog日志發(fā)送給從庫(kù),這一動(dòng)作就結(jié)束了,并不會(huì)驗(yàn)證從庫(kù)是否接收完畢,這一過(guò)程,也就意味著有可能出現(xiàn)當(dāng)主服務(wù)器或從服務(wù)器端發(fā)生故障的時(shí)候,有可能從服務(wù)器沒(méi)有接收到主服務(wù)器發(fā)送過(guò)來(lái)的binlog日志,這就會(huì)造成主服務(wù)器和從服務(wù)器的數(shù)據(jù)不一致,甚至在恢復(fù)時(shí)造成數(shù)據(jù)的丟失。
注意:
半同步復(fù)制模式必須在主服務(wù)器和從服務(wù)器端同時(shí)開啟,否則主服務(wù)器默認(rèn)使用異步復(fù)制模式。
(2)異步復(fù)制案例:
MySQL5.6 數(shù)據(jù)庫(kù)主從(Master/Slave)同步安裝與配置詳解
(3)為了解決上述可能發(fā)生的錯(cuò)誤,MySQL 5.5 引入了一種半同步復(fù)制模式。該模式可以確保從服務(wù)器接收完主服務(wù)器發(fā)送的binlog
日志文件并寫入到自己的中繼日志relay log
里,然后會(huì)給主服務(wù)器一個(gè)反饋,告訴主服務(wù)器已經(jīng)接收完畢,這時(shí)主服務(wù)線程才返回給當(dāng)前session
告知操作完成。
(4)當(dāng)出現(xiàn)超時(shí)情況是,主服務(wù)器會(huì)暫時(shí)切換到異步復(fù)制模式,直到至少有一個(gè)從服務(wù)器從及時(shí)收到信息為止。
(5)中繼日志的自我修復(fù):
從MySQL 5.5.X 版本開始,增加了relay_log_recovery
參數(shù),這個(gè)參數(shù)的作用是:當(dāng)slave從庫(kù)宕機(jī)后,假如relay.log
損壞了,導(dǎo)致一部分中繼日志沒(méi)有處理,則自動(dòng)放棄所有未執(zhí)行的relay-log
,并且重新從master
上獲取日志,這樣就保證了relay-log
的完整性。默認(rèn)情況下該功能是關(guān)閉的,將relay_log_recovery
的值設(shè)置為1時(shí),可在slave從庫(kù)上開啟該功能,建議開啟。
(6)半同步復(fù)制與異步復(fù)制的切換:
半同步復(fù)制的工作原理就是當(dāng)slave從庫(kù)IO_Thread線程將binlog日志接收完畢之后,要給master主庫(kù)一個(gè)確認(rèn),如果rpl_semi_sync_master_timeout=10000
(10秒)超過(guò)10秒未收到slave從庫(kù)的接受確認(rèn)信號(hào),那么就會(huì)自動(dòng)切換為傳統(tǒng)的異步復(fù)制模式。
MySQL半同步復(fù)制配置
首先,需要安裝兩個(gè)MySQL,這里是:
Master:192.168.1.227
Slave:192.168.1.224
原始數(shù)據(jù)庫(kù)的模樣如下:
一、Master配置
(1)在Master數(shù)據(jù)庫(kù)安裝半同步復(fù)制插件:
mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
(2)設(shè)置Master上開啟半同步復(fù)制:
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的區(qū)別開
[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)參數(shù)說(shuō)明:
1、rpl_semi_sync_master_enabled = 1
,表示在master上已經(jīng)開啟了半同步復(fù)制模式;
2、rpl_semi_sync_master_timeout = 10000
,表示如果主庫(kù)在某次事務(wù)中的等待時(shí)間超過(guò)10000毫秒,則降級(jí)為異步復(fù)制模式,不在等待slave從庫(kù)。如果主庫(kù)再次探測(cè)到slave從恢復(fù)了,則會(huì)自動(dòng)切換回半同步復(fù)制模式;
3、rpl_semi_sync_master_wait_no_slave
,表示是否允許master每個(gè)事務(wù)提交后都要等待slave的接收確認(rèn)信號(hào)。默認(rèn)為ON,即每一個(gè)事務(wù)都會(huì)等待。如果為OFF,則slave追趕上之后,也不會(huì)開啟半同步復(fù)制模式,需要手工開啟;
4、rpl_semi_sync_master_trace_level = 32
,指用于開啟半同步復(fù)制模式時(shí)的調(diào)試級(jí)別,默認(rèn)為32。
可以看出,在配置Master的時(shí)候,只設(shè)置了1,其他的都采取的默認(rèn)設(shè)置。
二、Slave配置
(1)在Slave數(shù)據(jù)庫(kù)安裝半同步復(fù)制插件:
mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
(2)設(shè)置Slave上開啟半同步復(fù)制:
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的區(qū)別開
[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)參數(shù)說(shuō)明:
1、rpl_semi_sync_slave_enabled = 1
,表示在slave上已經(jīng)開啟了半同步復(fù)制模式;
2、rpl_semi_sync_slave_trace_level = 32
,指用于開啟半同步復(fù)制模式時(shí)的調(diào)試級(jí)別,默認(rèn)為32。
三、為Slave指定Master
(1)命令行模式下重啟Master
root@xuliugen:~# service mysql restart
(2)命令行模式下重啟Slave
root@xuliugen:~# service mysql restart
(3)查看Master狀態(tài):
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、首先關(guān)閉Slave的半同步復(fù)制
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主庫(kù)IP地址 master_user='root',Master主庫(kù)數(shù)據(jù)庫(kù)賬戶 master_password='123456',Master主庫(kù)數(shù)據(jù)庫(kù)root用戶密碼 master_log_file='mysql-bin.000004', Master主庫(kù)binlog文件 master_log_pos=154,Master主庫(kù)binlog文件position
注意:
在MySQL 5.6版本以后,在進(jìn)行主從復(fù)制的時(shí)候可以使用GTID的方式,無(wú)需再找binglog和pos點(diǎn),只需要知道主服務(wù)器的IP、端口、賬戶、密碼就可以實(shí)現(xiàn)自動(dòng)找點(diǎn)同步,開啟GTID功能的時(shí)候就不用再使用binlog和pos了。詳細(xì)信息,請(qǐng)查閱相關(guān)資料進(jìn)行學(xué)習(xí)。
3、開啟Slave的半同步復(fù)制
mysql> start slave; Query OK, 0 rows affected (0.01 sec)
四、測(cè)試半同步復(fù)制是否成功
五、如何優(yōu)雅的關(guān)閉Slave同步信息
在某些時(shí)候,一臺(tái)服務(wù)器不再用來(lái)作為Slave,那么我們就需要清楚他的同步信息,一般會(huì)使用:
mysql> stop slave #先關(guān)閉 mysql> reset slave #清楚Slave同步信息
但是,這樣再通過(guò)show master status\G顯示的時(shí)候:
mysql> show master status\G;
還是會(huì)出現(xiàn)同步的信息,這是因?yàn)閳?zhí)行了 reset slave
只是把 master.info 和 relay-log.info 文件刪除了,但同步信息還在,如果有人在執(zhí)行start slave
命令開啟了同步功能,結(jié)果就會(huì)又從頭開始同步了,有可能還會(huì)造成數(shù)據(jù)的丟失。
如何讓其清除的更干凈哪?請(qǐng)使用下邊的命令:
mysql> stop slave #先關(guān)閉 mysql> reset slave all#清楚Slave同步信息
再次執(zhí)行show master status\G
就不會(huì)再有任何信息了。
六、部分異常場(chǎng)景模擬
(1)半同步復(fù)制與異步復(fù)制的切換:
上述已經(jīng)介紹了為什么會(huì)出現(xiàn)半同步復(fù)制到異步復(fù)制的切換,那么現(xiàn)在模擬一個(gè)場(chǎng)景進(jìn)行演示。
場(chǎng)景如下:
1、關(guān)閉slave同步,停止IO接收binlog日志
mysql> stop slave;
該操作就將IO線程關(guān)閉,等待10秒之后,如果master未收到來(lái)自slave的確認(rèn)信息,就會(huì)切換到異步復(fù)制模式:
上圖看到slave已經(jīng)關(guān)閉了半同步復(fù)制模式,再次開啟:
mysql> start slave;
此時(shí),已經(jīng)還原到半同步復(fù)制模式了。
(2)同步報(bào)錯(cuò)案例演示:
我們,首先從slave庫(kù)上刪除數(shù)據(jù)庫(kù)表 ufind
,然后到master再次刪除該庫(kù)ufind
,該同步就會(huì)報(bào)錯(cuò):
Last_Error: Error 'Can't drop database 'ufind'; database doesn't exist' on query. Default database: 'ufind'. Query: 'DROP DATABASE `ufind`'
此時(shí),查看半同步狀態(tài):
是開啟的,因此沒(méi)有將半同步復(fù)制模式轉(zhuǎn)化為異步復(fù)制模式,可以看出半同步復(fù)制模式跟IO_Thread
是有直接關(guān)系的,但跟SQL_THREAD
沒(méi)有關(guān)系。
也就是說(shuō),slave從庫(kù)接收完二進(jìn)制日志后給master主庫(kù)一個(gè)確認(rèn),但是他不會(huì)管relay-log
中繼日志是否執(zhí)行完畢。
看完上述內(nèi)容,你們對(duì)怎么在MySQL中配置半同步復(fù)制有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。