標籤:並行複製
並行複製,主要是解決sql_thread在高並發環境下,存在效能瓶頸。mysql5.7並行複製的思想簡單易懂,一個組提交的事務都是可以並行回放,因為這些事務都已進入到事務的prepare階段,則說明事務之間沒有任何衝突(否則就不可能提交)。
為了相容MySQL 5.6基於庫的並行複製,5.7引入了新的變數slave-parallel-type,其可以配置的值有:
(1)DATABASE:預設值,基於庫的並行複製方式
(2)LOGICAL_CLOCK:基於組提交的並行複製方式
操作步驟:
資料庫版本資訊
650) this.width=650;" src="http://s4.51cto.com/wyfs02/M01/8B/F7/wKioL1hd_b6ycFcvAACBGL0D-P0424.png" title="0_1.png" alt="wKioL1hd_b6ycFcvAACBGL0D-P0424.png" />
複製類型 基於binlog檔案名稱和位置【也可採用GTID方式】
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/8B/FB/wKiom1hd_l-g790VAAA-0C28dFA991.png" title="0_2.png" alt="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線程。
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M02/8B/FB/wKiom1heCWaz-Uu7AACT8jOdpiY523.png" title="cor.png" alt="wKiom1heCWaz-Uu7AACT8jOdpiY523.png" />
如何知道事務是否在一組中,因為原版的MySQL並沒有提供這樣的資訊。在MySQL 5.7版本中,其設計方式是將組提交的資訊存放在GTID中。那麼如果使用者沒有開啟GTID功能,即將參數gtid_mode設定為OFF呢?故MySQL 5.7又引入了稱之為Anonymous_Gtid的二進位日誌event類型。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/8B/F7/wKioL1heAary4UfIAACfCGMN9Kg209.png" title="4_1.png" alt="wKioL1heAary4UfIAACfCGMN9Kg209.png" />
last_committed值相同的為一組,可以並存執行。
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M01/8B/F7/wKioL1heCJ_iv6rhAAAvMM7DH-8052.png" title="commit.png" alt="wKioL1heCJ_iv6rhAAAvMM7DH-8052.png" />
監控並行複製的資訊
"[email protected]: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個,那麼在從機的回放時,雖然開啟了並行複製,但會出現效能反而比原先的單線程還要差的現象,即延遲反而增大了。
本文出自 “南山深處” 部落格,請務必保留此出處http://kenneyzhou.blog.51cto.com/12427643/1885731
mysql 並行複製