天天看點

mysql半同步複制

1.1.半同步複制的概念:

1.當Slave主機連接配接到Master時,能夠檢視其是否處于半同步複制的機制。

2.當Master上開啟半同步複制的功能時,至少應該有一個Slave開啟其功能。此時,一個線程在Master上送出事務将受到阻塞,直到得知一個已開啟半同步複制功能的Slave已收到此事務的所有事件,或等待逾時。

3.當一個事務的事件都已寫入其relay-log中且已重新整理到磁盤上,Slave才會告知已收到。

4.如果等待逾時,也就是Master沒被告知已收到,此時Master會自動轉換為異步複制的機制。當至少一個半同步的Slave趕上了,Master與其Slave自動轉換為半同步複制的機制。

5.半同步複制的功能要在Master,Slave都開啟,半同步複制才會起作用;否則,隻開啟一邊,它依然為異步複制。

1.2.半同步說明

在一主多從的場景中,主伺服器會以同步的方式,隻等待一台從伺服器複制完成并傳回成功資訊後才停止等待過程,但是在逾時後會自動降級為異步模式。

1.3.同步,異步,半同步複制的比較:

同步複制:Master送出事務,直到事務在所有的Slave都已送出,此時才會傳回用戶端,事務執行完畢。缺點:完成一個事務可能會有很大的延遲。

異步複制:當Slave準備好才會向Master請求binlog。缺點:不能保證一些事件都能夠被所有的Slave所接收。

半同步複制:半同步複制工作的機制處于同步和異步之間,Master的事務送出阻塞,隻要一個Slave已收到該事務的事件且已記錄。它不會等待所有的Slave都告知已收到,且它隻是接收,并不用等其完全執行且送出。

1.4.配置

環境 :多執行個體 主從同步3306 3307

在主從複制的基礎上,隻需執行如下操作即可。

# On Master

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';#插件

mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; #啟動子產品

mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000; #設定逾時時間

# On Slave

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; #插件

mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1; #啟動子產品

mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD; #重新開機程序使其子產品生效

如果需要開機時,自動能夠實作半同步則需要在Master和Slave的my.cnf中編輯:

[mysqld]

rpl_semi_sync_master_enabled=1 #啟動子產品

rpl_semi_sync_master_timeout=1000 #此機關是毫秒

rpl_semi_sync_slave_enabled=1

配置完後需要重新開機服務

檢視從伺服器上的semi_sync是否開啟:

mysql> SHOW GLOBAL STATUS LIKE "rpl_semi%";

mysql半同步複制

檢視主伺服器上的semi_sync是否開啟,注意clients 變為1 ,證明主從半同步複制連接配接成功:

mysql半同步複制

Rpl_semi_sync_master_no_tx:檢視有多少事務沒有用半同步複制的機制進行複制。

Rpl_semi_sync_master_yes_tx:檢視有多少事務是通過半同步複制機制成功複制。

rpl_semi_sync_master_timeout:是控制Master等待多長時間被告知Slave已收到,逾時時間。

将逾時時間改為0;再測試,這個時候寫入庫,看看半同步了多少事務,看那些沒同步,檢視效果,進行比較。

mysql> SET GLOBAL rpl_semi_sync_master_timeout = 0;

Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';

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

| Variable_name | Value |

| Rpl_semi_sync_master_clients | 1 |

| Rpl_semi_sync_master_net_avg_wait_time | 12622 |

| Rpl_semi_sync_master_net_wait_time | 12622 |

| Rpl_semi_sync_master_net_waits | 1 |

| Rpl_semi_sync_master_no_times | 1 |

| Rpl_semi_sync_master_no_tx | 1 |

| 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 |

| Rpl_semi_sync_slave_status | OFF |

15 rows in set (0.00 sec)

mysql> create database yhg1111;

Query OK, 1 row affected (0.01 sec)

| Rpl_semi_sync_master_net_avg_wait_time | 8908 |

| Rpl_semi_sync_master_net_wait_time | 17816 |

| Rpl_semi_sync_master_net_waits | 2 |

| Rpl_semi_sync_master_yes_tx | 1 |

| Rpl_semi_sync_slave_status