天天看點

mysql主從延遲原理一、mysql主從同步原理二、主從同步延遲産生原因三、主從同步延遲解決方案

一、mysql主從同步原理

  主庫針對讀寫操作,順序binlog,從庫單線程去主庫讀“寫操作的binlog”,從庫取到binlog在本地原樣執行(随機寫),來保證主從資料邏輯上一緻。

  mysql的主從複制都是單線程的操作,主庫對所有DDL和DML産生binlog,binlog是順序寫,是以效率很高,slave的Slave_IO_Running線程到主庫取日志,效率比較高,下一步問題來了,slave的slave_sql_running線程将主庫的DDL和DML操作在slave實施。DML,DDL的IO操作是随機的,不能順序的,成本高很多,還又跨年slave上的其他查詢産生lock,由于slave_sql_running也是單線程的,是以一個DDL卡住了,需要執行一段時間,那麼所有之後的DDL會等待這個DDL執行完才會繼續執行,這就導緻了延遲。

  由于master可以并發,Slave_sql_running線程卻不可以,是以主庫執行DDL需求一段時間,在slave執行相同的DDL時,就産生了延遲。

二、主從同步延遲産生原因

  當主庫的TPS并發較高時,産生的DDL數量超過Slave一個sql線程所能承受的範圍,那麼延遲就産生了,當然還有跨年與slave的大型query語句産生了鎖等待

  首要原因:資料庫在業務上讀寫壓力太大,CPU計算負荷大,網卡負荷大,硬碟随機IO太高

  次要原因:讀寫binlog帶來的性能影響,網絡傳輸延遲

三、主從同步延遲解決方案

  架構方面:

  1.業務的持久化層的實作采用分庫架構,mysql服務可平行擴充分散壓力

  2.單個庫讀寫分離,一主多從,主寫從讀,分散壓力

  3.服務的基礎架構在業務和mysql之間加放cache層

  4.不同業務的mysql放在不同的機器

  5.使用比主庫更好的硬體裝置作slave

  反正就是mysql壓力變小,延遲自然會變小

  硬體方面:采用好的伺服器

  mysql主從同步加速:

  1.sync_binlog在slave端設定為0

  2.-logs-slave-updates 從伺服器從主伺服器接收到的更新不記入它的二進制日志

  3.直接禁用slave端的binlog

  4.slave端,如果使用的存儲引擎是innodb,innodb_flush_log_at_trx_commit=2