本篇內(nèi)容主要講解“MySQL半同步復制如何配置”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“MySQL半同步復制如何配置”吧!
專注于為中小企業(yè)提供網(wǎng)站設(shè)計制作、做網(wǎng)站服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)綿陽免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了近1000家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
前言:
MySQL默認的主從復制采用的是異步模式,主庫提交事務(wù)不需要確認是否已經(jīng)傳送到從庫端,在主庫發(fā)生宕機主備切換時,可能導致主庫已經(jīng)提交的事務(wù)在從庫丟失的情況。
在MySQL 5.7通過插件支持了半同步復制模式,半同步模式下,主庫事務(wù)至少要確保一個從庫接收到日志才能完成提交,因此,可以保證在主庫發(fā)生宕機時,已經(jīng)提交的事務(wù)已經(jīng)傳送到從庫,確保數(shù)據(jù)的不丟失。
半同步:
半同步復制相比于異步復制的性能影響,主要是數(shù)據(jù)完整性的權(quán)衡,增加了發(fā)送提交到從庫并確認接收的 TCP/IP 往返時間,所以,半同步復制需要有高傳輸?shù)木W(wǎng)絡(luò)以及主從兩地距離相近,如果網(wǎng)絡(luò)傳輸緩慢或者主從兩地距離跨度太遠,可能會導致主庫的性能下降以及半同步復制超時。
半同步復制的主庫和從庫會進行以下操作:
當連接到主庫時,復制進制會檢查主庫是否開啟了半同步復制;
如果主庫和從庫都開啟了半同步復制,線程在執(zhí)行事務(wù)提交時,需要等待至少一個半同步從庫確認接收到事務(wù)或者直到等待超時;
從庫只要在事務(wù)已經(jīng)完成寫入relay log并flushed磁盤(不需要執(zhí)行完成這個事務(wù)),就可以向主庫發(fā)送確認事務(wù)已經(jīng)接收完成;
如果沒有一個從庫在規(guī)定的時間內(nèi)發(fā)送確認信息給主庫,則主庫半同步復制會出現(xiàn)超時,并且降級為異步復制,當至少一個半同步從庫能夠發(fā)送確認信息給主庫時,主庫會自動升級為半同步模式;
半同步復制需要在主庫和從庫同時開啟,如果存在主庫沒有開啟半同步模式或者主庫開啟半同步模式但沒有一個從庫開啟半同步模式,則主從復制依然是采用異步模式;
當主庫事務(wù)提交由于等待從庫確認而被堵塞,提交事務(wù)的會話將不會返回,直到堵塞結(jié)束,才返回會話,主庫事務(wù)的提交,需要等待至少一個從庫確認接受。
rpl_semi_sync_master_wait_for_slave_count 參數(shù)可以用于控制在主庫需要從庫確認的數(shù)量,默認為1。
堵塞也會發(fā)生在非事務(wù)表的rollback,因為非事務(wù)表是沒有回滾的,所以對于非事務(wù)表的rollback依然要寫入日志同步到從庫。
rpl_semi_sync_master_wait_point 參數(shù)用于半同步模式下控制主庫事務(wù)提交等待從庫確認事務(wù)接受的時間點,有兩種方式:
after_sync(默認):主庫寫入事務(wù)到binlog以及同步從庫并且sync binlog to disk,主庫同步后等待從庫接受到事務(wù)的確認,在等到從庫的確認之后,主庫提交事務(wù)到存儲引擎并且返回客戶端。
after_commit:主庫寫入事務(wù)到binlog以及同步從庫,sync binlog,并且提交事務(wù)到存儲引擎,在提交之后主庫等待從庫接受到事務(wù)的確認,在接受到確認之后,源端返回提交完成到客戶端。
兩種同步時間點主要存在以下的不同
在after_sync下,全部客戶端同一時間看到已經(jīng)提交的事務(wù),因為是在確認從庫已經(jīng)接收到事務(wù)之后再提交存儲引擎的,所以全部客戶端是同一時間看到已經(jīng)提交事務(wù)的數(shù)據(jù);此外,在發(fā)生故障切換時,主庫全部已經(jīng)提交的事務(wù)已經(jīng)同步到從庫的relay log,從庫的數(shù)據(jù)是無損的。
client-->MySQLSQL Parse-->Storage Involve-->write binary log-->wait ACK-->storagecommit-->client(OK)
在after_commit下,提交事務(wù)的客戶端需要等待確認從庫已經(jīng)接收到事務(wù)才能返回,但由于提交到存儲引擎是在確認從庫之前完成,所以,其他客戶端將比提交事務(wù)的客戶端更早的看到提交事務(wù)的數(shù)據(jù),在發(fā)生故障切換時,在對于已經(jīng)提交存儲引擎但還沒有確認從庫已經(jīng)提交的事務(wù),其他客戶端可能會出現(xiàn)與他們在源上看到的數(shù)據(jù)相關(guān)的數(shù)據(jù)丟失。
client-->MySQLSQL Parse-->Storage Involve-->write binary log-->storagecommit-->wait ACK-->client(OK)
綜上所述,建議使用默認的after_sync。
半同步安裝步驟:
環(huán)境信息:
MySQL版本:5.7.32
架構(gòu):一主(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
準備條件:
半同步復制是建立在異步復制的基礎(chǔ)上,所以要提前配置好主從異步復制(此處步驟省略)。
半同步復制不支持多源復制(多個channel),半同步只能使用default channel。
配置管理使用命令 INSTALLPLUGIN, SET GLOBAL, STOP SLAVE, START SLAVE 以及超級權(quán)限 SUPER privilege。
安裝插件需要MySQLserver支持動態(tài)加載,需要確認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 系統(tǒng),.dll 用于 Windows)。
配置半同步:
主從兩個都安裝,防止主從切換。
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
注:如果安裝出現(xiàn)以下失敗,則需要先安裝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 | +----------------------+---------------+
安裝插件之后,可以查看半同步相關(guān)的參數(shù)。
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 | +-------------------------------------------+------------+
參數(shù)詳解:
rpl_semi_sync_master_enabled:主庫是否開啟半同步。
rpl_semi_sync_master_wait_point:同步時間點after_commit,after_sync。
rpl_semi_sync_master_wait_for_slave_count:主庫事務(wù)提交后需要從庫的確認數(shù)量。
rpl_semi_sync_master_timeout:主庫等待從庫的確認超時時間(ms),默認10000ms,等待超過則半同步降級為異步模式。
rpl_semi_sync_master_wait_no_slave:
為OFF時,只要主庫發(fā)現(xiàn)(Rpl_semi_sync_master_clients)小于(rpl_semi_sync_master_wait_for_slave_count),則半同步立即轉(zhuǎn)為異步模式;
為ON時,在無事務(wù)提交的空閑時間里,即使主庫發(fā)現(xiàn)(Rpl_semi_sync_master_clients)小于(rpl_semi_sync_master_wait_for_slave_count),也不會做任何調(diào)整;
只要保證在事務(wù)超時之前,主庫收到大于等于(rpl_semi_sync_master_wait_for_slave_count)值的ACK應(yīng)答數(shù)量,主庫就一直保持在半同步模式,如果在事務(wù)提交階段(主庫等待ACK)超時,半同步才會轉(zhuǎn)為異步模式;
無論(rpl_semi_sync_master_wait_no_slave)為ON還是OFF,當slave上線到(rpl_semi_sync_master_wait_for_slave_count)值時,master都會自動由異步模式轉(zhuǎn)為半同步模式。
主庫開啟半同步功能
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;
主庫添加參數(shù)到/etc/my.cnf文件
[mysqld] rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=10000
從庫添加參數(shù)到/etc/my.cnf文件
[mysqld] rpl_semi_sync_slave_enabled=1
查看主從是否啟用了半同步復制:
主庫查詢半同步狀態(tài)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 | +--------------------------------------------+-------+
從庫查詢半同步狀態(tài)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 | +--------------------------------------------+-------+
半同步狀態(tài)檢查:
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:變量已經(jīng)廢棄,總是等于0。
Rpl_semi_sync_master_net_wait_time:變量已經(jīng)廢棄,總是等于0。
Rpl_semi_sync_master_net_waits:主庫等待從庫的總次數(shù)。
Rpl_semi_sync_master_no_times:主庫關(guān)閉半同步的總次數(shù),可以用來分析半同步降級為異步的頻率次數(shù)。
Rpl_semi_sync_master_no_tx:表示半同步事務(wù)提交沒有接受到從庫確認接受的總次數(shù),可以用來分析半同步事務(wù)的提交是否存在超時的情況。
Rpl_semi_sync_master_yes_tx: 表示半同步事務(wù)提交接受到從庫確認接受的總次數(shù)。
Rpl_semi_sync_master_timefunc_failures::調(diào)用 gettimeofday() 等時間函數(shù)失敗的次數(shù)。
Rpl_semi_sync_master_tx_avg_wait_time:每個事務(wù)提交平均等待時間(單位: microseconds ),可以用來分析事務(wù)提交性能。
Rpl_semi_sync_master_tx_wait_time:事務(wù)總的提交等待時間(單位: microseconds ),可以用來分析事務(wù)提交性能。
Rpl_semi_sync_master_tx_waits:事務(wù)總的提交等待次數(shù),可以用來分析事務(wù)提交性能。
Rpl_semi_sync_master_wait_pos_backtraverse:主庫event binary位置低于之前等待event的總次數(shù),當事務(wù)開始等待回復的順序與其二進制日志事件的寫入順序不同時,就會發(fā)生這種情況。
Rpl_semi_sync_master_wait_sessions:當前會話等待從庫確認接受的個數(shù),可以用來確認分析會話是否存在由于等待從庫確認而堵塞的情況。
到此,相信大家對“MySQL半同步復制如何配置”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!