溫馨提示×

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

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

msyql 的半同步復(fù)制

發(fā)布時(shí)間:2020-08-11 22:52:59 來源:網(wǎng)絡(luò) 閱讀:534 作者:rockSnail 欄目:MySQL數(shù)據(jù)庫(kù)


mysql的半同步復(fù)制:

 

mysql的異步復(fù)制:mysql默認(rèn)使用異步方式進(jìn)行同步,master在執(zhí)行客戶端提交的事務(wù)后會(huì)將結(jié)果返回給客戶端,表示客戶端的操作已經(jīng)生效,同時(shí)會(huì)將該操作的binlog通過dumper通知slave來取,再正常情況下,slave會(huì)將該binlog寫入本地,并通過sql語(yǔ)句寫入從庫(kù)中與主庫(kù)同步數(shù)據(jù),master對(duì)從庫(kù)是否寫入不負(fù)任何責(zé)任。

主和從的復(fù)制過程是由三個(gè)線程參與完成的,其中有兩個(gè)線程(sql語(yǔ)句和I/O線程在slave端),一個(gè)I/O線程在master端。

mysql的同步復(fù)制:這是一個(gè)偏執(zhí)狂,客戶端向主庫(kù)提交數(shù)據(jù),主庫(kù)寫入數(shù)據(jù)只有從庫(kù)將數(shù)據(jù)寫入本地后,返回給主庫(kù)一個(gè)回執(zhí),主庫(kù)向客戶端返回消息,表示已經(jīng)成功受理該任務(wù)。

mysql半同步:在masterdumper線程通知salve,同時(shí)增加了一個(gè)ack,mysql5.7支持在事務(wù)提交前等待ack,當(dāng)slave沒有返回給master ack時(shí),將會(huì)自動(dòng)降級(jí)為異步復(fù)制。

半同步通過rpl_semi_sync_master_wait_point參數(shù)來控制半同步下,master事務(wù)提交前的方式

mysql中的半同步參數(shù)after_sync,master 將每個(gè)事務(wù)寫入binlog傳遞到slave刷新到磁盤relay log,master等待slave反饋接收到的ack后在提交事務(wù)并返回提交成功給客戶端。

半同步的部署:

半同步基于mysql的異步復(fù)制,所以要先搭建好環(huán)境。環(huán)境搭建參考我的博客:http://12237658.blog.51cto.com/12227658/1907018

 

 

測(cè)試:

主:master

安裝半同步插件:

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

Query OK, 0 rows affected (0.08 sec)

查看插件是否安裝成功:

mysql> show plugins;會(huì)在最后發(fā)現(xiàn):

| ngram                      | ACTIVE   | FTPARSER           | NULL               | GPL     |

| rpl_semi_sync_master       | ACTIVE   | REPLICATION        | semisync_master.so | GPL     |

+----------------------------+----------+--------------------+--------------------+---------+

表明成功。

 

從:slave

安裝插件:

mysql>  INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

Query OK, 0 rows affected (0.11 sec)

使用:show plugins;或:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS  WHERE PLUGIN_NAME LIKE '%semi%';

如果發(fā)現(xiàn)

| rpl_semi_sync_slave        | ACTIVE   | REPLICATION        | semisync_slave.so | GPL     |

+----------------------------+----------+--------------------+-------------------+-----

即為成功。

 

啟動(dòng)半同步:

主:master

mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;

Query OK, 0 rows affected (0.00 sec)

 

mysql> show status like 'Rpl_semi_sync_master_status';

+-----------------------------+-------+

| Variable_name               | Value |

+-----------------------------+-------+

| Rpl_semi_sync_master_status | ON    |

+-----------------------------+-------+

1 row in set (0.00 sec)

 

從:slave

mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;

Query OK, 0 rows affected (0.00 sec)

mysql> show status like 'Rpl_semi_sync_slave_status';

+----------------------------+-------+

| Variable_name              | Value |

+----------------------------+-------+

| Rpl_semi_sync_slave_status | ON    |

+----------------------------+-------+

1 row in set (0.00 sec)

 

最后重新啟動(dòng)一下I/O線程:

mysql> STOP SLAVE IO_THREAD;

 

mysql> START SLAVE IO_THREAD;

 

 

測(cè)試:

在不關(guān)閉slave的情況下創(chuàng)建數(shù)據(jù)庫(kù),主從庫(kù)會(huì)很快寫入

主:

mysql> show status like 'Rpl_semi_sync_master_status';

+-----------------------------+-------+

| Variable_name               | Value |

+-----------------------------+-------+

| Rpl_semi_sync_master_status | ON    |

+-----------------------------+-------+

1 row in set (0.00 sec)

 

mysql> create database ginkgo;

Query OK, 1 row affected (0.05 sec)

:

mysql> show  status like 'Rpl_semi_sync_slave_status';

+----------------------------+-------+

| Variable_name              | Value |

+----------------------------+-------+

| Rpl_semi_sync_slave_status | ON    |

+----------------------------+-------+

1 row in set (0.00 sec)

 

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| ginkgo             |

| mysql              |

| performance_schema |

| sys                |

+--------------------+

5 rows in set (0.00 sec)

 

將從上的slave關(guān)閉:

 

mysql> drop database ginkgo;

Query OK, 0 rows affected (10.06 sec)

mysql> show status like 'Rpl_semi_sync_master_status';

+-----------------------------+-------+

| Variable_name               | Value |

+-----------------------------+-------+

| Rpl_semi_sync_master_status | OFF   |

+-----------------------------+-------+

1 row in set (0.00 sec)

slave長(zhǎng)時(shí)間不給ack回應(yīng),被迫轉(zhuǎn)化為異步,時(shí)間也較長(zhǎng),主要是等待時(shí)間。

從上肯定沒有數(shù)據(jù)變化。

 

**注意,寫數(shù)據(jù)庫(kù)時(shí)一定要在配置文件中確定自己是允許那個(gè)庫(kù)同步,不要瞎建庫(kù)奧。


向AI問一下細(xì)節(jié)

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

AI