天天看點

Mysql半同步複制(Semi-synchronous Replication)

企業應用中,mysql經常采用主從構架,或者主主架構,這樣可以實作mysql伺服器的負載均衡,提升mysql伺服器的性能.而關鍵是,可以實作mysql的資料同步複制功能,來為企業資料備份提供一種友善的機制

預設情況下,MySQL5.5 的複制功能是異步的,這意味着當談到資料一緻性時,主伺服器及其從伺服器是獨立的。異步複制可以提供最佳的性能,因為主伺服器在将更新的資料寫入它的二進制日志(Binlog)檔案中後,無需等待驗證更新資料是否已經複制到至少一台拓撲從伺服器中,就可以自由處理其它進入的事務處理請求。雖然快,但這也同時帶來了很高的風險,如果在主伺服器或從伺服器端發生故障,會造成主伺服器/從伺服器資料的不一緻,甚至在恢複時造成資料丢失。

MySQL5.5 引入了一種半同步複制功能,該功能可以確定主伺服器和通路鍊中至少一台從伺服器之間的資料一緻性和備援。在這種配置結構中,一台主伺服器和其許多從伺服器都進行了配置,這樣在複制拓撲中,至少有一台從伺服器在父主伺服器進行事務處理前,必須确認更新已經收到并寫入了其中繼日志(Relay Log)。當出現逾時,源主伺服器必須暫時切換到異步複制模式重新複制,直到至少有一台設定為半同步複制模式的從伺服器及時收到資訊。

<a target="_blank" href="http://blog.51cto.com/attachment/201203/180913813.jpg"></a>

主要注意的地方:

1)mysql複制過程在網絡上傳輸時是明文的,不過支援SSL加密.

2)mysql複制要求主從架構的伺服器的server id 不能相同.

3)半同步複制模式必須在主伺服器和從伺服器端同時啟用,否則主伺服器預設使用異步複制模式。

實驗環境: debian系統6.2 mysql5.5 + centos配置基本一樣。

主:192.168.3.107

從:192.168.3.45  

一配置過程

1主端準備:

 認都是打開 的包括類型 ID 為1  預設每個mysql 都是主。

為從授權:

  flush privilege;

mysql&gt; flush privileges;

mysql&gt; create database testdb;

mysql&gt; use testdb;

mysql&gt; create table testuser(id int(4),name varchar(20));

mysql&gt; insert into testuser values(1,'test1');

mysql&gt; select * from testuser;

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

| id | name |

| 1 | test1 | 

+------+-------+ 1 row in set (0.00 sec)

配置檔案寫:

replicate_ignore_db = mysql  忽略的DB 不然這個

replicate_do_db = testdb  

重新開機服務 在進去

mysql&gt; show master status  ;

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

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

| mysql-bin.000005 |      307 | testdb       | mysql            |

1 row in set (0.00 sec)

說明配置檔案成功了

 3:設定從伺服器:

# 從伺服器不需要二進制日志,隻需要啟動中繼日志 

除非有自己獨立的庫需要二進制日志,那麼最好要關閉,

注釋掉log-bin 和 binlog_format 

# 從伺服器需要開啟中繼日志

relay-log=relay-bin   

 relay-log-index=relay-bin.index

server-id   = 11 ##ID 2以後随便設定

 replicate-ignore-db = mysql 忽略的DB 不然這個 會一直報錯!

#replicate-do-db = testdb 

從端不需要寫 寫了的話 必須手動建立庫。這樣你可以有效控制。

重新開機服務

<a target="_blank" href="http://blog.51cto.com/attachment/201203/111710164.jpg"></a>

  mysql&gt; change master to  master_host='192.168.3.107',  master_user='hou',master_password='houzi123',master_port=3306;

 mysql&gt;slave start;

 在從上檢視庫就會同步過來的。

 mysql&gt; SHOW SLAVE STATUS\G

檢視狀态 都YES 就為成功的。

<a target="_blank" href="http://blog.51cto.com/attachment/201203/190737475.jpg"></a>

成功後就會生成狀态檔案,名字預設為 `master.info` and `relay-log.info`。slave關閉後,會保留他們。當下一次slave啟動時,就會讀取這兩個檔案來判斷從master讀取到二進制日志的什麼位置了,改變的話需要删除這些檔案。

 在測試下同步:

主:

mysql&gt;  use testdb;

Database changed

mysql&gt;  insert into testuser values(2,'test2');

從:mysql&gt; select * from testuser;

| id   | name  |

|    1 | test1 |

|    2 | test2 |

2 rows in set (0.00 sec)

#####################################################

5.5 以後的異步還是有點不一樣的。

下面開始 半的 因為他是基礎異步的基礎上,半同步也會帶來的問題:網絡原因(比如網速很慢)造成同步遲遲不能進行.,在等不到某一個從伺服器同步後,自動降級為異步這麼來解決。

5.5版的mysql,那麼在/usr/local/mysql/lib/plugin/ 儲存了相關的插件,而我們需要安裝的是semisync_master.so semisync_slave.so

semisync_master.so  semisync_slave.so

啟動主伺服器的半同步複制功能:

mysql&gt;  INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

Query OK, 0 rows affected (0.03 sec)

set global rpl_semi_sync_master_enabled=1;

set global rpl_semi_sync_master_timeout=1000; (1 秒, 預設為 10 秒)

啟動從伺服器或多個從伺服器的半同步複制功能:

mysql&gt; INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

Query OK, 0 rows affected (0.00 sec)

set global rpl_semi_sync_slave_enabled=1;

在主伺服器上的my.cnf裡添加如下記錄 :

rpl_semi_sync_master_enabled=1

rpl_semi_sync_master_timeout=1000

在叢伺服器上的my.cnf裡添加如下記錄 :

 rpl_semi_sync_slave_enabled=1

因為設定全局參數了不用重新開機服務的。。

一旦啟動半同步複制模式,将會顯示出新系統及其狀态變量,這些變量可用于檢查配置和運作狀

态。每個值使用 SHOW VARIABLES 和 SHOW STATUS 顯示,包括:

在主伺服器中:

Rpl_semi_sync_master_status 用于訓示主伺服器使用的是異步複制模式,還是半同步複

制模式

Rpl_semi_sync_master_clients:用于顯示有多少個從伺服器配置成了半同步複制模式

Rpl_semi_sync_master_yes_tx: 顯示從伺服器确認的成功送出數量

Rpl_semi_sync_master_no_tx:顯示從伺服器确認的不成功送出數量

Rpl_semi_sync_master_tx_avg_wait_time:事務因開啟Semi_sync,平均需要額外等待的時間

Rpl_semi_sync_master_net_avg_wait_time:事務進入等待隊列後,到網絡平均等待時間

依據上面兩個狀态值可以知道,Semi-sync的網絡消耗有多大,給某個事務帶來的額外的消耗有多大.

<a target="_blank" href="http://blog.51cto.com/attachment/201203/193932627.jpg"></a>

取消插件:  UNINSTALL PLUGIN rpl_semi_sync_master;

未完待續。。。如有問題 回複或者郵箱聯系。

本文轉自 houzaicunsky 51CTO部落格,原文連結:http://blog.51cto.com/hzcsky/820859

繼續閱讀