企業應用中,mysql常常採用主從構架,或者主主架構,這樣能夠實現mysql服務器的負載均衡,提高mysql服務器的性能.而關鍵是,能夠實現mysql的數據同步複製功能,來爲企業數據備份提供一種方便的機制mysql
默認狀況下,MySQL5.5 的複製功能是異步的,這意味着當談到數據一致性時,主服務器及其從服務器是獨立的。異步複製能夠提供最佳的性能,由於主服務器在將更新的數據寫入它的二進制日誌(Binlog)文件中後,無需等待驗證更新數據是否已經複製到至少一臺拓撲從服務器中,就能夠自由處理其它進入的事務處理請求。雖然快,但這也同時帶來了很高的風險,若是在主服務器或從服務器端發生故障,會形成主服務器/從服務器數據的不一致,甚至在恢復時形成數據丟失。sql
MySQL5.5 引入了一種半同步複製功能,該功能能夠確保主服務器和訪問鏈中至少一臺從服務器之間的數據一致性和冗餘。在這種配置結構中,一臺主服務器和其許多從服務器都進行了配置,這樣在複製拓撲中,至少有一臺從服務器在父主服務器進行事務處理前,必須確認更新已經收到並寫入了其中繼日誌(Relay Log)。當出現超時,源主服務器必須暫時切換到異步複製模式從新複製,直到至少有一臺設置爲半同步複製模式的從服務器及時收到信息。centos
主要注意的地方:服務器
1)mysql複製過程在網絡上傳輸時是明文的,不過支持SSL加密.網絡
2)mysql複製要求主從架構的服務器的server id 不能相同.架構
3)半同步複製模式必須在主服務器和從服務器端同時啓用,不然主服務器默認使用異步複製模式。
負載均衡
實驗環境: debian系統6.2 mysql5.5 + centos配置基本同樣。異步
主:192.168.3.107ide
從:192.168.3.45 性能
一配置過程
1主端準備:
認都是打開 的包括類型 ID 爲1 默認每一個mysql 都是主。
爲從受權:
grant replication client,replication slave on *.* to hou@192.168.3.45 identified by 'houzi123' ;flush privilege;
mysql> flush privileges;
mysql> create database testdb;
mysql> use testdb;
mysql> create table testuser(id int(4),name varchar(20));
mysql> insert into testuser values(1,'test1');
mysql> flush privileges;
mysql> select * from testuser;
+------+-------+
| id | name |
+------+-------+
| 1 | test1 |
+------+-------+ 1 row in set (0.00 sec)
配置文件寫:
replicate_ignore_db = mysql 忽略的DB 否則這個
replicate_do_db = testdb
重啓服務 在進去
mysql> show master status ;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 307 | testdb | mysql |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
說明配置文件成功了
replicate-ignore-db = mysql 忽略的DB 否則這個 會一直報錯!
#replicate-do-db = testdb
從端不須要寫 寫了的話 必須手動創建庫。這樣你能夠有效控制。
重啓服務
mysql> change master to master_host='192.168.3.107', master_user='hou',master_password='houzi123',master_port=3306;
mysql>slave start;
在從上查看庫就會同步過來的。
mysql> SHOW SLAVE STATUS\G
查看狀態 都YES 就爲成功的。
成功後就會生成狀態文件,名字默認爲 `master.info` and `relay-log.info`。slave關閉後,會保留他們。當下一次slave啓動時,就會讀取這兩個文件來判斷從master讀取到二進制日誌的什麼位置了,改變的話須要刪除這些文件。
在測試下同步:
主:
mysql> use testdb;
Database changed
mysql> insert into testuser values(2,'test2');
從:mysql> 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
root@houzaicun:/usr/local/mysql/lib/plugin# ls -a semisync_*
semisync_master.so semisync_slave.so
啓動主服務器的半同步複製功能:
mysql> 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 秒)
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的網絡消耗有多大,給某個事務帶來的額外的消耗有多大.
取消插件: UNINSTALL PLUGIN rpl_semi_sync_master;
未完待續。。。若有問題 回覆或者郵箱聯繫。