溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL的半同步復(fù)制

發(fā)布時(shí)間:2020-08-12 00:23:55 來(lái)源:ITPUB博客 閱讀:103 作者:orclwujian 欄目:MySQL數(shù)據(jù)庫(kù)

MySQL5.5 除了支持內(nèi)置的異步復(fù)制機(jī)制,還提供了接口支持半同步復(fù)制的機(jī)制。

異步復(fù)制的缺點(diǎn):

MySQL復(fù)制默認(rèn)是異步復(fù)制,Master將事件寫入binlog,但并不知道Slave是否或何時(shí)已經(jīng)接收且已處理。在異步復(fù)制的機(jī)制的情況下,如果Master宕機(jī),事務(wù)在Master上已提交,但很可能這些事務(wù)沒有傳到任何的Slave上。假設(shè)有Master->Salve故障轉(zhuǎn)移的機(jī)制,此時(shí)Slave也可能會(huì)丟失事務(wù)。

半同步復(fù)制的概念:
i.
當(dāng)Slave主機(jī)連接到Master時(shí),能夠查看其是否處于半同步復(fù)制的機(jī)制。

ii.
當(dāng)Master上開啟半同步復(fù)制的功能時(shí),至少應(yīng)該有一個(gè)Slave開啟其功能。此時(shí),一個(gè)線程在Master上提交事務(wù)將受到阻塞,直到得知一個(gè)已開啟半同步復(fù)制功能的Slave已收到此事務(wù)的所有事件,或等待超時(shí)。

iii.
當(dāng)一個(gè)事務(wù)的事件都已寫入其relay-log中且已刷新到磁盤上,Slave才會(huì)告知已收到。

iv.
如果等待超時(shí),也就是Master沒被告知已收到,此時(shí)Master會(huì)自動(dòng)轉(zhuǎn)換為異步復(fù)制的機(jī)制。當(dāng)至少一個(gè)半同步的Slave趕上了,Master與其Slave自動(dòng)轉(zhuǎn)換為半同步復(fù)制的機(jī)制。

v.
半同步復(fù)制的功能要在Master,Slave都開啟,半同步復(fù)制才會(huì)起作用;否則,只開啟一邊,它依然為異步復(fù)制。


同步,異步,半同步復(fù)制的比較:

同步復(fù)制:Master提交事務(wù),直到事務(wù)在所有的Slave都已提交,此時(shí)才會(huì)返回客戶端,事務(wù)執(zhí)行完畢。缺點(diǎn):完成一個(gè)事務(wù)可能會(huì)有很大的延遲。

異步復(fù)制:當(dāng)Slave準(zhǔn)備好才會(huì)向Master請(qǐng)求binlog。缺點(diǎn):不能保證一些事件都能夠被所有的Slave所接收。

半同步復(fù)制:半同步復(fù)制工作的機(jī)制處于同步和異步之間,Master的事務(wù)提交阻塞,只要一個(gè)Slave已收到該事務(wù)的事件且已記錄。它不會(huì)等待所有的Slave都告知已收到,且它只是接收,并不用等其完全執(zhí)行且提交。

半同步復(fù)制的控制變量,狀態(tài)監(jiān)控變量:

控制變量

Variable Name Variable Scope Dynamic Variable Type Default Effect Host
rpl_semi_sync_master_enabled Global Yes boolean OFF Master
rpl_semi_sync_slave_enabled Global Yes boolean OFF Slave
rpl_semi_sync_master_timeout Global Yes numeric 10000 Master


解釋:

rpl_semi_sync_master_enabled是控制Master是否開啟半同步,開啟或不開啟,將其設(shè)置為ON或OFF(1or0).

rpl_semi_sync_master_timeout是控制Master等待多長(zhǎng)時(shí)間被告知Slave已收到,也就是所謂的超時(shí)時(shí)間。

rpl_semi_sync_slave_enabled是控制Slave是否開啟半同步,開啟或不開啟,將其設(shè)置為ON或OFF(1or0)。

監(jiān)控半同步復(fù)制的狀態(tài)變量(幾個(gè)常用的)

Rpl_semi_sync_master_clients:查看有多少個(gè)開啟半同步復(fù)制的插件的Slave

Rpl_semi_sync_master_status:查看在Master上半同步復(fù)制是否正在運(yùn)行,其值為ON時(shí),說(shuō)明Master已啟用半同步且已被告知有Slave收到;其值為OFF時(shí),說(shuō)明Master沒啟用半同步或是沒被告知,由于timeout等原因。

Rpl_semi_sync_master_no_tx:查看有多少事務(wù)沒有用半同步復(fù)制的機(jī)制進(jìn)行復(fù)制。

Rpl_semi_sync_master_yes_tx:查看有多少事務(wù)是通過(guò)半同步復(fù)制機(jī)制成功復(fù)制。

Rpl_semi_sync_slave_status:查看Slave上半同步復(fù)制是否正常運(yùn)行,其值為ON時(shí),說(shuō)明Slave正通過(guò)半同步復(fù)制且Slave I/O正在運(yùn)行;為OFF時(shí),反之。

說(shuō)明關(guān)于其它的請(qǐng)參閱:http://dev.mysql.com/doc/refman/5.5/en/index.html

半同步復(fù)制的安裝,配置 http://www.linuxidc.com

環(huán)境要求:
i.
MySQL5.5或以上版本

ii.
在MySQL上安裝插件需要數(shù)據(jù)庫(kù)支持動(dòng)態(tài)載入。檢查是否支持,用如下檢測(cè):

mysql> show global variables like 'have_dynamic_loading';

+----------------------+-------+

| Variable_name        | Value |

+----------------------+-------+

| have_dynamic_loading | YES  |

+----------------------+-------+

1 row in set (0.00 sec)


iii.半同步復(fù)制是基于復(fù)制的環(huán)境。也就是說(shuō)配置半同步復(fù)制前,已有復(fù)制的環(huán)境。

安裝:

在Master上執(zhí)行:

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


各個(gè)Slave上執(zhí)行:

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


如果不清楚Plugin的目錄,用如下查找:

mysql> show global variables like 'plugin_dir';

+---------------+----------------------------------+

| Variable_name | Value                            |

+---------------+----------------------------------+

| plugin_dir    | /opt/usr/local/mysql/lib/plugin/ |

+---------------+----------------------------------+


檢查Plugin是否已正確安裝:

mysql> show plugins;

or

mysql> select * from information_schema.plugins;

配置:

在Master上執(zhí)行:

mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;

mysql> SET GLOBAL rpl_semi_sync_master_timeout = N;


在Slave上執(zhí)行:

mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;

說(shuō)明:http://www.linuxidc.com

如果在一個(gè)正在運(yùn)行的Slave上開啟半同步復(fù)制的功能,必須先停止Slave I/O,將其啟用半同步后,再開啟Slave I/O.

mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;


如果不這樣做,Slave還是會(huì)以異步的方式進(jìn)行復(fù)制。

正如大家所知,如果不將變量的設(shè)置寫到配置文件,下次重啟數(shù)據(jù)庫(kù),將失效。寫入配置文件:

Master上:

[mysqld]

rpl_semi_sync_master_enabled=1

rpl_semi_sync_master_timeout=1000 # 1 second


Slave上:

[mysqld]

rpl_semi_sync_slave_enabled=1

總結(jié):半同步復(fù)制個(gè)人感覺是維持?jǐn)?shù)據(jù)完整性,安全性的的一個(gè)策略,雖會(huì)損失一點(diǎn)性能,還是值得的。配置很簡(jiǎn)單,關(guān)鍵是理解其工作機(jī)制。
mysql半同步復(fù)制機(jī)制和oracle DG的最大高可用模式有異曲同工之妙,mysql的同步機(jī)制則和 oracle DG的最大保護(hù)模式相似,mysql異步機(jī)制和oracle DG最大性能模式相似

向AI問一下細(xì)節(jié)

免責(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)容。

AI