MySQL?半同步復制的實現(xiàn)
一、半同步復制介紹
MySQL基礎復制有三種模式:異步復制/同步復制/半同步復制,3種模式各有利弊,下面對各種復制模式的優(yōu)缺點做個簡要的介紹:
異步復制(Asynchronous replicaton)
這是MySQL默認的復制模式,異步復制指主庫寫binlog、從庫I/O線程讀binlog并寫入relaylog、從庫SQL線程重放事務這三步之間是異步的。異步復制的優(yōu)點是主庫不需要關心備庫的狀態(tài),主庫不保證事務被傳輸?shù)綇膸?,如果主庫崩潰,某些事務可能還未發(fā)送到從庫,切換后可能導致事務的丟失。其優(yōu)點是可以有更高的吞吐量,缺點是不能保持數(shù)據(jù)實時一致,不適合要求主從數(shù)據(jù)一致性要求較高的應用場景。
同步復制(Synchronous replicaton)
同步復制的模式下,主庫在提交事務前,必須確認事務在所有的備庫上都已經(jīng)完成提交。即主庫是最后一個提交的,在提交前需要將事務傳遞給從庫并完成重放、提交等一系列動作。其優(yōu)點是任何時候主備庫都是一致的,主庫的崩潰不會丟失事務,缺點是由于主庫需要等待備庫先提交事務,吞吐量很低。
半同步復制(Semisynchronous replicaiton)
MySQL從5.5開始引入了半同步復制,半同步復制介于異步復制和同步復制之間。主庫在提交事務時先等待,必須確認至少一個從庫收到了事件(從庫將事件寫入relaylog,不需要重放和提交,并向主庫發(fā)送一個確認信息ACK),主庫收到確認信息后才會正式commit。
與同步復制相比,半同步復制速度快很多,因為他只需要至少1個從庫確認寫入relaylog,并不需要完成在從庫上的事務提交,同時又比異步復制更安全,因為主庫在提交時,事務至少已經(jīng)存在2個地方(主庫的binlog和從庫的relaylog)。由于半同步復制在提交事務前,需要從庫返還確認信息,所以這里涉及到網(wǎng)絡的往返通信開銷,因此半同步復制只適合在網(wǎng)絡條件較好的且地理上距離不遠的環(huán)境部署,否則可能會因為網(wǎng)絡延遲大幅降低主庫性能。
半同步復制的特點:
- 從庫在連接主庫時需要表明它是否支持半同步復制。
- 如果主庫啟用了半同步復制,且有一個支持半同步復制的從庫,則主庫上事務提交將等待至少一個從庫確認已收到事務,或者直到發(fā)生超時。
- 默認只有在將事務寫入其中繼日志并刷新到磁盤后,主庫才會提交事務(也可以配置成提交后等待確認)。
- 如果沒有任何從庫確認事務的情況下發(fā)生超時,則主庫將退化為異步復制。當至少有一個半同步從庫趕上時,主庫恢復半同步復制。退化與恢復過程都是自動的。
- 必須在主庫和從庫上都啟用半同步復制,否則使用異步復制。
二、搭建半同步復制
半同步復制是以插件的形式實現(xiàn)的,要使用半同步復制,要在主從分別安裝相應的插件,并且通過參數(shù)來控制半同步復制。
在使用半同步復制前需要先滿足下列條件:
- 服務器要支持動態(tài)加載,參數(shù)have_dynamic_loading要設置為True(MySQL8.0默認就是True)。
- 已經(jīng)完成基礎異步復制的配置。
- 不支持一從多主的復制(多通道)。
現(xiàn)以上一篇配置好的異步復制為基礎來配置半同步復制
異步復制(Asynchronous replication)
2臺數(shù)據(jù)庫環(huán)境如下:
- 192.168.3.71(主庫 主機名master)
- 192.168.3.72(從庫 主機名slave01)
2.1 安裝半同步插件
安裝半同步插件時,需要在主庫安裝semisync_master.so(8.0.26 以后版本為semisync_source.so),在從庫安裝semisync_slave.so(8.0.26以后版本為semisync_replica.so)。執(zhí)行安裝命令時,插件必須在插件目錄(參數(shù)plugin_dir)存在。
在主庫安裝插件:
install plugin rpl_semi_sync_master soname 'semisync_master.so'; 或MySQL 8.0.26以上版本執(zhí)行下面命令: install plugin rpl_semi_sync_source soname 'semisync_source.so';
在備庫安裝插件:
install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; 或MySQL 8.0.26以上版本執(zhí)行下面命令: install plugin rpl_semi_sync_replica soname 'semisync_replica.so';
安裝完成后可以用show plugins來查看是否安裝成功,安裝成功后插件列表中應該有下列類似信息:
show plugins;
2.2 啟用半同步復制
確認主備的插件都成功安裝后,使用下面命名調(diào)整參數(shù),啟用半同步復制。
主庫執(zhí)行:
set global rpl_semi_sync_master_enabled=1; 或MySQL 8.0.26以后版本執(zhí)行: set global rpl_semi_sync_source_enabled = 1;
備庫執(zhí)行:
set global rpl_semi_sync_slave_enabled=1; 或MySQL 8.0.26以后版本執(zhí)行: set global rpl_semi_sync_replica_enabled = 1;
為了防止配置不丟失,建議也將配置添加到my.cnf中:
主庫配置文件添加:
[mysqld] rpl_semi_sync_master_enabled=1 # 或8.026版本添加: # rpl_semi_sync_source_enabled=1
主庫配置文件添加:
[mysqld] rpl_semi_sync_slave_enabled=1 # 或8.026版本添加: # rpl_semi_sync_replica_enabled=1
如果在完成上面配置時異步復制正在運行,則需要重啟從庫的I/O線程來切換到半同步復制:
stop slave io_thread; start slave io_thread; show status like 'rpl_semi_sync_slave_status'; -- 查看備庫半同步復制狀態(tài)
查看主庫半同步復制狀態(tài):
show status like 'rpl_semi_sync_master_status';
通過狀態(tài)變量,我們看到主備的半同步都是處于工作狀態(tài),半同步復制的搭建完成。
三、配置半同步復制
當完成了半同步配置后,系統(tǒng)上和半同步相關的配置參數(shù)就可以使用了,這些參數(shù)可用來調(diào)整半同步復制的配置:
主庫查看半同步相關配置參數(shù):
show variables like 'rpl_semi_sync%';
如果使用的是8.0.26以上的版本,參數(shù)中的'master'會被替換為'source','slave'會被替換為'replica',下面依次解釋各參數(shù)設置含義:
rpl_semi_sync_master_enabled
用來控制是否開啟半同步復制,ON代表開啟,OFF代表關閉。
rpl_semi_sync_master_timeout
主庫等待從庫ACK超時的時長,單位是毫秒,默認是10000(10s)。
rpl_semi_sync_master_trace_level
半同步復制時主庫的調(diào)試級別
rpl_semi_sync_master_wait_for_slave_count
主庫需要收到多少個ACK才認為此次提交成功,否則就降級為異步復制,默認是1,即只要有1個從庫確認即可提交。
rpl_semi_sync_master_wait_no_slave
為ON時(默認值),當狀態(tài)變量Rpl_semi_sync_master_clients中的值小于rpl_semi_sync_master_wait_for_slave_count時(即從庫數(shù)小于需要的最小確認數(shù)),Rpl_semi_sync_master_status依舊為ON,只有當事務提交后等待rpl_semi_sync_master_timeout超時后,Rpl_semi_sync_master_status才會變?yōu)镺FF,即降級為異步復制;
為OFF時,當狀態(tài)變量Rpl_semi_sync_master_clients中的值小于rpl_semi_sync_master_wait_for_slave_count時,Rpl_semi_sync_master_status立即顯示為OFF,即立即降級為異步復制。
rpl_semi_sync_master_wait_point
控制主庫上commit、接收ACK、返回控制給客戶端的時間點。值為after_sync(默認)或after_commit。
- after_sync:主庫會等待從庫的ACK后再提交事務,最后返還控制權給客戶端。主庫上所有會話同一時間看到提交的事務,如果發(fā)生failover,主從數(shù)據(jù)是一致的。
- after_commit:主庫會先提交事務,再等待ACK,最后返還控制權給客戶端。主庫會先提交,此時主庫上其他會話可以看到已提交的事務,但執(zhí)行事務的會話還未返還,依然在等待從庫確認,如果從庫因為崩潰沒有處理這個事務,那么其他會話會在主從看到不一致的數(shù)據(jù)(主庫事務提交了,從庫的事務丟了)。
四、監(jiān)控半同步復制
完成了半同步配置后,和半同步相關的相關狀態(tài)變量可以幫助我們監(jiān)控半同步復制的狀態(tài):
show status like 'rpl_semi_sync%';
主庫有半同步復制相關的狀態(tài)變量解釋:
Rpl_semi_sync_master_clients:當前有多少個半同步從庫連接到主庫。
Rpl_semi_sync_master_net_avg_wait_time:主庫等待從庫回復的平均時間,以微秒為單位。此變量始終為0,不推薦使用,并且將在以后的版本中刪除。
Rpl_semi_sync_master_net_wait_time:主庫等待從庫回復的總時間,以微秒為單位。此變量始終為0,不推薦使用,并且將在以后的版本中刪除。
Rpl_semi_sync_master_net_waits:主庫等待從庫回復的總次數(shù)。
Rpl_semi_sync_master_no_times:主庫關閉半同步復制的次數(shù)。
Rpl_semi_sync_master_no_tx:從庫未成功確認的事務數(shù)。
Rpl_semi_sync_master_status:為ON時表示使用半同步復制,為OFF時表示異步復制。
Rpl_semi_sync_master_timefunc_failures:調(diào)用gettimeofday等時間函數(shù)時主庫失敗的次數(shù)。
Rpl_semi_sync_master_tx_avg_wait_time:主庫等待一個事務的平均時間,以微秒為單位。
Rpl_semi_sync_master_tx_wait_time:主庫等待事務的總時間,以微秒為單位。
Rpl_semi_sync_master_tx_waits:主庫等待事務的總次數(shù)。
Rpl_semi_sync_master_wait_pos_backtraverse:主庫等待事件的二進制日志次數(shù)低于之前等待事件的總次數(shù)。當事務等待回復的順序與其二進制日志事件的寫入順序不同時,就會發(fā)生這種情況。
Rpl_semi_sync_master_wait_sessions:當前正在等待從庫回復的會話數(shù)。
Rpl_semi_sync_master_yes_tx:從庫成功確認的事務數(shù)。
到此這篇關于 MySQL 半同步復制的實現(xiàn)的文章就介紹到這了,更多相關 MySQL 半同步復制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL關系型數(shù)據(jù)庫事務的ACID特性與實現(xiàn)
這篇文章主要介紹了MySQL關系型數(shù)據(jù)庫事務的ACID特性與實現(xiàn),ACID?是為保證事務transaction是正確可靠的,具備原子性、一致性、隔離性、持久性等特性2022-07-07MySQL安裝時initializing database失敗的問題解決
本文主要介紹了MySQL安裝時initializing database失敗的問題解決,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-02-02