介紹無損復制之前,首先介紹一下半同步復制 半同步復制: 無損復制屬于半同步復制的一種。 一、半同步復制介紹 1,兩個插件實現半同步復制功能。主庫有一個插件,從庫有一個插件。 2,系統變量控制插件特性。幾個列子 參數: 1)rpl_semi_sync_master_enabled 控制是否在主庫上啟用半同步復制。要啟用或禁用插件,請分別將此變量設置為1或0。默認值是0(關閉)。 2)rpl_semi_sync_master_timeout 一個以毫秒為單位的值,用于控制主服務器等待來自從服務器的確認提交并恢復到異步復制的時間,超過這個值就是超時。 默認值是10000(10秒)。超時之后,就從半同步復制,返回到異步復制。 3)rpl_semi_sync_slave_enabled 作用和參數 rpl_semi_sync_master_enabled相似,但是控制的是從庫的插件。 3,啟用半同步復制監視的狀態變量。一些例子: 參數: 1)Rpl_semi_sync_master_clients 半同步從庫的數量。 2)Rpl_semi_sync_master_status 當前是否在主服務器上運行半同步復制。如果插件已啟用并且未提交確認,則值為1。如果插件未啟用,或者由于提交確認超時,主服務器已回退到異步復制,則為0。 3)Rpl_semi_sync_master_yes_tx 從庫成功確認的提交數量。 4)Rpl_semi_sync_master_no_tx 從庫未成功確認的提交數量。 5)Rpl_semi_sync_slave_status 當前是否在從站上運行半同步復制。如果插件已啟用且從屬I/O線程正在運行,則為1,否則為0。 二、半同步復制安裝和配置 半同步復制是使用插件實現的,因此必須將插件安裝到數據庫中以使其可用。插件安裝完成后,通過與其關聯的系統變量來控制插件。直有關聯的插件安裝完成后,這些系統變量才可用。 要使用半同步復制,必須滿足以下要求: 1)必須安裝MySQL 5.5或更高版本。 2)安裝插件的功能需要一個支持動態加載的MySQL服務器。要驗證這一點,請檢查have_dynamic_loading系統變量的值是否為YES。 3)復制必須已經在工作。 4)不能有多個復制通道配置。半同步復制僅與默認復制通道兼容。 要設置半同步復制,請使用以下說明。 這里提到的INSTALL PLUGIN,SET GLOBAL,STOP SLAVE和START SLAVE語句需要SUPER權限。 MySQL發布包括主端和從端的半同步復制插件文件。 要被主庫或從庫使用,相應的插件庫文件必須位于MySQL插件目錄(由plugin_dir系統變量命名的目錄)中。如有必要,請在服務器啟動時設置plugin_dir的值,以告知服務器插件目錄位置。 插件庫文件基名是semisync_master和semisync_slave。 每個平臺的文件名后綴都不相同(例如,用于Unix和類Unix系統的.so,用于Windows的.dll) 主插件庫文件必須存在于主服務器的插件目錄中。從插件庫文件必須存在于每個從服務器的插件目錄中 要加載插件,請在主站和每個要半同步的從站上使用INSTALL PLUGIN語句(根據需要為您的平臺調整.so后綴)。 MySQL發布包括主端和從端的半同步復制插件文件。 要被主庫或從庫使用,相應的插件庫文件必須位于MySQL插件目錄(由plugin_dir系統變量命名的目錄)中。如有必要,請在服務器啟動時設置plugin_dir的值,以告知服務器插件目錄位置。 插件庫文件基名是semisync_master和semisync_slave。 每個平臺的文件名后綴都不相同(例如,用于Unix和類Unix系統的.so,用于Windows的.dll) 主插件庫文件必須存在于主服務器的插件目錄中。從插件庫文件必須存在于每個從服務器的插件目錄中 要加載插件,請在主站和每個要半同步的從站上使用INSTALL PLUGIN語句(根據需要為您的平臺調整.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'; 如果嘗試安裝插件會導致類似于此處顯示的錯誤,則必須安裝libimf: 2,查看安裝了哪些插件 要查看哪些插件已安裝,請使用SHOW PLUGINS語句,或者查詢INFORMATION_SCHEMA.PLUGINS表。 例如: mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%'; 在安裝半同步復制插件之后,默認情況下它是禁用的。主庫和從庫都必須啟用插件才能啟用半同步復制。 如果只啟用了一方,復制將是異步的。 要控制是否啟用已安裝的插件,請設置適當的系統變量。可以在運行時使用SET GLOBAL或在服務器啟動時在命令行或選項文件中設置這些變量。 在運行時,這些主庫端系統變量是可用的: SET GLOBAL rpl_semi_sync_master_enabled = {0|1}; SET GLOBAL rpl_semi_sync_master_timeout = N; 在從庫方面,這個系統變量是可用的: SET GLOBAL rpl_semi_sync_slave_enabled = {0|1}; 對于rpl_semi_sync_master_enabled或rpl_semi_sync_slave_enabled,值應該為1以啟用半同步復制,或者使用0來禁用它。 默認情況下,這些變量設置為0。 對于rpl_semi_sync_master_timeout,值N以毫秒為單位給出。 默認值是10000(10秒)。 3,如果在運行時在從庫上啟用半同步復制,則還必須啟動從庫I/O線程(如果它已在運行,則首先停止),以使從庫連接到主庫并注冊為半同步從庫: STOP SLAVE IO_THREAD; START SLAVE IO_THREAD; 如果I/O線程已經在運行,并且不重新啟動,則從庫設備將繼續使用異步復制 在服務器啟動時,可以將控制半同步復制的變量設置為命令行選項或選項文件。每次服務器啟動時,選項文件中列出的設置都會生效。例如,您可以按如下方式設置主站和從站的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 三,半同步復制監控 半同步復制功能的插件公開了可以檢查的幾個系統和狀態變量,以確定其配置和操作狀態。 系統變量反映了如何配置半同步復制。要檢查它們的值,使用SHOW VARIABLES: mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%'; 狀態變量使您能夠監視半同步復制的操作。要檢查它們的值,使用SHOW STATUS: mysql> SHOW STATUS LIKE 'Rpl_semi_sync%'; 當由于提交阻塞超時或從站追趕而導致主站在異步或半同步復制之間切換時,它會適當地設置Rpl_semi_sync_master_status狀態變量的值。 從主機上的半同步復制到異步復制的自動回退意味著,即使在此時半同步復制實際上不可操作的情況下,rpl_semi_sync_master_enabled系統變量也可能在主端具有值1。 可以監視Rpl_semi_sync_master_status狀態變量,以確定當前主服務器是使用異步還是半同步復制。 要查看連接了多少個半同步從站,請檢查狀態參數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變量指示已成功確認或從屬失敗的提交數。 show status like '%Rpl_semi_sync_master_yes_tx%'; show status like '%Rpl_semi_sync_master_no_tx%'; 在從屬方面,Rpl_semi_sync_slave_status指示當前是否正在運行半同步復制。 mysql> SHOW STATUS LIKE 'Rpl_semi_sync_slave_status%'; 四:具體實驗步驟 1)查看是否支持動態加載的MySQL服務器 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)主庫查看關于半同步復制的一些參數值 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)主庫重新設置 mysql> SET GLOBAL rpl_semi_sync_master_enabled =1; Query OK, 0 rows affected (0.00 sec) 6)備庫查看本同步復制的參數值 mysql> show variables like '%rpl_semi%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | rpl_semi_sync_slave_enabled | OFF | | rpl_semi_sync_slave_trace_level | 32 | 7)備庫重新設置參數 mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1; Query OK, 0 rows affected (0.00 sec) 8)從庫重新關閉,再開啟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)備庫查看半同步復制狀態, mysql> SHOW STATUS LIKE 'Rpl_semi_sync_slave_status%'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Rpl_semi_sync_slave_status | ON | +----------------------------+-------+ 無損復制 普通的半同步復制 測試1,半同步復制 1,主庫設置超時時間為10000秒,備庫停掉復制,模擬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,主庫修改參數pl_semi_sync_master_wait_point,修改成普通的半同步復制 mysql> set global rpl_semi_sync_master_wait_point=AFTER_COMMIT; Query OK, 0 rows affected (0.00 sec) 3,主庫開窗口1,向表中插入一條數據 發現窗口1,卡住 主庫開窗口2 ,查詢這張表 發現數據已經有了。 故得出結論,普通的半同步復制是在commit binlog之后。再需要得到備庫的確認。所以這時候主庫宕機,最后的一個事物的數據,備庫是沒有的,會發生丟數據。 測試2,無損的半同步復制 1,主庫修改參數rpl_semi_sync_master_wait_point,為無損復制 mysql> set global rpl_semi_sync_master_wait_point=AFTER_SYNC; Query OK, 0 rows affected (0.00 sec) 2,主庫開窗口1,向表中插入一條數據 發現窗口1,卡住 主庫開窗口2 ,查詢這張表 發現數據還沒有。 故得出結論,無損的半同步復制是再write binlog之后。在需要得到備庫的確認。所以這時候主庫宕機,不會發生丟數據。 |
免責聲明:本站部分文章和圖片均來自用戶投稿和網絡收集,旨在傳播知識,文章和圖片版權歸原作者及原出處所有,僅供學習與參考,請勿用于商業用途,如果損害了您的權利,請聯系我們及時修正或刪除。謝謝!
始終以前瞻性的眼光聚焦站長、創業、互聯網等領域,為您提供最新最全的互聯網資訊,幫助站長轉型升級,為互聯網創業者提供更加優質的創業信息和品牌營銷服務,與站長一起進步!讓互聯網創業者不再孤獨!
掃一掃,關注站長網微信