一般而言,slave相對master延遲較大,其根本原因就是slave上的復(fù)制線程沒辦法真正做到并發(fā)。簡單說,在master上是并發(fā)模式(以InnoDB引擎為主)完成事務(wù)提交的,而在slave上,復(fù)制線程只有一個sql thread用于binlog的apply,所以難怪slave在高并發(fā)時會遠落后master。
ORACLE MySQL 5.6版本開始支持多線程復(fù)制,配置選項 slave_parallel_workers 即可實現(xiàn)在slave上多線程并發(fā)復(fù)制。不過,它只能支持一個實例下多個 database 間的并發(fā)復(fù)制,并不能真正做到多表并發(fā)復(fù)制。因此在較大并發(fā)負載時,slave還是沒有辦法及時追上master,需要想辦法進行優(yōu)化。
另一個重要原因是,傳統(tǒng)的MySQL復(fù)制是異步(asynchronous)的,也就是說在master提交完后,才在slave上再應(yīng)用一遍,并不是真正意義上的同步。哪怕是后來的Semi-sync Repication(半同步復(fù)制),也不是真同步,因為它只保證事務(wù)傳送到slave,但沒要求等到確認事務(wù)提交成功。既然是異步,那肯定多少會有延遲。因此,嚴格意義上講,MySQL復(fù)制不能叫做MySQL同步(處女座的面試官有可能會在面試時把說成MySQL同步的一律刷掉哦)。
另外,不少人的觀念里,slave相對沒那么重要,因此就不會提供和master相同配置級別的服務(wù)器。有的甚至不但使用更差的服務(wù)器,而且還在上面跑多實例。
綜合這兩個主要原因,slave想要盡可能及時跟上master的進度,可以嘗試采用以下幾種方法:
1、采用MariaDB發(fā)行版,它實現(xiàn)了相對真正意義上的并行復(fù)制,其效果遠比ORACLE MySQL好的很多。在我的場景中,采用MariaDB作為slave的實例,幾乎總是能及時跟上master。如果不想用這個版本的話,那就老實等待官方5.7大版本發(fā)布吧;
關(guān)于MariaDB的Parallel Replication具體請參考:Replication and Binary Log Server System Variables#slave_parallel_threads 主站蜘蛛池模板: 南澳县| 宁陕县| 手机| 东源县| 天津市| 伊川县| 仁怀市| 达孜县| 湖南省| 那曲县| 阳高县| 红安县| 那曲县| 英山县| 闽侯县| 古浪县| 宜都市| 青浦区| 祁连县| 遂平县| 东辽县| 江川县| 龙泉市| 沾益县| 朔州市| 江西省| 扶风县| 静安区| 鄄城县| 忻城县| 凤翔县| 罗山县| 安化县| 祁东县| 遂宁市| 三台县| 九龙城区| 囊谦县| 乌拉特前旗| 广饶县| 大厂|