mysql半同步複製

mysql半同步複製
一.介紹
從MYSQL5.5開始,支持半自動複製。之前版本的MySQL Replication都是異步(asynchronous)的,主庫在執行完一些事務後,是不會管備庫的進度的。如果備庫不幸落後,而更不幸的是主庫此時又出現Crash(例如宕機),這時備庫中的數據就是不完整的。簡而言之,在主庫發生故障的時候,我們無法使用備庫來繼續提供數據一致的服務了。
半同步複製(Semi synchronous Replication)則一定程度上保證提交的事務已經傳給了至少一個備庫。
在Semi synchronous中,僅僅保證事務的已經傳遞到備庫上,但是並不確保已經在備庫上執行完成了。
引入半同步複製功能的目的是爲了保證在master出問題的時候,至少有一臺Slave的數據是完整的。在超時的情況下也可以臨時轉入異步複製,保障業務的正常使用,直到一臺salve追趕上之後,繼續切換到半同步模式。
MySQL在加載並開啓Semi-sync插件後,每一個事務需等待備庫接收日誌後才返回給客戶端。如果做的是小事務,兩臺主機的延遲又較小,則Semi-sync可以實現在性能很小損失的情況下的零數據丟失。
所以我們可以做多個備庫,任何一個備庫接收完成日誌後,主庫就可以返回給客戶端了。

二.配置
2.1先決條件
mysql版本:5.6.34
master:mysql-db01
slave: mysql-db02
已經做完主從複製(異步複製)
2.2 master配置
#登錄數據庫
[root@mysql-db01 ~]# mysql -uroot -poldboy123
#查看是否有動態支持
mysql> show global variables like 'have_dynamic_loading';

+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| have_dynamic_loading | YES | #YES證明有動態支持
+----------------------+-------+
#安裝自帶插件(後附插件位置)
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;
#修改配置文件
[root@mysql-db01 ~]# vim /etc/my.cnf
#在[mysqld]標籤下添加如下內容(不用重啓庫)
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
#半同步插件的位置
[root@mysql-db01 plugin]# pwd
/application/mysql/lib/plugin
[root@mysql-db01 plugin]# ll
total 2140
-rwxr-xr-x 1 7161 wheel 15437 Jan 14 2014 adt_null.so
-rwxr-xr-x 1 7161 wheel 25619 Jan 14 2014 auth.so
-rwxr-xr-x 1 7161 wheel 12364 Jan 14 2014 auth_socket.so
-rwxr-xr-x 1 7161 wheel 25096 Jan 14 2014 auth_test_plugin.so
-rw-r--r-- 1 7161 wheel 227 Jan 14 2014 daemon_example.ini
drwxr-xr-x 2 root root 4096 Mar 6 21:18 debug
-rwxr-xr-x 1 7161 wheel 567877 Jan 14 2014 innodb_engine.so
-rwxr-xr-x 1 7161 wheel 42633 Jan 14 2014 libdaemon_example.so
-rwxr-xr-x 1 7161 wheel 584163 Jan 14 2014 libmemcached.so
-rwxr-xr-x 1 7161 wheel 17539 Jan 14 2014 mypluglib.so
-rwxr-xr-x 1 7161 wheel 18111 Jan 14 2014 qa_auth_client.so
-rwxr-xr-x 1 7161 wheel 23806 Jan 14 2014 qa_auth_interface.so
-rwxr-xr-x 1 7161 wheel 12926 Jan 14 2014 qa_auth_server.so
-rwxr-xr-x 1 7161 wheel 415334 Jan 14 2014 semisync_master.so # master的插件
-rwxr-xr-x 1 7161 wheel 250238 Jan 14 2014 semisync_slave.so # slave的插件
-rwxr-xr-x 1 7161 wheel 139172 Jan 14 2014 validate_password.so
2.3檢查master是否安裝成功
#登錄數據庫
[root@mysql-db01 ~]# mysql -uroot -poldboy123

#檢查安裝
mysql> select * from information_schema.plugins;
mysql> show variables like'rpl%';
+------------------------------------+----------+
| Variable_name | Value |
+------------------------------------+----------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 1000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_stop_slave_timeout | 31536000 |
+------------------------------------+----------+
#查詢複製狀態
mysql> show global status like 'rpl_semi%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 | #表示有一個從庫
| 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 |
| 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 |
+--------------------------------------------+-------+
14 rows in set (0.03 sec)
2.4 slave配置
#登錄數據庫
[root@mysql-db02 ~]# mysql -uroot -poldboy123
#安裝slave半同步插件(插件位置上文有展示)
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME'semisync_slave.so';
#啓動插件
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
#重啓io線程使其生效
mysql> stop slave io_thread;
mysql> start slave io_thread;
#編輯配置文件(不需要重啓數據庫)
[root@mysql-db02 ~]# vim /etc/my.cnf
#在[mysqld]標籤下添加如下內容
[mysqld]
rpl_semi_sync_slave_enabled =1

注:相關參數說明
rpl_semi_sync_master_timeout=milliseconds
設置此參數值(ms),爲了防止半同步複製在沒有收到確認的情況下發生堵塞,如果Master在超時之前沒有收到任何確認,將恢復到正常的異步複製,並繼續執行沒有半同步的複製操作。
rpl_semi_sync_master_wait_no_slave={ON|OFF}
如果一個事務被提交,但Master沒有任何Slave的連接,這時不可能將事務發送到其它地方保護起來。默認情況下,Master會在時間限制範圍內繼續等待Slave的連接,並確認該事務已經被正確的寫到磁盤上。
可以使用此參數選項關閉這種行爲,在這種情況下,如果沒有Slave連接,Master就會恢復到異步複製。

三.測試半同步
#創建兩個數據庫,test1和test2
mysql> create database test1;
Query OK, 1 row affected (0.04 sec)

mysql> create database test2;
Query OK, 1 row 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 | 768 |
| Rpl_semi_sync_master_net_wait_time | 1497 |
| 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 | 884 |
| Rpl_semi_sync_master_tx_wait_time | 1769 |
| Rpl_semi_sync_master_tx_waits | 2 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
#此行顯示2,表示剛纔創建的兩個庫執行了半同步
| Rpl_semi_sync_master_yes_tx | 2 |
+--------------------------------------------+-------+
14 rows in set (0.06 sec)
#從庫查看
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| test1 |
| test2 |
+--------------------+
#關閉半同步(1:開啓 0:關閉)
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 0;
#查看半同步狀態
mysql> show global status like 'rpl_semi%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 768 |
| Rpl_semi_sync_master_net_wait_time | 1497 |
| 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 | OFF | #狀態爲關閉
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 884 |
| Rpl_semi_sync_master_tx_wait_time | 1769 |
| Rpl_semi_sync_master_tx_waits | 2 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 2 |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

#再一次創建兩個庫
mysql> create database test3;
Query OK, 1 row affected (0.00 sec)

mysql> create database test4;
Query OK, 1 row 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 | 768 |
| Rpl_semi_sync_master_net_wait_time | 1497 |
| 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 | OFF |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 884 |
| Rpl_semi_sync_master_tx_wait_time | 1769 |
| Rpl_semi_sync_master_tx_waits | 2 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
#此行還是顯示2,則證明,剛纔的那兩條並沒有執行半同步否則應該是4
| Rpl_semi_sync_master_yes_tx | 2 |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

注:不難發現,在查詢半同步狀態是,開啓半同步,查詢會有延遲時間,關閉之後則沒有

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章