1. 程式人生 > >mysql半同步複製搭建及驗證測試

mysql半同步複製搭建及驗證測試

非同步複製:客戶端提交日誌後,主庫寫入日誌到binlog,即可成功返回給客戶端。
半同步複製:客戶端提交日誌後,主庫寫入日誌到binlog,需等待其中一個slave也接收到binlog事務併成功寫入relay log後,主庫才返回commmit操作成功給客戶端。
如果主庫與從庫間的網路故障或從庫宕機,主庫上的事務會等待一段時間(時間引數由rpl_semi_sync_master_timeout設定的毫秒數決定),如果binlog在這段時間內都無法成功推送到從庫上,則mysql自動調整恢復為非同步模式,事務正常返回結果給客戶端。當網路或從庫恢復正常後,模式自動調整恢復為半同步模式。
主庫:
檢查是否支援動態外掛
(

[email protected]) [zeng]> select @@have_dynamic_loading;
+------------------------+
| @@have_dynamic_loading |
+------------------------+
| YES                    |
+------------------------+

檢視半同步外掛位置:
([email protected]) [zeng]>  show variables like 'plugin_dir';
+---------------+---------------------------------+
| Variable_name | Value                           |
+---------------+---------------------------------+
| plugin_dir    | /mysql/server/mysql/lib/plugin/ |
+---------------+---------------------------------+
1 row in set (0.00 sec)

([email protected]) [zeng]> system ls -l /mysql/proc/lib/plugin/|grep semi
-rwxr-xr-x 1 mysql2 mysql 414876 6月  24 15:24 semisync_master.so
-rwxr-xr-x 1 mysql2 mysql 247967 6月  24 15:24 semisync_slave.so

從庫:

檢查是否支援動態外掛
mysql> select @@have_dynamic_loading;
+------------------------+
| @@have_dynamic_loading |
+------------------------+
| YES                    |
+------------------------+
1 row in set (0.00 sec)

檢視半同步外掛位置:

mysql>  show variables like 'plugin_dir';
+---------------+-------------------------+
| Variable_name | Value                   |
+---------------+-------------------------+
| plugin_dir    | /mysql/proc/lib/plugin/ |
+---------------+-------------------------+
1 row in set (0.00 sec)

([email protected]) [(none)]> system ls -l /mysql/proc/lib/plugin/|grep semi
-rwxr-xr-x 1 mysql2 mysql 414876 6月  24 15:24 semisync_master.so
-rwxr-xr-x 1 mysql2 mysql 247967 6月  24 15:24 semisync_slave.so

配置 半同步複製:

1.載入semisynchronous外掛
Master:
([email protected]) [(none)]> install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.00 sec)

Slave:
mysql> install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.00 sec)

檢查是否有成功載入
Master:
Show plugins;
| rpl_semi_sync_master       | ACTIVE | REPLICATION        | semisync_master.so | GPL     |

([email protected]) [zeng]> select * from mysql.plugin;
+----------------------+--------------------+
| name                 | dl                 |
+----------------------+--------------------+
| rpl_semi_sync_master | semisync_master.so |
+----------------------+--------------------+
1 row in set (0.00 sec)

Slave:
Show plugins;
| rpl_semi_sync_slave        | ACTIVE | REPLICATION        | semisync_slave.so | GPL    

([email protected]) [(none)]> select * from mysql.plugin;
+---------------------+-------------------+
| name                | dl                |
+---------------------+-------------------+
| rpl_semi_sync_slave | semisync_slave.so |
+---------------------+-------------------+
1 row in set (0.00 sec)


2.引數配置
Master:
--啟用半同步複製
([email protected]) [(none)]> set global rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)
--指定master節點等待slave響應的時間:
([email protected]) [(none)]> set global rpl_semi_sync_master_timeout=30000;   ---單位是毫秒,可動態調整,表示主庫事務等待從庫返回commit成功資訊超過30秒就降為非同步模式,

不再等待從庫,等探到從庫恢復後,再返回為半同步。
Query OK, 0 rows affected (0.00 sec)

rpl_semi_sync_master_wait_no_slave--預設為on,表示事務提交後,需等待從主庫返回確認資訊。

Slave:
--啟用半同步複製
mysql> set global rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.00 sec)

加入到my.cnf檔案中:
主庫:
 rpl_semi_sync_master_enabled=1
 rpl_semi_sync_master_timeout=30000
從庫:
 rpl_semi_sync_slave_enabled=1


3.重啟io_thread執行緒

mysql> stop slave io_thread;start slave io_thread;
Query OK, 0 rows affected (0.00 sec)


4.監控半同步複製環境
master:
([email protected]) [zeng]> show status like 'rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 2     |   ---顯示處於半同步的slave節點個數
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     | ---不是半同步模式下slave及時響應的事務數 (未成功傳送到slave的事務數或不成功提交的數量)
| Rpl_semi_sync_master_status                | ON    | ---表示主庫半同步模式處於開啟狀態
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |---半同步模式下slave及時響應的事務數 (已成功傳送到slave的事務數或確認成功提交的數量)
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

slave:

([email protected]) [(none)]> show status like 'rpl_semi_sync%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |  ---是否處於半同步狀態
+----------------------------+-------+
1 row in set (0.00 sec)


master:

([email protected]) [zeng]> insert into vc values ('bc','bc');
Query OK, 1 row affected (0.03 sec)


([email protected]) [zeng]> show status like 'rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 2     |
| Rpl_semi_sync_master_net_avg_wait_time     | 606   |
| Rpl_semi_sync_master_net_wait_time         | 1213  |
| Rpl_semi_sync_master_net_waits             | 2     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 266   |
| Rpl_semi_sync_master_tx_wait_time          | 266   |
| Rpl_semi_sync_master_tx_waits              | 1     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 1     |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

場景一:驗證slave掛了後,同步模式的變化:

將slave主機停止slave的io執行緒
stop slave io_thread

master:
插入語句等待了30秒
([email protected]) [zeng]> insert into vc values ('cd','cd');
Query OK, 1 row affected (30.00 sec)

檢查master上的同步模式變化:
自動變成了非同步模式
([email protected]) [zeng]> show status like 'rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 2     |
| Rpl_semi_sync_master_net_avg_wait_time     | 334   |
| Rpl_semi_sync_master_net_wait_time         | 1339  |
| Rpl_semi_sync_master_net_waits             | 4     |
| Rpl_semi_sync_master_no_times              | 1     |
| Rpl_semi_sync_master_no_tx                 | 1     |  ---有一個事務沒有同步到slave
| Rpl_semi_sync_master_status                | OFF     ----變成了off,表示為非同步模式

只要將其中一個slave主機啟動slave:
start slave
半同步模式又啟用了

([email protected]) [zeng]> show status like 'rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 2     |
| Rpl_semi_sync_master_net_avg_wait_time     | 7034  |
| Rpl_semi_sync_master_net_wait_time         | 35174 |
| Rpl_semi_sync_master_net_waits             | 5     |
| Rpl_semi_sync_master_no_times              | 1     |
| Rpl_semi_sync_master_no_tx                 | 1     |
| Rpl_semi_sync_master_status                | ON    |

場景二:模擬同步報錯
先從庫刪除一個表A,再主庫同樣刪除表A,會看到從庫報錯,報錯是sql_thread在應用relay log報錯,半同步模式正常,說明同步模式與IO thread有關
與sql thread無關。

場景三:commit提交等待

將從庫停止slave
主庫執行update,並commit很慢,會發現commit操作要等待30秒。

相關推薦

mysql同步複製搭建驗證測試

非同步複製:客戶端提交日誌後,主庫寫入日誌到binlog,即可成功返回給客戶端。 半同步複製:客戶端提交日誌後,主庫寫入日誌到binlog,需等待其中一個slave也接收到binlog事務併成功寫入relay log後,主庫才返回commmit操作成功給客戶端。 如果主庫與

《深入淺出MySQL:資料庫開發、優化與管理維護(2nd)》第31章之MySQL同步複製搭建學習筆記

MySQL的非同步複製在使用的過程中,主庫和從庫的資料之間存在一定的延遲,這樣存在一個隱患:當在主庫上寫入一個事務並提交成功,而從庫尚未得到主庫推送的Binlog日誌時,主庫宕機了,例如主庫可能因磁碟損壞、記憶體故障等造成主庫上該事務Binlog丟失,此時從庫就可能損失這個事務,從而造成主從不一致。

MySQL主從複製同步複製原理搭建

在MySQL5.5之前的版本中,MySQL的複製是非同步複製,主庫和從庫的資料之間存在一定的延遲,比如網路故障等各種原因,這樣子容易存在隱患就是:當在主庫寫入一個事務成功後並提交了,但是由於從庫延遲沒有及時得到主庫推送的Binlog日誌時,主庫突然宕機了,那麼此時從庫就可能損失這個事務,從而造成主從不一致的狀

mysql 同步複製(semi_sync_replication)搭建使用

      google為mysql開發了一個補丁一個基於半同步的補丁,應用與mysql5.0。回來mysql打上了該補丁,並在5.5版本中使用。半同步複製的理念是什麼呢?在資料庫更改操作執行前,確保更改操作至少被寫入一臺slave磁碟中,意味著著對於每一個連線,最多隻有一

MySQL 5.6 一主多從的 同步複製搭建(已糾正)

# The following options will be passed to all MySQL clients [client] #password       = your_password port            = 3306 socket          = /tmp/my

Mysql 同步複製和非同步複製

mysql 半同步複製和非同步複製 -- 在主庫中安裝半同步外掛,開啟半同步複製功能 install plugin rpl_semi_sync_master soname 'semisync_master.so'; set global rpl_semi_sync_master_enab

MySQL同步複製

MySQL資料庫複製的預設方式是非同步複製,但是非同步複製的不足之處就在於,當主庫把event寫入二進位制日誌之後,並不知道從庫是否已經接收並應用了。在非同步模式的複製,如果主庫崩潰,很有可能在主庫中已經提交的事務,並沒有傳到到任何一臺從庫機器上。在高可用叢集

支援MySQL同步複製的virtual_slave元件

文章目錄 一、簡介 二、新的技術架構 三、virtual_slave 一、簡介 在設計高可用架構時,為了保證主從故障切換時的資料一致性,有各種處理方式。在5.5/5.6的單機房資料庫架構中,我們採取了共享儲存的

MySQL 同步複製+MMM架構

介紹     上篇文章介紹了MMM架構的實現方法,但是上篇文章的MMM方案的複製是非同步複製,非同步複製的主要問題在於當主從存在延時時如果主機出現了故障導致了主從切換時這時將會存在資料丟失;mysql為了解決非同步複製資料丟失的問題增加了半同步複製,半同步複製存在5.5以上的版本,半同步複製的原理是客戶

Mysql同步複製模式說明 - 運維小結

  MySQL主從複製包括非同步模式、半同步模式、GTID模式以及多源複製模式,預設是非同步模式 (如之前詳細介紹的mysql主從複製)。所謂非同步模式指的是MySQL 主伺服器上I/O thread 執行緒將二進位制日誌寫入binlog檔案之後就返回客戶端結果,不會考慮二進位制日誌是否完整傳輸到

Mysql同步複製模式

MySQL主從複製包括非同步模式、半同步模式、GTID模式以及多源複製模式,預設是非同步模式 (如之前詳細介紹的mysql主從複製)。所謂非同步模式指的是MySQL 主伺服器上I/O thread 執行緒將二進位制日誌寫入binlog檔案之後就返回客戶端結果,不會考慮二進位制日誌是否完整傳輸

MySQL同步複製--handle_slave_io--5

handle_slave_io函式呼叫read_event函式讀取event後,然後呼叫queue_event將讀取的event寫入relay log檔案中。程式碼如下:static int queue_event(Master_info* mi,const char* bu

Mysql同步複製、資料一致性檢查

1:配置非同步複製 scripts/mysql_install_db --user=mysql --datadir=/mysql/data bin/mysqld_safe --user=mysql & 在master上建立複製使用者: mysql> GRANT

MySQL同步複製--transmit_start

介紹半同步複製binlog dump執行緒需要做的事情。相關結構:Binlog_transmit_observer transmit_observer = { sizeof(Binlog_transmit_observer), // len repl_semi_bi

mysql 同步 5.65.7

5.6mysql半同步複製的原理圖 通過圖片,我們看到,當master提交事務時,並不等待slave節點確認。所以並不保證slave節點的事務是否也能commit成功(例如duplicate key error)。因此可能出現主庫提交的資料,從庫看不到的現

MySQL同步複製原理配置與介紹

環境介紹: Ubuntu Server 16.04.2+MySQL 5.7.17 Community Server (GPL) MySQL安裝 1、下載mysql-apt-config_0.8.3-1_all.deb 2、安裝deb

mysql同步複製&組複製&全同步機制

先配置好主從 配置主從詳見上一篇部落格,這裡只是簡單過一邊 mysql> grant replication slave on *.* to 'haha'@'172.25.53.%' identified by '[email protect

mysql 架構篇系列 4 複製架構一主一從搭建(同步複製)

一.概述   在mysql 5.5之前,mysql 的複製是非同步操作,主庫和從庫的資料之間存在一定的延時,這樣存在一個隱患:當主庫上寫入一個事務並提交成功,而從庫尚未得到主庫推送的Binlog日誌時,主庫down機了,事務Binlog丟失了,此時從庫就缺失了這個事務,從而造成主從不一致。    為了解決這個

MySQL主從複製原理、同步操作步驟原理

1.1 企業Linux運維場景資料同步方案 1.1.1 檔案級別的異機同步方案 1、scp/sftp/nc 命令可以實現遠端資料同步。  2、搭建ftp/http/svn/nfs 伺服器,然後在客戶端上也可以把資料同步到伺服器。  3、搭建sa

mysql GTID 同步複製

1)什麼是GTID GTID(Global Transaction ID)是對於一個已提交事務的編號,並且是一個全域性唯一的編號。GTID實際上是由UUID+TID組成的。其中UUID是一個MySQL例項的唯一標 識,儲存在mysql資料目錄下的auto.cnf檔案裡。TID代表了該例項上已經提交的事務數量