介紹無損復(fù)制之前,首先介紹一下半同步復(fù)制
半同步復(fù)制:
無損復(fù)制屬于半同步復(fù)制的一種。
一、半同步復(fù)制介紹
1,兩個(gè)插件實(shí)現(xiàn)半同步復(fù)制功能。主庫有一個(gè)插件,從庫有一個(gè)插件。
2,系統(tǒng)變量控制插件特性。幾個(gè)列子
參數(shù):
1)rpl_semi_sync_master_enabled
控制是否在主庫上啟用半同步復(fù)制。要啟用或禁用插件,請(qǐng)分別將此變量設(shè)置為1或0。默認(rèn)值是0(關(guān)閉)。
2)rpl_semi_sync_master_timeout
一個(gè)以毫秒為單位的值,用于控制主
服務(wù)器等待來自從服務(wù)器的確認(rèn)提交并恢復(fù)到異步復(fù)制的時(shí)間,超過這個(gè)值就是超時(shí)。 默認(rèn)值是10000(10秒)。超時(shí)之后,就從半同步復(fù)制,返回到異步復(fù)制。
3)rpl_semi_sync_slave_enabled
作用和參數(shù) rpl_semi_sync_master_enabled相似,但是控制的是從庫的插件。
3,啟用半同步復(fù)制監(jiān)視的狀態(tài)變量。一些例子:
參數(shù):
1)Rpl_semi_sync_master_clients
半同步從庫的數(shù)量。
2)Rpl_semi_sync_master_status
當(dāng)前是否在主服務(wù)器上運(yùn)行半同步復(fù)制。如果插件已啟用并且未提交確認(rèn),則值為1。如果插件未啟用,或者由于提交確認(rèn)超時(shí),主服務(wù)器已回退到異步復(fù)制,則為0。
3)Rpl_semi_sync_master_yes_tx
從庫成功確認(rèn)的提交數(shù)量。
4)Rpl_semi_sync_master_no_tx
從庫未成功確認(rèn)的提交數(shù)量。
5)Rpl_semi_sync_slave_status
當(dāng)前是否在從站上運(yùn)行半同步復(fù)制。如果插件已啟用且從屬I/O線程正在運(yùn)行,則為1,否則為0。
二、半同步復(fù)制安裝和配置
半同步復(fù)制是使用插件實(shí)現(xiàn)的,因此必須將插件安裝到數(shù)據(jù)庫中以使其可用。插件安裝完成后,通過與其關(guān)聯(lián)的系統(tǒng)變量來控制插件。直有關(guān)聯(lián)的插件安裝完成后,這些系統(tǒng)變量才可用。
要使用半同步復(fù)制,必須滿足以下要求:
1)必須安裝MySQL 5.5或更高版本。
2)安裝插件的功能需要一個(gè)支持動(dòng)態(tài)加載的MySQL服務(wù)器。要驗(yàn)證這一點(diǎn),請(qǐng)檢查have_dynamic_loading系統(tǒng)變量的值是否為YES。
3)復(fù)制必須已經(jīng)在工作。
4)不能有多個(gè)復(fù)制通道配置。半同步復(fù)制僅與默認(rèn)復(fù)制通道兼容。
要設(shè)置半同步復(fù)制,請(qǐng)使用以下說明。
這里提到的INSTALL PLUGIN,SET GLOBAL,STOP SLAVE和START SLAVE語句需要SUPER權(quán)限。
MySQL發(fā)布包括主端和從端的半同步復(fù)制插件文件。
要被主庫或從庫使用,相應(yīng)的插件庫文件必須位于MySQL插件目錄(由plugin_dir系統(tǒng)變量命名的目錄)中。如有必要,請(qǐng)?jiān)诜?wù)器啟動(dòng)時(shí)設(shè)置plugin_dir的值,以告知服務(wù)器插件目錄位置。
插件庫文件基名是semisync_master和semisync_slave。 每個(gè)平臺(tái)的文件名后綴都不相同(例如,用于Unix和類Unix系統(tǒng)的.so,用于Windows的.dll)
主插件庫文件必須存在于主服務(wù)器的插件目錄中。從插件庫文件必須存在于每個(gè)從服務(wù)器的插件目錄中
要加載插件,請(qǐng)?jiān)谥髡竞兔總€(gè)要半同步的從站上使用INSTALL PLUGIN語句(根據(jù)需要為您的平臺(tái)調(diào)整.so后綴)。
MySQL發(fā)布包括主端和從端的半同步復(fù)制插件文件。
要被主庫或從庫使用,相應(yīng)的插件庫文件必須位于MySQL插件目錄(由plugin_dir系統(tǒng)變量命名的目錄)中。如有必要,請(qǐng)?jiān)诜?wù)器啟動(dòng)時(shí)設(shè)置plugin_dir的值,以告知服務(wù)器插件目錄位置。
插件庫文件基名是semisync_master和semisync_slave。 每個(gè)平臺(tái)的文件名后綴都不相同(例如,用于Unix和類Unix系統(tǒng)的.so,用于Windows的.dll)
主插件庫文件必須存在于主服務(wù)器的插件目錄中。從插件庫文件必須存在于每個(gè)從服務(wù)器的插件目錄中
要加載插件,請(qǐng)?jiān)谥髡竞兔總€(gè)要半同步的從站上使用INSTALL PLUGIN語句(根據(jù)需要為您的平臺(tái)調(diào)整.so后綴)。
1,安裝插件
On the master:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
On each slave:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
如果嘗試安裝插件會(huì)導(dǎo)致類似于此處顯示的錯(cuò)誤,則必須安裝libimf:
2,查看安裝了哪些插件
要查看哪些插件已安裝,請(qǐng)使用SHOW PLUGINS語句,或者查詢INFORMATION_SCHEMA.PLUGINS表。
例如:
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE '%semi%';
在安裝半同步復(fù)制插件之后,默認(rèn)情況下它是禁用的。主庫和從庫都必須啟用插件才能啟用半同步復(fù)制。 如果只啟用了一方,復(fù)制將是異步的。
要控制是否啟用已安裝的插件,請(qǐng)?jiān)O(shè)置適當(dāng)?shù)南到y(tǒng)變量??梢栽谶\(yùn)行時(shí)使用SET GLOBAL或在服務(wù)器啟動(dòng)時(shí)在命令行或選項(xiàng)文件中設(shè)置這些變量。
在運(yùn)行時(shí),這些主庫端系統(tǒng)變量是可用的:
SET GLOBAL rpl_semi_sync_master_enabled = {0|1};
SET GLOBAL rpl_semi_sync_master_timeout = N;
在從庫方面,這個(gè)系統(tǒng)變量是可用的:
SET GLOBAL rpl_semi_sync_slave_enabled = {0|1};
對(duì)于rpl_semi_sync_master_enabled或rpl_semi_sync_slave_enabled,值應(yīng)該為1以啟用半同步復(fù)制,或者使用0來禁用它。 默認(rèn)情況下,這些變量設(shè)置為0。
對(duì)于rpl_semi_sync_master_timeout,值N以毫秒為單位給出。 默認(rèn)值是10000(10秒)。
3,如果在運(yùn)行時(shí)在從庫上啟用半同步復(fù)制,則還必須啟動(dòng)從庫I/O線程(如果它已在運(yùn)行,則首先停止),以使從庫連接到主庫并注冊(cè)為半同步從庫:
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
如果I/O線程已經(jīng)在運(yùn)行,并且不重新啟動(dòng),則從庫設(shè)備將繼續(xù)使用異步復(fù)制
在服務(wù)器啟動(dòng)時(shí),可以將控制半同步復(fù)制的變量設(shè)置為命令行選項(xiàng)或選項(xiàng)文件。每次服務(wù)器啟動(dòng)時(shí),選項(xiàng)文件中列出的設(shè)置都會(huì)生效。例如,您可以按如下方式設(shè)置主站和從站的my.cnf文件中的變量。
On the master:
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 # 1 second
On each slave:
[mysqld]
rpl_semi_sync_slave_enabled=1
三,半同步復(fù)制監(jiān)控
半同步復(fù)制功能的插件公開了可以檢查的幾個(gè)系統(tǒng)和狀態(tài)變量,以確定其配置和操作狀態(tài)。
系統(tǒng)變量反映了如何配置半同步復(fù)制。要檢查它們的值,使用SHOW VARIABLES:
mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
狀態(tài)變量使您能夠監(jiān)視半同步復(fù)制的操作。要檢查它們的值,使用SHOW STATUS:
mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
當(dāng)由于提交阻塞超時(shí)或從站追趕而導(dǎo)致主站在異步或半同步復(fù)制之間切換時(shí),它會(huì)適當(dāng)?shù)卦O(shè)置Rpl_semi_sync_master_status狀態(tài)變量的值。
從主機(jī)上的半同步復(fù)制到異步復(fù)制的自動(dòng)回退意味著,即使在此時(shí)半同步復(fù)制實(shí)際上不可操作的情況下,rpl_semi_sync_master_enabled系統(tǒng)變量也可能在主端具有值1。 可以監(jiān)視Rpl_semi_sync_master_status狀態(tài)變量,以確定當(dāng)前主服務(wù)器是使用異步還是半同步復(fù)制。
要查看連接了多少個(gè)半同步從站,請(qǐng)檢查狀態(tài)參數(shù)Rpl_semi_sync_master_clients。
show status like '%rpl_semi_sync_master_clients%';
Rpl_semi_sync_master_yes_tx和Rpl_semi_sync_master_no_tx變量指示已成功確認(rèn)或從屬失敗的提交數(shù)。
show status like '%Rpl_semi_sync_master_yes_tx%';
show status like '%Rpl_semi_sync_master_no_tx%';
在從屬方面,Rpl_semi_sync_slave_status指示當(dāng)前是否正在運(yùn)行半同步復(fù)制。
mysql> SHOW STATUS LIKE 'Rpl_semi_sync_slave_status%';
四:具體實(shí)驗(yàn)步驟
1)查看是否支持動(dòng)態(tài)加載的MySQL服務(wù)器
mysql> show variables like '%dynamic%';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| have_dynamic_loading | YES |
+----------------------+-------+
2)主庫安裝semisync_master插件
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.05 sec)
3)備庫安裝semisync_slave插件
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.07 sec)
4)主庫查看關(guān)于半同步復(fù)制的一些參數(shù)值
mysql> show variables like '%semi%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | OFF |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.00 sec)
5)主庫重新設(shè)置
mysql> SET GLOBAL rpl_semi_sync_master_enabled =1;
Query OK, 0 rows affected (0.00 sec)
6)備庫查看本同步復(fù)制的參數(shù)值
mysql> show variables like '%rpl_semi%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
7)備庫重新設(shè)置參數(shù)
mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;
Query OK, 0 rows affected (0.00 sec)
8)從庫重新關(guān)閉,再開啟IO_THREAD線程
mysql> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)
mysql> START SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)
9)備庫查看半同步復(fù)制狀態(tài),
mysql> SHOW STATUS LIKE 'Rpl_semi_sync_slave_status%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
無損復(fù)制
普通的半同步復(fù)制
測(cè)試1,半同步復(fù)制
1,主庫設(shè)置超時(shí)時(shí)間為10000秒,備庫停掉復(fù)制,模擬timeout
mysql> set global rpl_semi_sync_master_timeout=100000000;
Query OK, 0 rows affected (0.00 sec)
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
2,主庫修改參數(shù)pl_semi_sync_master_wait_point,修改成普通的半同步復(fù)制
mysql> set global rpl_semi_sync_master_wait_point=AFTER_COMMIT;
Query OK, 0 rows affected (0.00 sec)
3,主庫開窗口1,向表中插入一條數(shù)據(jù)
發(fā)現(xiàn)窗口1,卡住
主庫開窗口2 ,查詢這張表
發(fā)現(xiàn)數(shù)據(jù)已經(jīng)有了。
故得出結(jié)論,普通的半同步復(fù)制是在commit binlog之后。再需要得到備庫的確認(rèn)。所以這時(shí)候主庫宕機(jī),最后的一個(gè)事物的數(shù)據(jù),備庫是沒有的,會(huì)發(fā)生丟數(shù)據(jù)。
測(cè)試2,無損的半同步復(fù)制
1,主庫修改參數(shù)rpl_semi_sync_master_wait_point,為無損復(fù)制
mysql> set global rpl_semi_sync_master_wait_point=AFTER_SYNC;
Query OK, 0 rows affected (0.00 sec)
2,主庫開窗口1,向表中插入一條數(shù)據(jù)
發(fā)現(xiàn)窗口1,卡住
主庫開窗口2 ,查詢這張表
發(fā)現(xiàn)數(shù)據(jù)還沒有。
故得出結(jié)論,無損的半同步復(fù)制是再write binlog之后。在需要得到備庫的確認(rèn)。所以這時(shí)候主庫宕機(jī),不會(huì)發(fā)生丟數(shù)據(jù)。
世界語中文簡(jiǎn)體中文繁體丹麥語烏克蘭語烏茲別克語烏爾都語亞美尼亞語伊博語俄語保加利亞語僧伽羅語克羅地亞語冰島語加利西亞語加泰羅尼亞語匈牙利語南非祖魯語卡納達(dá)語印地語印尼巽他語印尼爪哇語印尼語古吉拉特語哈薩克語土耳其語塔吉克語塞爾維亞語塞索托語威爾士語孟加拉語宿務(wù)語尼泊爾語巴斯克語布爾語(南非荷蘭語)希伯來語希臘語德語意大利語意第緒語拉丁語拉脫維亞語挪威語捷克語斯洛伐克語斯洛文尼亞語斯瓦希里語旁遮普語日語格魯吉亞語毛利語法語波蘭語波斯尼亞語波斯語泰盧固語泰米爾語泰語海地克里奧爾語愛爾蘭語愛沙尼亞語瑞典語白俄羅斯語立陶宛語索馬里語約魯巴語緬甸語羅馬尼亞語老撾語芬蘭語苗語英語荷蘭語菲律賓語葡萄牙語蒙古語西班牙語豪薩語越南語阿塞拜疆語阿爾巴尼亞語阿拉伯語韓語馬其頓語馬爾加什語馬拉地語馬拉雅拉姆語馬來語馬耳他語高棉語齊切瓦語
| | | | | |
| | 選項(xiàng) : 歷史 : 反饋 : Donate
| 關(guān)閉
|