MySQL的複製延遲是一直被詬病的問題之一,在MySQL 5.7版本已經支持“真正”的並行複製功能,官方稱爲爲enhanced multi-threaded slave(簡稱MTS),因此複製延遲問題已經得到了極大的改進。總之,MySQL 5.7版本後,複製延遲問題永不存在。並行複製主要是解決sql_thread在高併發環境下,存在性能瓶頸。mysql5.7並行複製的思想簡單易懂,一個組提交的事務都是可以並行回放,因爲這些事務都已進入到事務的prepare階段,則說明事務之間沒有任何衝突(否則就不可能提交)。
爲了兼容MySQL 5.6基於庫的並行複製,5.7引入了新的變量slave-parallel-type,其可以配置的值有:
(1)DATABASE:默認值,基於庫的並行複製方式
(2)LOGICAL_CLOCK:基於組提交的並行複製方式
操作步驟:
數據庫版本信息
複製類型 基於binlog文件名和位置【也可採用GTID方式】
在slave 的my.cnf增加配置,然後重啓slave。
[mysqld]
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=8
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON
重新start slave;發現有8個coordinator線程。
如何知道事務是否在一組中,因爲原版的MySQL並沒有提供這樣的信息。在MySQL 5.7版本中,其設計方式是將組提交的信息存放在GTID中。那麼如果用戶沒有開啓GTID功能,即將參數gtid_mode設置爲OFF呢?故MySQL 5.7又引入了稱之爲Anonymous_Gtid的二進制日誌event類型。
last_committed值相同的爲一組,可以並行執行。
監控並行複製的信息
"root@localhost:mysql9000.sock [performance_schema]>show tables like 'replication%';
+---------------------------------------------+
| Tables_in_performance_schema (replication%) |
+---------------------------------------------+
| replication_applier_configuration |
| replication_applier_status |
| replication_applier_status_by_coordinator |
| replication_applier_status_by_worker |
| replication_connection_configuration |
| replication_connection_status |
| replication_group_member_stats |
| replication_group_members |
+---------------------------------------------+
8 rows in set (0.00 sec)
並行複製配置與調優
master_info_repository
開啓MTS功能後,務必將參數master_info_repostitory設置爲TABLE,這樣性能可以有50%~80%的提升。這是因爲並行複製開啓後對於元master.info這個文件的更新將會大幅提升,資源的競爭也會變大。在之前InnoSQL的版本中,添加了參數來控制刷新master.info這個文件的頻率,甚至可以不刷新這個文件。因爲刷新這個文件是沒有必要的,即根據master-info.log這個文件恢復本身就是不可靠的。在推薦將master_info_repository設置爲TABLE,來減小這部分的開銷。
slave_parallel_workers
若將slave_parallel_workers設置爲0,則MySQL 5.7退化爲原單線程複製,但將slave_parallel_workers設置爲1,則SQL線程功能轉化爲coordinator線程,但是隻有1個worker線程進行回放,也是單線程複製。然而,這兩種性能卻又有一些的區別,因爲多了一次coordinator線程的轉發,因此slave_parallel_workers=1的性能反而比0還要差,有20%左右的性能下降。
這裏其中引入了另一個問題,如果主機上的負載不大,那麼組提交的效率就不高,很有可能發生每組提交的事務數量僅有1個,那麼在從機的回放時,雖然開啓了並行複製,但會出現性能反而比原先的單線程還要差的現象,即延遲反而增大了。