MySQL內建的複製功能是建立大型、高效能應用程式的基礎。將MySQL的資料分散到多個系統上去,這種分散式的機制,是透過將MySQL的某一台主機的數據,複製到其他的主機slaves上,並重新執行一邊來實現。
複製過程中,一個伺服器充當主伺服器,而一個或多個其他伺服器充當從伺服器。主伺服器將更新寫入二進位日誌文件,並維護文件的一個索引,以追蹤日誌循環。這些日誌可以記錄傳送到從伺服器的更新。當一個從伺服器連接到主伺服器時,它通知主伺服器,從伺服器在日誌中讀取的最後一次成功更新的位置。從伺服器接收從那時發生的任何更新,然後封鎖並等待主伺服器通知更新。
mysql主從複製存在的問題:
#回答:談到MySQL資料庫主從同步延遲原理,得從mysql的資料庫主從複製原理說起,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卡主了,需要執行10分鐘,那麼所有之後的DDL會等待這個DDL執行完才會繼續執行,這就導致了延遲。有朋友會問:“主庫上那個相同的DDL也需要執行10分,為什麼slave會延時?”,答案是master可以並發,Slave_SQL_Running線程卻不可以。
#答:當主函式庫的TPS並發較高時,產生的DDL數量超過slave一個sql執行緒所能承受的範圍,那麼延時就產生了,當然還有就是可能與slave的大型query語句產生了鎖等待。
答:最簡單的減少slave同步延遲的方案就是在架構上做最佳化,盡量讓主函式庫的DDL快速執行。還有主函式庫是寫,對資料安全性較高,例如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之類的設置,而slave則不需要這麼高的資料安全,完全可以講sync_binlog設定為0或關閉binlog, innodb_flushlog也可以設定為0來提高sql的執行效率。另外就是使用比主庫更好的硬體設備作為slave。
#1. 網路延遲
2. master負載
3. slave負載
一般的做法是,使用多台slave來分攤讀請求,再從這些slave中取一台專用的伺服器,只作為備份用,不進行其他任何操作,就能相對最大限度地達到'實時'的要求了
另外,再介紹2個可以減少延遲的參數
–slave-net-timeout=seconds
參數意義:當slave從主資料庫讀取log資料失敗後,等待多久重新建立連線並取得資料
slave_net_timeout單位為秒 預設為 3600秒
| slave_net_timeout | 3600
#–master-connect-retry=seconds
#
參數意義:當重新建立主從連線時,如果連線建立失敗,間隔多久後重試。
master-connect-retry單位為秒 預設為 60秒
通常配置以上2個參數可以減少網路問題導致的主從資料同步延遲
以上是如何解決mysql主從延遲的詳細內容。更多資訊請關注PHP中文網其他相關文章!