mysql 並行複製

      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:基於組提交的並行複製方式


操作步驟:

數據庫版本信息

wKioL1hd_b6ycFcvAACBGL0D-P0424.png


複製類型 基於binlog文件名和位置【也可採用GTID方式】

wKiom1hd_l-g790VAAA-0C28dFA991.png


在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線程。

wKiom1heCWaz-Uu7AACT8jOdpiY523.png


   如何知道事務是否在一組中,因爲原版的MySQL並沒有提供這樣的信息。在MySQL 5.7版本中,其設計方式是將組提交的信息存放在GTID中。那麼如果用戶沒有開啓GTID功能,即將參數gtid_mode設置爲OFF呢?故MySQL 5.7又引入了稱之爲Anonymous_Gtid的二進制日誌event類型。

wKioL1heAary4UfIAACfCGMN9Kg209.png


last_committed值相同的爲一組,可以並行執行。

wKioL1heCJ_iv6rhAAAvMM7DH-8052.png


監控並行複製的信息

"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個,那麼在從機的回放時,雖然開啓了並行複製,但會出現性能反而比原先的單線程還要差的現象,即延遲反而增大了。


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