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