備注:測(cè)試數(shù)據(jù)庫(kù)版本為MySQL 8.0
這個(gè)blog我們來(lái)聊聊MySQL 延遲復(fù)制
概述
MySQL的復(fù)制一般都很快狭瞎,雖然有時(shí)候因?yàn)?網(wǎng)絡(luò)原因略吨、大事務(wù)等原因造成延遲症副,但是這個(gè)無(wú)法人為控制捏顺。
生產(chǎn)中可能會(huì)存在主庫(kù)誤操作面褐,導(dǎo)致數(shù)據(jù)被刪除了偶芍,Oracle有flashback技術(shù)充择,MySQL官方目前沒(méi)有退出對(duì)應(yīng)的flashback技術(shù)。
此時(shí)匪蟀,我們可以通過(guò)設(shè)置延遲復(fù)制椎麦,設(shè)置從庫(kù)比主庫(kù)慢半個(gè)小時(shí),這個(gè)時(shí)候就可以從從庫(kù)進(jìn)行數(shù)據(jù)恢復(fù)到主庫(kù)了材彪。
MySQL支持延遲復(fù)制观挎,以便從庫(kù)故意執(zhí)行比主庫(kù)晚至少在指定時(shí)間間隔的事務(wù)。在MySQL 8.0中段化,延遲復(fù)制的方法取決于兩個(gè)時(shí)間戳:immediate_commit_timestamp和original_commit_timestamp嘁捷。如果復(fù)制拓?fù)渲械乃蟹?wù)器都運(yùn)行MySQL 8.0.1或更高版本,則使用這些時(shí)間戳測(cè)量延遲復(fù)制显熏。如果從庫(kù)未使用這些時(shí)間戳雄嚣,則執(zhí)行MySQL 5.7的延遲復(fù)制。
復(fù)制延遲默認(rèn)為0秒喘蟆。使用CHANGE MASTER TO MASTER_DELAY = N語(yǔ)句將延遲設(shè)置為N秒缓升。從主庫(kù)接收的事務(wù)比主庫(kù)上的提交至少晚N秒才在從庫(kù)上執(zhí)行。每個(gè)事務(wù)發(fā)生延遲(不是以前MySQL版本中的事件)蕴轨,實(shí)際延遲僅強(qiáng)制在gtid_log_event或anonymous_gtid_log_event事件上港谊。二進(jìn)制日志中的每個(gè)GTID事務(wù)始終都以Gtid_log_event開(kāi)頭,匿名事務(wù)沒(méi)有分配GTID橙弱,MySQL確保日志中的每個(gè)匿名事務(wù)都以Anonymous_gtid_log_event開(kāi)頭歧寺。對(duì)于事務(wù)中的其它事件,不會(huì)對(duì)它們施加任何等待時(shí)間棘脐,而是立即執(zhí)行成福。注意,START SLAVE和STOP SLAVE立即生效并忽略任何延遲荆残,RESET SLAVE將延遲重置為0奴艾。
一.延遲復(fù)制測(cè)試
1.環(huán)境要求
服務(wù)器類別 | IP |
---|---|
主庫(kù) | 10.31.1.112 |
從庫(kù) | 10.31.1.113 |
此時(shí)已經(jīng)搭建了異步復(fù)制的主從
2.開(kāi)啟延遲復(fù)制
stop slave sql_thread;
CHANGE MASTER TO MASTER_DELAY = 300;
start slave sql_thread;
主庫(kù)
create table t6 as select * from t4;
select * from t6;
mysql> create table t6 as select * from t4;
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql>
mysql> select * from t6;
+------+------+
| id | name |
+------+------+
| 1 | aaa |
+------+------+
1 row in set (0.00 sec)
從庫(kù)
mysql> select remaining_delay from performance_schema.replication_applier_status;
+-----------------+
| remaining_delay |
+-----------------+
| 300 |
+-----------------+
1 row in set (0.01 sec)
mysql> select current_timestamp;
+---------------------+
| current_timestamp |
+---------------------+
| 2020-07-29 11:00:44 |
+---------------------+
1 row in set (0.00 sec)
mysql> select * from t6;
ERROR 1146 (42S02): Table 'test.t6' doesn't exist
mysql>
mysql> select current_timestamp;
+---------------------+
| current_timestamp |
+---------------------+
| 2020-07-29 11:03:30 |
+---------------------+
1 row in set (0.00 sec)
mysql> select * from t6;
ERROR 1146 (42S02): Table 'test.t6' doesn't exist
mysql>
mysql> select current_timestamp;
+---------------------+
| current_timestamp |
+---------------------+
| 2020-07-29 11:05:29 |
+---------------------+
1 row in set (0.00 sec)
mysql> select * from t6;
+------+------+
| id | name |
+------+------+
| 1 | aaa |
+------+------+
1 row in set (0.00 sec)
mysql> select remaining_delay from performance_schema.replication_applier_status;
+-----------------+
| remaining_delay |
+-----------------+
| NULL |
+-----------------+
1 row in set (0.01 sec)
3.監(jiān)控延遲復(fù)制
在MySQL 8之前的老版本中,監(jiān)控復(fù)制的延遲(滯后)最常用的方法之一是依賴于show slave status輸出中的seconds_behind_master字段内斯。但是蕴潦,當(dāng)使用比傳統(tǒng)主從復(fù)制更復(fù)雜的復(fù)制拓?fù)湎裉洌缃M復(fù)制時(shí),此度量標(biāo)準(zhǔn)不再適用潭苞。MySQL 8中添加的immediate_commit_timestamp和original_commit_timestamp可提供有關(guān)復(fù)制延遲的更精細(xì)的信息忽冻。監(jiān)控支持這些時(shí)間戳的復(fù)制延遲的推薦方法是使用以下performance_schema模式中的表。
replication_connection_status:與主服務(wù)器連接的當(dāng)前狀態(tài)此疹,提供有關(guān)連接線程排隊(duì)到中繼日志中的最后和當(dāng)前事務(wù)的信息僧诚。
replication_applier_status_by_coordinator:協(xié)調(diào)器線程的當(dāng)前狀態(tài),僅在使用多線程復(fù)制時(shí)顯示該信息蝗碎,提供有關(guān)協(xié)調(diào)器線程緩沖到工作隊(duì)列的最后一個(gè)事務(wù)的信息湖笨,以及當(dāng)前正在緩沖的事務(wù)。
replication_applier_status_by_worker:應(yīng)用從主服務(wù)器接收事務(wù)的線程的當(dāng)前狀態(tài)蹦骑,提供有關(guān)應(yīng)用程序線程或使用多線程復(fù)制時(shí)每個(gè)工作線程應(yīng)用的事務(wù)信息慈省。
使用這些表,可以監(jiān)控相應(yīng)線程處理的最后一個(gè)事務(wù)以及該線程當(dāng)前正在處理的事務(wù)的信息眠菇,包括:
事務(wù)的GTID边败。
從庫(kù)中繼日志中檢索的事務(wù)的original_commit_timestamp和immediate_commit_timestamp。
線程開(kāi)始處理事務(wù)的時(shí)間捎废。
對(duì)于上次處理的事務(wù)笑窜,線程完成處理它的時(shí)間。
除Performance Schema表之外登疗,show slave status的輸出還有三個(gè)字段與延遲復(fù)制有關(guān):
SQL_Delay:非負(fù)整數(shù)怖侦,表示使用CHANGE MASTER TO MASTER_DELAY = N配置的復(fù)制延遲,以秒為單位谜叹。與performance_schema.replication_applier_configuration.desired_delay值相同匾寝。
SQL_Remaining_Delay:當(dāng)Slave_SQL_Running_State等待主執(zhí)行事件后的MASTER_DELAY秒時(shí),該字段包含一個(gè)整數(shù)荷腊,表示延遲剩余的秒數(shù)艳悔。在它他時(shí)候,此字段為NULL女仰。與performance_schema.replication_applier_status.remaining_delay值相同猜年。
Slave_SQL_Running_State:一個(gè)字符串,指示SQL線程的狀態(tài)(類似于Slave_IO_State)疾忍。該值與SHOW PROCESSLIST顯示的SQL線程的State值相同乔外。
當(dāng)從庫(kù)的SQL線程在執(zhí)行事件之前等待延遲時(shí),SHOW PROCESSLIST將其狀態(tài)值顯示為:Waiting until MASTER_DELAY seconds after master executed event一罩。