讀寫分離最全詳解(圖文全面總結(jié))
讀寫分離
讀寫分離是一種常見的數(shù)據(jù)庫架構(gòu)設計,從字面上就很容易理解,就是數(shù)據(jù)的:“讀”、和“寫”分離。
如下圖所示:
圖片
寫操作(包括:插入、更新和刪除操作...等等),由主數(shù)據(jù)庫(Master)處理。
而讀操作(包括:查詢...等操作),由從數(shù)據(jù)庫(Slave)處理。
這就是“讀寫分離”,通過將讀操作分散到多個從數(shù)據(jù)庫上,減少主數(shù)據(jù)庫的負載,從而,極大的提升整個系統(tǒng)的并發(fā)處理能力。
讀寫分離實現(xiàn)原理
上面我們談了“讀寫分離”的價值,對于互聯(lián)網(wǎng)應用“讀多”和“寫少”的場景,比如:電商等典型業(yè)務是非常適用的。
知道了其重要性,下面我接著談:如何來實現(xiàn)”讀寫分離“?
讀寫分離的架構(gòu)實現(xiàn),整體如下圖所示:
圖片
從上圖可看出,讀寫分離是基于:“主從復制架構(gòu)”來實現(xiàn)的。
- 主數(shù)據(jù)庫:負責處理所有的寫操作(比如:插入、更新、刪除...)。
- 從數(shù)據(jù)庫:通過復制機制從主數(shù)據(jù)庫獲取并應用數(shù)據(jù)更改,處理所有的讀操作。
通過上面的講述,知道了實現(xiàn)機制依賴于“主從復制”。
所以,要掌握好讀寫分離的原理,還需要掌握“主從復制”的實現(xiàn)機制原理。
下面,我接著談@mikechen
我以MySQL的主從復制為例,整體架構(gòu)實現(xiàn),如下圖所示:
圖片
實現(xiàn)步驟,大致分為如下幾點:
第一步:主數(shù)據(jù)庫記錄二進制日志(binlog);
比如:當主數(shù)據(jù)庫執(zhí)行寫操作,比如:INSERT、UPDATE、DELETE。。。等操作時,首先,這些操作會被記錄到二進制日志中。
MySQL 二進制日志(Binlog):是 MySQL 服務器用來記錄所有更改數(shù)據(jù)庫數(shù)據(jù)操作的日志文件,包括 DDL 語句和 DML 語句。
[mysqld]
log-bin=mysql-bin # 啟用二進制日志并指定日志文件前綴
server-id=1 # 設置服務器唯一 ID
binlog-format=row # 設置 Binlog 格式(row、statement、mixed)
expire-logs-days=7 # 自動清除超過7天的 Binlog 文件
max_binlog_size=100M # 單個 Binlog 文件的最大大小
所有數(shù)據(jù)更改的詳細信息,都放在這個二進制文件中,是主從復制的核心。
第二步:從數(shù)據(jù)庫讀取二進制日志(binlog);
從數(shù)據(jù)庫通過I/O線程,連接到主數(shù)據(jù)庫,讀取主數(shù)據(jù)庫的二進制日志,并將其保存到本地的中繼日志(relay log)中。
大致流程:
- I/O線程啟動:從數(shù)據(jù)庫上的I/O線程,使用專用的復制用戶連接到主數(shù)據(jù)庫;
- 讀取二進制日志:I/O線程讀取主數(shù)據(jù)庫的二進制日志,將其內(nèi)容寫入到從數(shù)據(jù)庫的中繼日志中;
- 日志同步:I/O線程不斷地從主數(shù)據(jù)庫讀取新的二進制日志,并更新到中繼日志中。
第三步:從數(shù)據(jù)庫應用中繼日志(relay log)。
從數(shù)據(jù)庫的SQL線程讀取中繼日志,并重放其中的寫操作,更新從數(shù)據(jù)庫中的數(shù)據(jù)。
這樣,從數(shù)據(jù)庫的數(shù)據(jù)狀態(tài)就會逐步跟上主數(shù)據(jù)庫。
通過以上步驟,主從復制實現(xiàn)了主數(shù)據(jù)庫與從數(shù)據(jù)庫之間的數(shù)據(jù)同步,從而可以實現(xiàn)讀寫分離了。
讀寫分離總結(jié)
總之,讀寫分離是提升數(shù)據(jù)庫性能和擴展性的有效手段,通過將讀操作分散到多個從數(shù)據(jù)庫上,可以顯著提高系統(tǒng)的并發(fā)處理能力、和響應速度。