## **MySQL主從復制**

### **主從復制原理:**
(1)master服務器將數據的改變記錄二進制binlog日志,當master上的數據發生改變時,則將其改變寫入二進制日志中;
(2)slave服務器會在一定時間間隔內對master二進制日志進行探測其是否發生改變,如果發生改變,則開始一個I/OThread請求master二進制事件
(3)同時主節點為每個I/O線程啟動一個dump線程,用于向其發送二進制事件,并保存至從節點本地的中繼日志中,從節點將啟動SQL線程從中繼日志中讀取二進制日志,在本地重放,使得其數據和主節點的保持一致,最后I/OThread和SQLThread將進入睡眠狀態,等待下一次被喚醒。
### **也就是說:**
* 從庫會生成兩個線程,一個I/O線程,一個SQL線程;
* I/O線程會去請求主庫的binlog,并將得到的binlog寫到本地的relay-log(中繼日志)文件中;
* 主庫會生成一個log dump線程,用來給從庫I/O線程傳binlog;
* SQL線程,會讀取relay log文件中的日志,并解析成sql語句逐一執行;
### **主從復制延遲解決方案:**
> Mysql 主從同步都是單線程的, master所有的`DDL`和`DML`都會寫入`binlog`中, 由于`binlog`是順序讀寫, 所以效率很高, slave的`sql Thread`將master的`DDL`和`DML`操作事件都在slave中重發.`DDL`和`DML`的IO操作是隨機的, 不是順序的, 所以成本要高很多, 另一方面由于`SQL Thread`也是單線程, 當master并發高的時候,產生的`DML`數量超出了slave`SQL Thread`的處理速度, 或者當slave有大型的query語句產生了鎖, 那么延遲就產生了.
**解決方案:**
* 1. 業務的持久化層的實現采用分庫架構, mysql服務器可以平行擴展, 分散壓力
* 2. 單個主庫, 多個從庫, 主寫從讀
* 3. 服務的基礎架構在業務層和持久化層間加入`memcache`或者`redis`構成的cache層. 降低mysql的讀寫壓力
* 4. 不同的業務的mysql放在不同的物理機上,分散壓力
* 5. 使用更加好的硬件設備
* 6. mysql5.7 之后使用`MTS`并發復制技術, 永久解決復制延遲問題
- PHP篇
- 函數傳值和傳引用的區別
- 簡述PHP的垃圾回收機制
- 簡述CGI、FAST-CGI、PHP-FPM的關系
- 常見正則表達式
- 多進程寫文件,如何保證都寫成功
- php支持回調函數的數組函數
- MySQL篇
- MySQL的兩種存儲引擎區別
- 事務的四大特性
- 數據庫事務隔離級別
- 什么是索引
- 索引有哪些數據結構,優缺點
- 索引的一些潛規則
- SQL的優化方案
- 簡述MySQL的鎖機制
- 死鎖是怎么產生的?怎么解決?
- 簡述MySQL的主從復制過程,延遲問題怎么解決
- 分布式事務的解決方案
- 數據庫中間件MyCat
- Linux篇
- Linux常用命令
- 對日志文件的IP出現的次數進行統計,并顯示次數最多的前5名
- WEB篇
- 跨域是怎么產生的,如何解決跨域
- Redis篇
- redis介紹
- redis和memcached區別
- redis的持久化方案
- 緩存穿透、擊穿、雪崩、預熱、更新、降級
- 網絡篇
- 計算機網絡體系結構
- 簡述TCP的三次握手、四次揮手過程
- UDP、TCP 區別,適用場景
- HTTP常見狀態碼含義
- 設計模式篇
- 單例模式
- 簡單工廠模式
- 抽象工廠模式
- 觀察者模式
- 策略模式
- 注冊模式
- 適配器模式
- 安全篇
- 跨站腳本攻擊(XSS)
- 跨站點請求偽造(CSRF)
- SQL 注入
- 應用層拒絕服務攻擊
- PHP安全
- 運維篇
- docker面試題
- 消息隊列篇
- 架構篇
- 數據結構與算法篇