溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么實現(xiàn)MySQL中的半同步復(fù)制

發(fā)布時間:2021-11-16 11:33:29 來源:億速云 閱讀:173 作者:柒染 欄目:MySQL數(shù)據(jù)庫

這篇文章給大家介紹怎么實現(xiàn)MySQL中的半同步復(fù)制,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

關(guān)于MySQL的復(fù)制架構(gòu),大體有下面三種方式,異步,全同步復(fù)制,半同步復(fù)制。

三種復(fù)制方式

    第一種是異步復(fù)制,是比較經(jīng)典的主從復(fù)制,搭建主從默認的架構(gòu)方式,就是屬于異步的,相對來說性能要好一些。但是還是會有丟失數(shù)據(jù)的情況。

    第二種是全復(fù)制,比如說MySQL Cluster這樣的方式,是屬于全復(fù)制的,實際上MySQL Cluster其實發(fā)展并不大順利,更多時候是一個實驗室產(chǎn)品,但是時間定格在2016年12月12日,MySQL  5.7.17 GA的重大特性group replication插件推出,增強了MySQL原有的高可用方案(原有的Replication方案),提供了重要的特性—多寫,保證組內(nèi)高可用,確保數(shù)據(jù)最終一致性。有點類似Oracle里面的RAC.

    第三種是在異步和全復(fù)制之間的一種方案,就是半同步semi-sync replication。自MySQL 5.5推出,是對異步和全復(fù)制的一種補充,確切的說,應(yīng)該是對MySQL Cluster這種方案的補充。

    如果把這個和Oracle聯(lián)系起來,其實和Oracle高可用模式有點類似,Oracle中是最大性能模式,最大保護模式,最大高可用模式,其中最大性能模式就是異步的方式,類似于異步復(fù)制的角色,最大保護模式是完全的數(shù)據(jù)同步,有點類似于全復(fù)制的方案,而最大高可用模式是介于兩者之間,甚至可以達到動態(tài)切換,和半同步復(fù)制的角色差不多。

半同步復(fù)制

要開啟半同步,我們需要安裝插件,這個過程就很簡單了?;镜囊笫窃跐M足異步復(fù)制的情況下,版本在5.5以上,并且變量have_dynamic_loading為YES

> show variables like '%have_dynamic_loading%';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| have_dynamic_loading | YES   |
+----------------------+-------+
1 row in set (0.00 sec)在base目錄下,可以很容易找到所需的插件。當前的base目錄為/usr,可以根據(jù)關(guān)鍵字找到插件。

# find . -name "semisync_master.so"
./lib64/mysql/plugin/semisync_master.so
./lib64/mysql/plugin/debug/semisync_master.so

要安裝插件就是兩個簡單的命令。

> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.11 sec)

> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.00 sec)安裝后查看mysql.plugin看看插件記錄是否存在,或者使用show plugins也可以。

> select * from mysql.plugin;
+----------------------+--------------------+
| name                 | dl                 |
+----------------------+--------------------+
| rpl_semi_sync_master | semisync_master.so |
| rpl_semi_sync_slave  | semisync_slave.so  |
+----------------------+--------------------+
2 rows in set (0.00 sec)當然默認半同步的開關(guān)還沒有打開。

> show variables like 'rpl_semi_sync_master%';
+------------------------------------+-------+
| 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_no_slave | ON    |
+------------------------------------+-------+
4 rows in set (0.00 sec)這里涉及到兩個參數(shù)rpl_semi_sync_master_enabled和rpl_semi_sync_slave_enabled,比較直觀。

打開即可。set global rpl_semi_sync_master_enabled=1;
set global rpl_semi_sync_slave_enabled=1;如果在master端簡單驗證,也可以使用show status

> show status like 'rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON    |
+-----------------------------+-------+當然在slave端也需要做同樣的操作,然后在slave端重啟IO_Thread即可。

> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.01 sec)
> START SLAVE IO_THREAD;
Query OK, 0 rows affected (0.01 sec)Master端檢查Rpl_semi_sync_master_statusSlave端檢查

Rpl_semi_sync_slave_status

半同步在MySQL 5.6,5.7的變化

MySQL  5.7中新增了一個參數(shù)來控制半同步模式下 主庫在返回給會話事務(wù)成功之前提交事務(wù)的方式。

> show variables like 'rpl_semi_sync_master_wait_point';
+---------------------------------+------------+
| Variable_name                   | Value      |
+---------------------------------+------------+
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+---------------------------------+------------+
1 row in set (0.00 sec)而在MySQL 5.6中是什么設(shè)置呢,是AFTER_COMMIT

這兩個參數(shù)該怎么理解。我參考了https://sanwen8.cn/p/105GRDe.html   中的圖片。

master的數(shù)據(jù)寫入了binlog,slave 刷新到磁盤(relay log),所以在OLTP的場景下,master需要等待slave 反饋收到relay log,只有收到ACK后master才將commit OK結(jié)果反饋給客戶端

而MySQL 5.7中的半同步復(fù)制,有個叫法是Loss-Less半同步復(fù)制。實現(xiàn)的方式有了一些差別。

這種模式(AFTER_SYNC),事務(wù)是在提交之前發(fā)送給Slave,當Slave沒有接收成功,并且如果發(fā)生Master宕機的場景,不會導致主從不一致,因為此時Master端還沒有提交,所以主從都沒有數(shù)據(jù)。

簡單測試半同步復(fù)制

我們來簡單看看半同步復(fù)制的一些小測試。

create database testsync;

然后創(chuàng)建一個表,插入一行數(shù)據(jù)。很明顯執(zhí)行速度很快。

> create table testsync.test(id int);
Query OK, 0 rows affected (0.07 sec)

> insert into testsync.test values(100);
Query OK, 1 row affected (0.01 sec)我們模擬網(wǎng)絡(luò)延遲的情況,直接把slave停掉。

stop slave;這個時候在Master端插入數(shù)據(jù)就會有很慢。這個過程持續(xù)了大概10秒多。

> insert into testsync.test values(101);
Query OK, 1 row affected (10.00 sec)這里為什么是10秒,和一個扮同步復(fù)制的參數(shù)有關(guān)。單位是毫秒,所以換算下來就是10秒。

> show variables like 'rpl_semi_sync_master_timeout';
+------------------------------+-------+
| Variable_name                | Value |
+------------------------------+-------+
| rpl_semi_sync_master_timeout | 10000 |
+------------------------------+-------+

我們看看扮同步復(fù)制的開關(guān)。

> show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | OFF   |
+-----------------------------+-------+slave端也是OFF的狀態(tài)。

我們恢復(fù)狀態(tài),把slave啟動。然后在Master端繼續(xù)插入一條記錄,速度就很快了。

> insert into testsync.test values(102);
Query OK, 1 row affected (0.00 sec)此時的開關(guān)是打開的。

> show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON    |
+-----------------------------+-------+查看數(shù)據(jù)庫日志,其實也能看到很明確的信息。

2017-02-04T23:37:44.551667+08:00 2145633 [Warning] Timeout waiting for reply of binlog (file: mysql-bin.000017, pos: 1056976828), semi-sync up to file mysql-bin.000017, position 1056976573.
2017-02-04T23:37:44.551713+08:00 2145633 [Note] Semi-sync replication switched OFF.
2017-02-04T23:41:05.824146+08:00 2145900 [Note] Start binlog_dump to master_thread_id(2145900) slave_server(13058), pos(mysql-bin.000017, 1056976573)
2017-02-04T23:41:05.824194+08:00 2145900 [Note] Start semi-sync binlog_dump to slave (server_id: 13058), pos(mysql-bin.000017, 1056976573)
2017-02-04T23:41:05.835505+08:00 0 [Note] Semi-sync replication switched ON at (mysql-bin.000017, 1056977083)

關(guān)于怎么實現(xiàn)MySQL中的半同步復(fù)制就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI