數(shù)據(jù)庫(kù)復(fù)制的主要性能問題就是數(shù)據(jù)延時(shí)
為了優(yōu)化復(fù)制性能弊决,Mysql 5.6 引入了 “多線程復(fù)制” 這個(gè)新功能
但 5.6 中的每個(gè)線程只能處理一個(gè)數(shù)據(jù)庫(kù)噪舀,所以如果只有一個(gè)數(shù)據(jù)庫(kù),或者絕大多數(shù)寫操作都是集中在某一個(gè)數(shù)據(jù)庫(kù)的飘诗,那么這個(gè)“多線程復(fù)制”就不能充分發(fā)揮作用了
Mysql 5.7 對(duì) “多線程復(fù)制” 進(jìn)行了改善与倡,可以按照邏輯時(shí)鐘的方式來(lái)分配線程,大大提高了復(fù)制性能
下面看一下在5.7中如何配置 “多線程復(fù)制”
1昆稿、查看當(dāng)前復(fù)制模式
可以看到只有一個(gè)復(fù)制線程在工作
2纺座、設(shè)置并發(fā)同步類型為邏輯時(shí)鐘方式
查看默認(rèn)的并發(fā)復(fù)制類型
mysql> show variables like 'slave_parallel_type';
+---------------------+----------+
| Variable_name | Value |
+---------------------+----------+
| slave_parallel_type | DATABASE |
+---------------------+----------+
1 row in set (0.00 sec)
默認(rèn)是datebase,每個(gè)線程只能處理一個(gè)數(shù)據(jù)庫(kù)
配置成基于邏輯時(shí)鐘的方式
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
mysql> set global slave_parallel_type='logical_clock';
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'slave_parallel_type';
+---------------------+---------------+
| Variable_name | Value |
+---------------------+---------------+
| slave_parallel_type | LOGICAL_CLOCK |
+---------------------+---------------+
1 row in set (0.01 sec)
mysql>
3溉潭、設(shè)置復(fù)制線程的數(shù)量
#查看下當(dāng)前的復(fù)制線程數(shù)净响,默認(rèn)都是0
mysql> show variables like 'slave_parallel_workers';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| slave_parallel_workers | 0 |
+------------------------+-------+
1 row in set (0.00 sec)
#適當(dāng)調(diào)整,我這里設(shè)置的是4
mysql> set global slave_parallel_workers=4;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'slave_parallel_workers';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| slave_parallel_workers | 4 |
+------------------------+-------+
1 row in set (0.01 sec)
4喳瓣、配置從庫(kù)回放順序
slave_preserve_commit_order 參數(shù)在多線程復(fù)制環(huán)境下馋贤,能夠保證從庫(kù)回放relay log事務(wù)的順序與這些事務(wù)在relay log中的順序完全一致,也就是與主庫(kù)提交的順序完全一致畏陕。
舉個(gè)例子配乓,開啟并行復(fù)制后,如果relay log中有3個(gè)事務(wù)A,B,C惠毁,他們?cè)趓elay log中的順序是A->B->C犹芹,而它們的last_commited相同,也就是說他們可以并行回放鞠绰,那么在從庫(kù)上腰埂,這3個(gè)事務(wù),提交的順序可能就不再是A->B->C蜈膨,設(shè)置slave_preserve_commit_order=ON屿笼,能夠保證這3個(gè)事務(wù),在從庫(kù)回放時(shí)丈挟,仍然按照它們?cè)趓elay log中的順序來(lái)回放刁卜,保證從庫(kù)回放relay log事務(wù)的順序與主庫(kù)完全相同。
slave_preserve_commit_order:
作用范圍:Global
動(dòng)態(tài)修改:Yes曙咽,修改時(shí)需要停止SQL線程
默認(rèn)值:OFF
該參數(shù)起作用的前提條件是開啟多線程復(fù)制:
slave_parallel_type=LOGICAL_CLOCK
slave_parallel_workers>0
在 8.0.18 及之前版本蛔趴,從庫(kù)只有開啟binlog的兩個(gè)參數(shù)(log_bin,log_slave_updates)例朱,才能設(shè)置slave_preserve_commit_order=ON孝情,而 8.0.19 版本開始鱼蝉,這個(gè)前提條件不再需要了。
設(shè)置slave_preserve_commit_order=ON箫荡,當(dāng)一個(gè)線程等待其他線程的事務(wù)提交時(shí)魁亦,會(huì)出現(xiàn)一個(gè)狀態(tài)信息,在一個(gè)寫入量較大的主從復(fù)制集群中羔挡,在從庫(kù)上執(zhí)行show processlist可以看到這個(gè)狀態(tài)信息洁奈,如下:
Waiting for preceding transaction to commit
5、設(shè)置事件所需的內(nèi)存大小
mysql> set global slave_pending_jobs_size_max= 536970912;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show variables like '%slave_pending_jobs_size_max%';
+-----------------------------+-----------+
| Variable_name | Value |
+-----------------------------+-----------+
| slave_pending_jobs_size_max | 536970240 |
+-----------------------------+-----------+
1 row in set (0.01 sec)
從庫(kù)回放線程的時(shí)間內(nèi)存大小默認(rèn)為16M绞灼,這個(gè)參數(shù)不一定非要修改利术,但是一定要大于主庫(kù)設(shè)置的max_allowed_packet。
負(fù)責(zé)我們放回時(shí)可能就會(huì)報(bào)錯(cuò)低矮,具體參考下面的報(bào)錯(cuò)信息
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1864
Last_Error: Cannot schedule event Write_rows, relay-log name ./mysql-relay-bin.001304, position 416228895 to Worker thread because its size 16777357 exceeds 16777216 of slave_pending_jobs_size_max.
6印叁、統(tǒng)一配置文件
以上參數(shù),全部可以在從庫(kù)的配置文件中添加上军掂,然后重啟數(shù)據(jù)庫(kù)
slave_parallel_type= LOGICAL_CLOCK
slave_parallel_workers= 4
slave_preserve_commit_order= 1
slave_pending_jobs_size_max= 536870912
log_slave_updates =1