1、實驗目的:mysql
mysql在主從複製還支持半同步複製,mysql複製是異步的,由於同步性能很是差。主庫分發事件之後必須等待從庫複製數據結束並收到從庫正常響應之後,才能進行下一步操做。異步模式致使從庫落後主庫時,主庫無從得知。所以mysql5.5後引入google補丁半同步複製,2個插件:semisync_master.so與semisync_slave.so。半同步:一主多從架構中,主庫只等待一臺從庫複製完成數據並返回正常響應,就認爲同步完成進行下一步操做,這樣即有異步的高速,又有同步的安全。一旦主庫等待從庫響應超時,半同步複製自動降級爲異步複製。半同步複製前提至少有一臺從庫與主庫在同一機房,保證足夠帶寬,數據複製也足夠快。由於對寫性能影響極大又須要同步確認等待。sql
2、實驗步驟vim
1.mysql支持的模塊/插件安全
[root@master~]# ls -t /usr/local/mysql/lib/plugin/ debug semisync_slave.so mypluglib.so qa_auth_interface.so qa_auth_client.so adt_null.so daemon_example.ini semisync_master.so libdaemon_example.so qa_auth_server.so auth_test_plugin.so auth_socket.so auth.so
2.半同步模塊安裝服務器
2.1主庫session
mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; mysql>SHOW GLOBAL VARIABLES LIKE '%semi%'; 服務器變量 +------------------------------------+-------+ |Variable_name |Value | +------------------------------------+-------+ |rpl_semi_sync_master_enabled |OFF | |rpl_semi_sync_master_timeout |10000 | 主從庫鏈接超時過值,自動降爲異步。毫秒 |rpl_semi_sync_master_trace_level |32 | |rpl_semi_sync_master_wait_no_slave | ON | 沒有從庫也要等一下 +------------------------------------+-------+ mysql>SET GLOBAL rpl_semi_sync_master_enabled=1; mysql>SET GLOBAL rpl_semi_sync_master_timeout=1000; mysql>SHOW GLOBAL STATUS LIKE '%semi%'; +--------------------------------------------+-------+ |Variable_name | Value | +--------------------------------------------+-------+ |Rpl_semi_sync_master_clients | 1 | 從節點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 | +--------------------------------------------+-------+ mysql>USE school; mysql>CREATE TABLE tb2(name CHAR(20)); mysql>SHOW GLOBAL STATUS LIKE '%semi%'; +--------------------------------------------+-------+ |Variable_name | Value | +--------------------------------------------+-------+ |Rpl_semi_sync_master_clients | 1 | |Rpl_semi_sync_master_net_avg_wait_time | 800 | 等待從服返回報告時間 |Rpl_semi_sync_master_net_wait_time | 800 | |Rpl_semi_sync_master_net_waits | 1 | |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 | 715 | 等待從服事務返回報告時間 |Rpl_semi_sync_master_tx_wait_time | 715 | |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 | +--------------------------------------------+-------+ mysql>INSERT INTO tb2 VALUES ('tom'),('jerry'),('jack'); mysql>SHOW GLOBAL STATUS LIKE '%semi%'; +--------------------------------------------+-------+ |Variable_name | Value | +--------------------------------------------+-------+ |Rpl_semi_sync_master_clients | 1 | |Rpl_semi_sync_master_net_avg_wait_time | 1518 | |Rpl_semi_sync_master_net_wait_time | 3037 | |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 | 715 | |Rpl_semi_sync_master_tx_wait_time | 715 | |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 | 2 | +--------------------------------------------+-------+
從庫架構
mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; mysql>SHOW GLOBAL VARIABLES LIKE '%semi%'; +---------------------------------+-------+ |Variable_name | Value | +---------------------------------+-------+ |rpl_semi_sync_slave_enabled |OFF | |rpl_semi_sync_slave_trace_level | 32 | +---------------------------------+-------+ mysql>SET GLOBAL rpl_semi_sync_slave_enabled=1; mysql>STOP SLAVE; mysql>START SLAVE; mysql>SHOW GLOBAL STATUS LIKE '%semi%'; +----------------------------+-------+ |Variable_name | Value | +----------------------------+-------+ |Rpl_semi_sync_slave_status | ON | +----------------------------+-------+
永久配置在Master和Slave的my.cnf中編輯:異步
# OnMaster [root@master~]# vim /etc/my.cnf [mysqld] rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=1000# 1 second 驗證 mysql>SHOW GLOBAL VARIABLES LIKE '%semi%'; +------------------------------------+-------+ |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 | +------------------------------------+-------+ # OnSlave [root@slave~]# vim /etc/my.cnf [mysqld] rpl_semi_sync_slave_enabled=1 驗證 mysql>SHOW GLOBAL VARIABLES LIKE '%semi%'; +---------------------------------+-------+ |Variable_name | Value | +---------------------------------+-------+ |rpl_semi_sync_slave_enabled | ON | |rpl_semi_sync_slave_trace_level | 32 | +---------------------------------+-------+