前提是主從異步復制環境要提前搭建好,然后再開啟mysql增強半同步
環境:mysql5.7.26 主從異步復制早已部署好。
1.加載plugin插件
建議master和slave上全部執行(考慮到MHA的主從自動切換的環境)
在主庫安裝semisync_master.so和semisync_slave.so插件:
linux服務器上的master庫執行:
root@localhost [(none)]>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; Query OK, 0 rows affected (4.52 sec) root@localhost [(none)]>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; Query OK, 0 rows affected (0.07 sec)
linux服務器上的slave庫執行:
root@localhost [(none)]>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; Query OK, 0 rows affected (4.52 sec) root@localhost [(none)]>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; Query OK, 0 rows affected (0.07 sec)
查看時候已經安裝了插件
root@localhost 07:52: [fengjian]> show plugins; +----------------------------+----------+--------------------+--------------------+---------+ | Name | Status | Type | Library | License | +----------------------------+----------+--------------------+--------------------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL | | sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL | | MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | CSV | ACTIVE | STORAGE ENGINE | NULL | GPL | | PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL | | MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL | | MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL | | INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_TEMP_TABLE_INFO | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FIELDS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_DATAFILES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_VIRTUAL | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL | | FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL | | BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL | | partition | ACTIVE | STORAGE ENGINE | NULL | GPL | | ngram | ACTIVE | FTPARSER | NULL | GPL | | rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL | | rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL | +----------------------------+----------+--------------------+--------------------+---------+ 46 rows in set (0.11 sec)
2.slave和master開啟增強半同步參數
生產環境上建議先在slave庫上的開啟 增強半同步參數
set global rpl_semi_sync_slave_enabled =1; stop slave io_thread;start slave io_thread;
此刻觀察master的錯誤日志:提示開啟了Semi-sync replication 復制
2020-02-24T07:39:39.445151-00:00 584 [Note] Start binlog_dump to master_thread_id(584) slave_server(255506), pos(, 4) 2020-02-24T07:44:44.300106-00:00 586 [Note] While initializing dump thread for slave with UUID <22da22b2-56af-11ea-9b23-0242ac120c03>, found a zombie dump thread with the same UUID. Master is killing the zombie dump thread(584). 2020-02-24T07:44:44.300345-00:00 586 [Note] Start binlog_dump to master_thread_id(586) slave_server(255506), pos(, 4) 2020-02-24T07:44:44.300371-00:00 586 [Note] Start semi-sync binlog_dump to slave (server_id: 255506), pos(, 4) 2020-02-24T07:44:44.300809-00:00 584 [Note] Stop asynchronous binlog_dump to slave (server_id: 255506) 2020-02-24T07:46:09.373869-00:00 585 [Note] Semi-sync replication initialized for transactions. 2020-02-24T07:46:09.373908-00:00 585 [Note] Semi-sync replication enabled on the master. 2020-02-24T07:46:09.374779-00:00 0 [Note] Starting ack receiver thread
然后master上再開啟增強半同步參數
set global rpl_semi_sync_master_enabled =1 set global rpl_semi_sync_master_timeout =1000 #增強半同步的個數 rpl_semi_sync_master_wait_for_slave_count = 1
3.MySQL官網配置方法
rpl_semi_sync_master_enabled =1 # 0 rpl_semi_sync_slave_enabled =1 # 0 rpl_semi_sync_master_timeout =1000 # 1000(1 second) 同步復制中由於網絡原因導致復制時間超過1s后,增強半同步復制就變成了異步復制了 rpl_semi_sync_master_wait_for_slave_count=N plugin_load_add =semisync_master.so # plugin_load_add =semisync_slave.so
重啟master和slave數據庫。
4.實際生產環境配置方法
當然實際操作中還是不建議把參數rpl_semi_sync_master_enabled 和rpl_semi_sync_slave_enabled 直接寫入配置文件的。
原因:把參數加入my.cnf配置文件時,在slave庫掛掉,重新開啟slave庫或者是slave庫重啟后,會自動開啟增強半同步復制。
如果在slave庫斷開master庫時間較長時,最好是先開啟mysql異步復制,讓slave庫追趕上master庫后,然后再開啟增強半同步復制。這樣不會拖垮master庫。要是直接開啟增強半同步復制是會拖垮主庫的。
rpl_semi_sync_master_timeout =1000 ##1s 這個轉化為異步復制的超時參數是可以寫入配置文件的。
5.案例
當線上運行的MySQL增強半同步復制架構中,當其中的一台slave庫掛掉了應該如何正確重新添加到原先的增強半同步復制架構??
正確的做法如下:
1. 此2個參數rpl_semi_sync_master_enabled 和rpl_semi_sync_slave_enabled 不要直接寫入到my.cnf配置文件開啟。 2.在slave庫上先 stop slave io_thread ;set global rpl_semi_sync_slave_enabled=0 關閉此參數。然后start slave io_thread 或者start slave 開啟異步復制,讓slave庫追趕上master庫。 3.然后在slave庫 set global rpl_semi_sync_slave_enabled=1 ;stop slave io_thread;start slave io_thread;
轉載於:https://blog.51cto.com/wujianwei/2409754