您好,登錄后才能下訂單哦!
本篇內容主要講解“MySQL半同步復制如何配置”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“MySQL半同步復制如何配置”吧!
前言:
MySQL默認的主從復制采用的是異步模式,主庫提交事務不需要確認是否已經傳送到從庫端,在主庫發生宕機主備切換時,可能導致主庫已經提交的事務在從庫丟失的情況。
在MySQL 5.7通過插件支持了半同步復制模式,半同步模式下,主庫事務至少要確保一個從庫接收到日志才能完成提交,因此,可以保證在主庫發生宕機時,已經提交的事務已經傳送到從庫,確保數據的不丟失。
半同步:
半同步復制相比于異步復制的性能影響,主要是數據完整性的權衡,增加了發送提交到從庫并確認接收的 TCP/IP 往返時間,所以,半同步復制需要有高傳輸的網絡以及主從兩地距離相近,如果網絡傳輸緩慢或者主從兩地距離跨度太遠,可能會導致主庫的性能下降以及半同步復制超時。
半同步復制的主庫和從庫會進行以下操作:
當連接到主庫時,復制進制會檢查主庫是否開啟了半同步復制;
如果主庫和從庫都開啟了半同步復制,線程在執行事務提交時,需要等待至少一個半同步從庫確認接收到事務或者直到等待超時;
從庫只要在事務已經完成寫入relay log并flushed磁盤(不需要執行完成這個事務),就可以向主庫發送確認事務已經接收完成;
如果沒有一個從庫在規定的時間內發送確認信息給主庫,則主庫半同步復制會出現超時,并且降級為異步復制,當至少一個半同步從庫能夠發送確認信息給主庫時,主庫會自動升級為半同步模式;
半同步復制需要在主庫和從庫同時開啟,如果存在主庫沒有開啟半同步模式或者主庫開啟半同步模式但沒有一個從庫開啟半同步模式,則主從復制依然是采用異步模式;
當主庫事務提交由于等待從庫確認而被堵塞,提交事務的會話將不會返回,直到堵塞結束,才返回會話,主庫事務的提交,需要等待至少一個從庫確認接受。
rpl_semi_sync_master_wait_for_slave_count 參數可以用于控制在主庫需要從庫確認的數量,默認為1。
堵塞也會發生在非事務表的rollback,因為非事務表是沒有回滾的,所以對于非事務表的rollback依然要寫入日志同步到從庫。
rpl_semi_sync_master_wait_point 參數用于半同步模式下控制主庫事務提交等待從庫確認事務接受的時間點,有兩種方式:
after_sync(默認):主庫寫入事務到binlog以及同步從庫并且sync binlog to disk,主庫同步后等待從庫接受到事務的確認,在等到從庫的確認之后,主庫提交事務到存儲引擎并且返回客戶端。
after_commit:主庫寫入事務到binlog以及同步從庫,sync binlog,并且提交事務到存儲引擎,在提交之后主庫等待從庫接受到事務的確認,在接受到確認之后,源端返回提交完成到客戶端。
兩種同步時間點主要存在以下的不同
在after_sync下,全部客戶端同一時間看到已經提交的事務,因為是在確認從庫已經接收到事務之后再提交存儲引擎的,所以全部客戶端是同一時間看到已經提交事務的數據;此外,在發生故障切換時,主庫全部已經提交的事務已經同步到從庫的relay log,從庫的數據是無損的。
client-->MySQLSQL Parse-->Storage Involve-->write binary log-->wait ACK-->storagecommit-->client(OK)
在after_commit下,提交事務的客戶端需要等待確認從庫已經接收到事務才能返回,但由于提交到存儲引擎是在確認從庫之前完成,所以,其他客戶端將比提交事務的客戶端更早的看到提交事務的數據,在發生故障切換時,在對于已經提交存儲引擎但還沒有確認從庫已經提交的事務,其他客戶端可能會出現與他們在源上看到的數據相關的數據丟失。
client-->MySQLSQL Parse-->Storage Involve-->write binary log-->storagecommit-->wait ACK-->client(OK)
綜上所述,建議使用默認的after_sync。
半同步安裝步驟:
環境信息:
MySQL版本:5.7.32
架構:一主(192.168.1.110:3306)二從(192.168.1.111:3306,192.168.1.111:3307)
binlog:on
binlog_row_image:full
binlog_format:row
gtid:on
準備條件:
半同步復制是建立在異步復制的基礎上,所以要提前配置好主從異步復制(此處步驟省略)。
半同步復制不支持多源復制(多個channel),半同步只能使用default channel。
配置管理使用命令 INSTALLPLUGIN, SET GLOBAL, STOP SLAVE, START SLAVE 以及超級權限 SUPER privilege。
安裝插件需要MySQLserver支持動態加載,需要確認have_dynamic_loading 為YES
show global variables like'%have_dynamic_loading%';
確認插件路徑配置正確,默認是在install_home/lib/plugin。
show global variables like '%plugin_dir%';
確認插件路徑plugin_dir下存在半同步復制插件semisync_master 和 semisync_slave,文件名后綴因平臺而異(例如,.so 用于 Unix 和類 Unix 系統,.dll 用于 Windows)。
配置半同步:
主從兩個都安裝,防止主從切換。
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
注:如果安裝出現以下失敗,則需要先安裝libimf。
mysql> INSTALLPLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; ERROR 1126(HY000): Can't open shared library '/usr/local/mysql/lib/plugin/semisync_master.so' (errno: 22libimf.so: cannot open shared object file: No such fileor directory)
查看組件是否加載。
show plugins; +----------------------------+----------+--------------------+--------------------+---------+ | Name | Status | Type | Library | License | +----------------------------+----------+--------------------+--------------------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL | | sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL | | CSV | ACTIVE | STORAGE ENGINE | NULL | GPL | | MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL | | InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL | | INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_TEMP_TABLE_INFO | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FIELDS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_DATAFILES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_VIRTUAL | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL | | ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL | | BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL | | FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL | | partition | ACTIVE | STORAGE ENGINE | NULL | GPL | | ngram | ACTIVE | FTPARSER | NULL | GPL | | rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL | | rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL | +----------------------------+----------+--------------------+--------------------+---------+ SELECT PLUGIN_NAME, PLUGIN_STATUS -> FROM INFORMATION_SCHEMA.PLUGINS -> WHERE PLUGIN_NAME LIKE '%semi%'; +----------------------+---------------+ | PLUGIN_NAME | PLUGIN_STATUS | +----------------------+---------------+ | rpl_semi_sync_master | ACTIVE | | rpl_semi_sync_slave | ACTIVE | +----------------------+---------------+
安裝插件之后,可以查看半同步相關的參數。
show global variables like 'rpl_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 | | rpl_semi_sync_slave_enabled | OFF | | rpl_semi_sync_slave_trace_level | 32 | +-------------------------------------------+------------+
參數詳解:
rpl_semi_sync_master_enabled:主庫是否開啟半同步。
rpl_semi_sync_master_wait_point:同步時間點after_commit,after_sync。
rpl_semi_sync_master_wait_for_slave_count:主庫事務提交后需要從庫的確認數量。
rpl_semi_sync_master_timeout:主庫等待從庫的確認超時時間(ms),默認10000ms,等待超過則半同步降級為異步模式。
rpl_semi_sync_master_wait_no_slave:
為OFF時,只要主庫發現(Rpl_semi_sync_master_clients)小于(rpl_semi_sync_master_wait_for_slave_count),則半同步立即轉為異步模式;
為ON時,在無事務提交的空閑時間里,即使主庫發現(Rpl_semi_sync_master_clients)小于(rpl_semi_sync_master_wait_for_slave_count),也不會做任何調整;
只要保證在事務超時之前,主庫收到大于等于(rpl_semi_sync_master_wait_for_slave_count)值的ACK應答數量,主庫就一直保持在半同步模式,如果在事務提交階段(主庫等待ACK)超時,半同步才會轉為異步模式;
無論(rpl_semi_sync_master_wait_no_slave)為ON還是OFF,當slave上線到(rpl_semi_sync_master_wait_for_slave_count)值時,master都會自動由異步模式轉為半同步模式。
主庫開啟半同步功能
SET GLOBAL rpl_semi_sync_master_enabled = 1; SET GLOBAL rpl_semi_sync_master_timeout=10000;
從庫開啟半同步功能
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
從庫對于正在進行的異步復制,需要重啟sql_io_thread 線程,才能生效半同步復制
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
主庫添加參數到/etc/my.cnf文件
[mysqld] rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=10000
從庫添加參數到/etc/my.cnf文件
[mysqld] rpl_semi_sync_slave_enabled=1
查看主從是否啟用了半同步復制:
主庫查詢半同步狀態Rpl_semi_sync_master_status為on表示主庫開啟了半同步復制,Rpl_semi_sync_master_clients表示目前有2個半同步的從庫。
show global status like 'rpl%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 2 | | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 0 | | Rpl_semi_sync_master_no_times | 0 | | Rpl_semi_sync_master_no_tx | 0 | | Rpl_semi_sync_master_status | ON | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 0 | | Rpl_semi_sync_master_tx_wait_time | 0 | | Rpl_semi_sync_master_tx_waits | 0 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 0 | | Rpl_semi_sync_slave_status | OFF | +--------------------------------------------+-------+
從庫查詢半同步狀態Rpl_semi_sync_slave_status 為on表示從庫開啟了半同步復制。
show global status like 'rpl%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 0 | | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 0 | | Rpl_semi_sync_master_no_times | 0 | | Rpl_semi_sync_master_no_tx | 0 | | Rpl_semi_sync_master_status | OFF | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 0 | | Rpl_semi_sync_master_tx_wait_time | 0 | | Rpl_semi_sync_master_tx_waits | 0 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 0 | | Rpl_semi_sync_slave_status | ON | +--------------------------------------------+-------+
半同步狀態檢查:
show global status like 'rpl%'; +--------------------------------------------+---------+ | Variable_name | Value | +--------------------------------------------+---------+ | Rpl_semi_sync_master_clients | 2 | | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 12463 | | Rpl_semi_sync_master_no_times | 1 | | Rpl_semi_sync_master_no_tx | 2739 | | Rpl_semi_sync_master_status | ON | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 1030 | | Rpl_semi_sync_master_tx_wait_time | 5075616 | | Rpl_semi_sync_master_tx_waits | 4926 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 5595 | | Rpl_semi_sync_slave_status | OFF | +--------------------------------------------+---------+
Rpl_semi_sync_master_net_avg_wait_time:變量已經廢棄,總是等于0。
Rpl_semi_sync_master_net_wait_time:變量已經廢棄,總是等于0。
Rpl_semi_sync_master_net_waits:主庫等待從庫的總次數。
Rpl_semi_sync_master_no_times:主庫關閉半同步的總次數,可以用來分析半同步降級為異步的頻率次數。
Rpl_semi_sync_master_no_tx:表示半同步事務提交沒有接受到從庫確認接受的總次數,可以用來分析半同步事務的提交是否存在超時的情況。
Rpl_semi_sync_master_yes_tx: 表示半同步事務提交接受到從庫確認接受的總次數。
Rpl_semi_sync_master_timefunc_failures::調用 gettimeofday() 等時間函數失敗的次數。
Rpl_semi_sync_master_tx_avg_wait_time:每個事務提交平均等待時間(單位: microseconds ),可以用來分析事務提交性能。
Rpl_semi_sync_master_tx_wait_time:事務總的提交等待時間(單位: microseconds ),可以用來分析事務提交性能。
Rpl_semi_sync_master_tx_waits:事務總的提交等待次數,可以用來分析事務提交性能。
Rpl_semi_sync_master_wait_pos_backtraverse:主庫event binary位置低于之前等待event的總次數,當事務開始等待回復的順序與其二進制日志事件的寫入順序不同時,就會發生這種情況。
Rpl_semi_sync_master_wait_sessions:當前會話等待從庫確認接受的個數,可以用來確認分析會話是否存在由于等待從庫確認而堵塞的情況。
到此,相信大家對“MySQL半同步復制如何配置”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。