刷盤,還是不刷盤,是一個(gè)問題 | 架構(gòu)師之路重啟
前幾個(gè)有個(gè)朋友留言,問我說最近兩年公號(hào)發(fā)讀書感悟,職場(chǎng)感悟,AI實(shí)踐居多了,發(fā)架構(gòu)思路類的內(nèi)容少了。
最近準(zhǔn)備重啟架構(gòu)思路類的內(nèi)容,且會(huì)保持一如既往的風(fēng)格:
- 希望引發(fā)大家思考,多討論,多互動(dòng);
- 核心原理通俗化描述,目標(biāo)是讓所有人搞懂;
- 思路,比結(jié)論重要;
本篇源自我去年看到的一篇關(guān)于ARIES算法的論文,作為重啟后的第一篇,算是一個(gè)引子,希望大伙多多支持。
畫外音:去掉了論文里復(fù)雜的概念、算法及公式,加入了相關(guān)概念的補(bǔ)充解釋說明與架構(gòu)思考與補(bǔ)充。
讓我們來看數(shù)據(jù)庫中一個(gè)典型的讀寫事務(wù)的場(chǎng)景。
事務(wù)T1:
- 開始事務(wù)
- 讀取記錄A的值(假設(shè)A=1)
- 修改記錄A的值(假設(shè)修改為2)
- 提交事務(wù)
這里面可能涉及哪些技術(shù)問題呢?
問題一,數(shù)據(jù)庫如何讀取記錄A的值?
相關(guān)技術(shù)點(diǎn):
- 數(shù)據(jù)庫使用緩沖池(buffer pool)機(jī)制提升讀寫效率;
- 數(shù)據(jù)庫以數(shù)據(jù)頁(page)為單位管理緩沖池;
- 如果被讀取的數(shù)據(jù)在緩沖池中,直接從緩沖池中讀取數(shù)據(jù);
- 否則,先將磁盤上的數(shù)據(jù)復(fù)制到緩沖池,再?gòu)木彌_池中讀取數(shù)據(jù);
此例中,假設(shè)記錄存儲(chǔ)在一個(gè)單頁上,且事先不在緩沖池中,故數(shù)據(jù)頁會(huì)被復(fù)制到緩沖池。
問題二,數(shù)據(jù)庫如何寫入記錄A的值?
相關(guān)技術(shù)點(diǎn):
- 數(shù)據(jù)庫直接修改緩沖池中的數(shù)據(jù);
- 緩沖池中的數(shù)據(jù)不能實(shí)時(shí)刷回磁盤,畢竟事務(wù)還沒有提交;
此例中,緩沖池中的數(shù)據(jù)被修改為2,磁盤上的數(shù)據(jù)仍是1(如上圖)。
那么,問題來了,如果緩沖池滿了,要將哪些數(shù)據(jù)刷回磁盤呢?
原則上,得做到:
- 如果事務(wù)未提交,“臟”數(shù)據(jù)不會(huì)被刷回磁盤;
- 如果事務(wù)已提交,數(shù)據(jù)會(huì)被刷回磁盤。
數(shù)據(jù)庫的故障恢復(fù)系統(tǒng)(crash recovery system)也會(huì)面臨類似的問題,在數(shù)據(jù)庫崩潰,內(nèi)存中數(shù)據(jù)丟失的時(shí)候,未提交的事務(wù)和已提交的事務(wù),如何保證ACID特性?
再來看一個(gè)并發(fā)的事務(wù)T1和T2的復(fù)雜場(chǎng)景:
T1.1. 開始事務(wù)
T1.2. 讀取記錄A的值(假設(shè)A=1)
T1.3. 修改記錄A的值(假設(shè)修改為2)
T2.1開始事務(wù)
T2.2讀取記錄B的值(假設(shè)B=3)
T2.3修改記錄B的值(假設(shè)修改為7)
T2.4提交事務(wù)
T1.4.回滾事務(wù)
假設(shè),記錄A和記錄B都在一個(gè)數(shù)據(jù)頁上。
事務(wù)T1讀取記錄A的值,會(huì)將磁盤上的數(shù)據(jù)頁復(fù)制到緩沖池,再進(jìn)行讀?。ㄈ缟蠄D)。
事務(wù)T1修改記錄A的值,會(huì)直接修改緩沖池中的數(shù)據(jù)(如上圖)。
好,這個(gè)時(shí)候,事務(wù)T2啟動(dòng)了。
事務(wù)T2先讀取記錄B的值,緩沖池中已經(jīng)存在記錄B所在的頁,所以無需進(jìn)行磁盤訪問。
畫外音:緩沖池的核心作用,提高讀寫性能。
接下來,事務(wù)T2修改記錄B的值,會(huì)直接修改緩沖池中的數(shù)據(jù)(如上圖)。
接下來,事務(wù)T2提交了。
這個(gè)時(shí)刻,我們面臨一個(gè)巨大的難題:在數(shù)據(jù)庫返回應(yīng)用程序事務(wù)成功之前,要不要將數(shù)據(jù)刷回磁盤?
如果不將數(shù)據(jù)刷回磁盤,就返回應(yīng)用程序事務(wù)成功,那么萬一數(shù)據(jù)庫故障,緩沖池中的數(shù)據(jù)丟失,事務(wù)T2的ACID特性就會(huì)被破壞。
反之,如果將數(shù)據(jù)刷回磁盤,但此時(shí)事務(wù)T1還沒有提交/回滾,事務(wù)T1的臟數(shù)據(jù)刷回磁盤,事務(wù)T1的ACID特性也會(huì)被破壞。
我們似乎陷入了一個(gè)兩難的境地。如果是你,你會(huì)考慮用什么思路解決這個(gè)問題呢?
總結(jié)與思考:
- 數(shù)據(jù)庫使用緩沖池(buffer pool)機(jī)制提升讀寫效率;
- 數(shù)據(jù)庫以數(shù)據(jù)頁(page)為單位管理緩沖池;
- 數(shù)據(jù)庫直接讀寫緩沖池中的數(shù)據(jù);
- 此情況,刷盤,還是不刷盤?