這篇文章為大家帶來了關於mysql的相關知識,其中主要整理了半同步複製配置的相關問題,半同步模式下,主庫事務至少要確保一個從庫接收到日誌才能完成提交,因此,可以保證在主庫發生宕機時,已經提交的事務已經傳送到從庫,確保數據的不丟失,下面一起來看一下,希望對大家有幫助。
推薦學習:mysql影片教學
前言:
MySQL預設的主從複製採用的是非同步模式,主庫提交交易不需要確認是否已經傳送到從庫端,在主庫發生宕機主備切換時,可能導致主庫已經提交的事務在從庫丟失的情況。
在MySQL 5.7透過外掛程式支援了半同步複製模式,而半同步模式下,主庫事務至少要確保一個從庫接收到日誌才能完成提交,因此,可以確保在主庫發生宕機時,已經提交的事務已經傳送到從庫,確保資料的不遺失。
半同步:
半同步複製相比於非同步複製的效能影響,主要是資料完整性的權衡,增加了發送提交到從庫並確認接收的TCP/IP 往返時間,所以,半同步複製需要有高傳輸的網路以及主從兩地距離相近,如果網路傳輸緩慢或主從兩地距離跨度太遠,可能會導致主庫的效能下降以及半同步複製超時。
半同步複製的主函式庫與從函式庫會進行下列作業:
連接至主函式庫時,複製進位會檢查主函式庫是否開啟了半同步複製;
# 如果主庫和從庫都開啟了半同步複製,執行緒在執行事務提交時,需要等待至少一個半同步從庫確認接收到事務或直到等待逾時;
事務已經完成寫入relay log並flushed磁碟(不需要執行完成這個事務),就可以向主庫發送確認事務已經接收完成;
如果沒有一個從庫在規定的時間內發送確認信息給主庫,則主庫半同步複製會出現逾時,並且降級為異步複製,當至少一個半同步從庫能夠發送確認訊息給主庫時,主庫會自動升級為半同步模式;
半同步複製需要在主庫和從庫同時開啟,如果存在主庫沒有開啟半同步模式或主庫開啟半同步模式但沒有一個從庫開啟半同步模式,則主從複製依然是採用非同步模式;
當主庫事務提交由於等待從庫確認而被堵塞,提交事務的會話將不會返回,直到堵塞結束,才返回會話,主庫事務的提交,需要等待至少一個從庫確認接受。 用於控制在主庫需要從庫確認的數量,預設為1。
阻塞也會發生在非交易表的rollback,因為非交易表是沒有回溯的,所以對於非事務表的rollback仍要寫入日誌同步到從庫中。
rpl_semi_sync_master_wait_point 參數用於半同步模式下控制主函式庫事務提交等待從函式庫確認交易接受的時間點,有兩種方式:
到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_format:row gtid:on準備條件:
主從非同步複製(此處步驟省略)。
半同步複製不支援多源複製(多個channel),半同步只能使用default channel。 設定管理使用指令 INSTALLPLUGIN, SET GLOBAL, STOP SLAVE, START SLAVE 以及超級權限 SUPER privilege。 安裝外掛程式需要MySQLserver支援動態載入,需要確認have_dynamic_loading 為YESshow global variables like'%have_dynamic_loading%';
show global variables like '%plugin_dir%';
設定半同步:
主從兩個都安裝,以防止主從切換。
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
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 | +-------------------------------------------+------------+
為ON時,於無事務提交的空閒時間裡,即使主庫發現(Rpl_semi_sync_master_clients)小於(rpl_semi_sync_master_wait_for_slave_count),也不會做任何調整;
#只要保證在交易逾時之前,主庫收到大於slave_semi_slave(r的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视频教程
以上是歸納整理MySQL半同步複製配置的詳細內容。更多資訊請關注PHP中文網其他相關文章!