MySQL5.5 除了支持內(nèi)置的異步復(fù)制機(jī)制,還提供了接口支持半同步復(fù)制的機(jī)制。
10年積累的成都做網(wǎng)站、網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有甘谷免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
異步復(fù)制的缺點(diǎn):
MySQL復(fù)制默認(rèn)是異步復(fù)制,Master將事件寫(xiě)入binlog,但并不知道Slave是否或何時(shí)已經(jīng)接收且已處理。在異步復(fù)制的機(jī)制的情況下,如果Master宕機(jī),事務(wù)在Master上已提交,但很可能這些事務(wù)沒(méi)有傳到任何的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上開(kāi)啟半同步復(fù)制的功能時(shí),至少應(yīng)該有一個(gè)Slave開(kāi)啟其功能。此時(shí),一個(gè)線程在Master上提交事務(wù)將受到阻塞,直到得知一個(gè)已開(kāi)啟半同步復(fù)制功能的Slave已收到此事務(wù)的所有事件,或等待超時(shí)。
iii.
當(dāng)一個(gè)事務(wù)的事件都已寫(xiě)入其relay-log中且已刷新到磁盤(pán)上,Slave才會(huì)告知已收到。
iv.
如果等待超時(shí),也就是Master沒(méi)被告知已收到,此時(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都開(kāi)啟,半同步復(fù)制才會(huì)起作用;否則,只開(kāi)啟一邊,它依然為異步復(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是否開(kāi)啟半同步,開(kāi)啟或不開(kāi)啟,將其設(shè)置為ON或OFF(1or0).
rpl_semi_sync_master_timeout是控制Master等待多長(zhǎng)時(shí)間被告知Slave已收到,也就是所謂的超時(shí)時(shí)間。
rpl_semi_sync_slave_enabled是控制Slave是否開(kāi)啟半同步,開(kāi)啟或不開(kāi)啟,將其設(shè)置為ON或OFF(1or0)。
監(jiān)控半同步復(fù)制的狀態(tài)變量(幾個(gè)常用的)
Rpl_semi_sync_master_clients:查看有多少個(gè)開(kāi)啟半同步復(fù)制的插件的Slave
Rpl_semi_sync_master_status:查看在Master上半同步復(fù)制是否正在運(yùn)行,其值為ON時(shí),說(shuō)明Master已啟用半同步且已被告知有Slave收到;其值為OFF時(shí),說(shuō)明Master沒(méi)啟用半同步或是沒(méi)被告知,由于timeout等原因。
Rpl_semi_sync_master_no_tx:查看有多少事務(wù)沒(méi)有用半同步復(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上開(kāi)啟半同步復(fù)制的功能,必須先停止Slave I/O,將其啟用半同步后,再開(kāi)啟Slave I/O.
mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
如果不這樣做,Slave還是會(huì)以異步的方式進(jìn)行復(fù)制。
正如大家所知,如果不將變量的設(shè)置寫(xiě)到配置文件,下次重啟數(shù)據(jù)庫(kù),將失效。寫(xiě)入配置文件:
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è)人感覺(jué)是維持?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最大性能模式相似