介紹無損復(fù)制之前,首先介紹一下半同步復(fù)制 半同步復(fù)制: 無損復(fù)制屬于半同步復(fù)制的一種。 一、半同步復(fù)制介紹 1,兩個插件實(shí)現(xiàn)半同步復(fù)制功能。主庫有一個插件,從庫有一個插件。 2,系統(tǒng)變量控制插件特性。幾個列子 參數(shù): 1)rpl_semi_sync_master_enabled 控制是否在主庫上啟用半同步復(fù)制。要啟用或禁用插件,請分別將此變量設(shè)置為1或0。默認(rèn)值是0(關(guān)閉)。 2)rpl_semi_sync_master_timeout 一個以毫秒為單位的值,用于控制主服務(wù)器等待來自從服務(wù)器的確認(rèn)提交并恢復(fù)到異步復(fù)制的時間,超過這個值就是超時。 默認(rèn)值是10000(10秒)。超時之后,就從半同步復(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)超時,主服務(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)安裝插件的功能需要一個支持動態(tài)加載的MySQL服務(wù)器。要驗(yàn)證這一點(diǎn),請檢查have_dynamic_loading系統(tǒng)變量的值是否為YES。 3)復(fù)制必須已經(jīng)在工作。 4)不能有多個復(fù)制通道配置。半同步復(fù)制僅與默認(rèn)復(fù)制通道兼容。 要設(shè)置半同步復(fù)制,請使用以下說明。 這里提到的INSTALL PLUGIN,SET GLOBAL,STOP SLAVE和START SLAVE語句需要SUPER權(quán)限。 MySQL發(fā)布包括主端和從端的半同步復(fù)制插件文件。 要被主庫或從庫使用,相應(yīng)的插件庫文件必須位于MySQL插件目錄(由plugin_dir系統(tǒng)變量命名的目錄)中。如有必要,請在服務(wù)器啟動時設(shè)置plugin_dir的值,以告知服務(wù)器插件目錄位置。 插件庫文件基名是semisync_master和semisync_slave。 每個平臺的文件名后綴都不相同(例如,用于Unix和類Unix系統(tǒng)的.so,用于Windows的.dll) 主插件庫文件必須存在于主服務(wù)器的插件目錄中。從插件庫文件必須存在于每個從服務(wù)器的插件目錄中 要加載插件,請在主站和每個要半同步的從站上使用INSTALL PLUGIN語句(根據(jù)需要為您的平臺調(diào)整.so后綴)。 MySQL發(fā)布包括主端和從端的半同步復(fù)制插件文件。 要被主庫或從庫使用,相應(yīng)的插件庫文件必須位于MySQL插件目錄(由plugin_dir系統(tǒng)變量命名的目錄)中。如有必要,請在服務(wù)器啟動時設(shè)置plugin_dir的值,以告知服務(wù)器插件目錄位置。 插件庫文件基名是semisync_master和semisync_slave。 每個平臺的文件名后綴都不相同(例如,用于Unix和類Unix系統(tǒng)的.so,用于Windows的.dll) 主插件庫文件必須存在于主服務(wù)器的插件目錄中。從插件庫文件必須存在于每個從服務(wù)器的插件目錄中 要加載插件,請在主站和每個要半同步的從站上使用INSTALL PLUGIN語句(根據(jù)需要為您的平臺調(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'; 如果嘗試安裝插件會導(dǎo)致類似于此處顯示的錯誤,則必須安裝libimf: 2,查看安裝了哪些插件 要查看哪些插件已安裝,請使用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ù)制將是異步的。 要控制是否啟用已安裝的插件,請設(shè)置適當(dāng)?shù)南到y(tǒng)變量。可以在運(yùn)行時使用SET GLOBAL或在服務(wù)器啟動時在命令行或選項文件中設(shè)置這些變量。 在運(yùn)行時,這些主庫端系統(tǒng)變量是可用的: SET GLOBAL rpl_semi_sync_master_enabled = {0|1}; SET GLOBAL rpl_semi_sync_master_timeout = N; 在從庫方面,這個系統(tǒng)變量是可用的: SET GLOBAL rpl_semi_sync_slave_enabled = {0|1}; 對于rpl_semi_sync_master_enabled或rpl_semi_sync_slave_enabled,值應(yīng)該為1以啟用半同步復(fù)制,或者使用0來禁用它。 默認(rèn)情況下,這些變量設(shè)置為0。 對于rpl_semi_sync_master_timeout,值N以毫秒為單位給出。 默認(rèn)值是10000(10秒)。 3,如果在運(yùn)行時在從庫上啟用半同步復(fù)制,則還必須啟動從庫I/O線程(如果它已在運(yùn)行,則首先停止),以使從庫連接到主庫并注冊為半同步從庫: STOP SLAVE IO_THREAD; START SLAVE IO_THREAD; 如果I/O線程已經(jīng)在運(yùn)行,并且不重新啟動,則從庫設(shè)備將繼續(xù)使用異步復(fù)制 在服務(wù)器啟動時,可以將控制半同步復(fù)制的變量設(shè)置為命令行選項或選項文件。每次服務(wù)器啟動時,選項文件中列出的設(shè)置都會生效。例如,您可以按如下方式設(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ù)制功能的插件公開了可以檢查的幾個系統(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)由于提交阻塞超時或從站追趕而導(dǎo)致主站在異步或半同步復(fù)制之間切換時,它會適當(dāng)?shù)卦O(shè)置Rpl_semi_sync_master_status狀態(tài)變量的值。 從主機(jī)上的半同步復(fù)制到異步復(fù)制的自動回退意味著,即使在此時半同步復(fù)制實(shí)際上不可操作的情況下,rpl_semi_sync_master_enabled系統(tǒng)變量也可能在主端具有值1。 可以監(jiān)視Rpl_semi_sync_master_status狀態(tài)變量,以確定當(dāng)前主服務(wù)器是使用異步還是半同步復(fù)制。 要查看連接了多少個半同步從站,請檢查狀態(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)查看是否支持動態(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ù)制 測試1,半同步復(fù)制 1,主庫設(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)。所以這時候主庫宕機(jī),最后的一個事物的數(shù)據(jù),備庫是沒有的,會發(fā)生丟數(shù)據(jù)。 測試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)。所以這時候主庫宕機(jī),不會發(fā)生丟數(shù)據(jù)。 |
免責(zé)聲明:本站部分文章和圖片均來自用戶投稿和網(wǎng)絡(luò)收集,旨在傳播知識,文章和圖片版權(quán)歸原作者及原出處所有,僅供學(xué)習(xí)與參考,請勿用于商業(yè)用途,如果損害了您的權(quán)利,請聯(lián)系我們及時修正或刪除。謝謝!
始終以前瞻性的眼光聚焦站長、創(chuàng)業(yè)、互聯(lián)網(wǎng)等領(lǐng)域,為您提供最新最全的互聯(lián)網(wǎng)資訊,幫助站長轉(zhuǎn)型升級,為互聯(lián)網(wǎng)創(chuàng)業(yè)者提供更加優(yōu)質(zhì)的創(chuàng)業(yè)信息和品牌營銷服務(wù),與站長一起進(jìn)步!讓互聯(lián)網(wǎng)創(chuàng)業(yè)者不再孤獨(dú)!
掃一掃,關(guān)注站長網(wǎng)微信