MySQL的半同步復(fù)制:
站在用戶的角度思考問題,與客戶深入溝通,找到博州網(wǎng)站設(shè)計(jì)與博州網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請(qǐng)域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋博州地區(qū)。
mysql的異步復(fù)制:mysql默認(rèn)使用異步方式進(jìn)行同步,master在執(zhí)行客戶端提交的事務(wù)后會(huì)將結(jié)果返回給客戶端,表示客戶端的操作已經(jīng)生效,同時(shí)會(huì)將該操作的binlog通過dumper通知slave來取,再正常情況下,slave會(huì)將該binlog寫入本地,并通過sql語句寫入從庫中與主庫同步數(shù)據(jù),master對(duì)從庫是否寫入不負(fù)任何責(zé)任。
主和從的復(fù)制過程是由三個(gè)線程參與完成的,其中有兩個(gè)線程(sql語句和I/O線程在slave端),一個(gè)I/O線程在master端。
mysql的同步復(fù)制:這是一個(gè)偏執(zhí)狂,客戶端向主庫提交數(shù)據(jù),主庫寫入數(shù)據(jù)只有從庫將數(shù)據(jù)寫入本地后,返回給主庫一個(gè)回執(zhí),主庫向客戶端返回消息,表示已經(jīng)成功受理該任務(wù)。
mysql半同步:在master的dumper線程通知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ù)庫,主從庫會(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ù)庫時(shí)一定要在配置文件中確定自己是允許那個(gè)庫同步,不要瞎建庫奧。