mysql資料一致性和副本複製 part1

2021-07-03 17:31:30 字數 3010 閱讀 4563

以mysql(innodb)作為例項,討論一下mysql(innodb)在資料儲存一致性和副本複製方面的一些實現機制。由於不是專門從事mysql相關的研發和運維工作,本文主要是依據公開的資料並結合一些實際使用經驗**innodb儲存引擎,如有謬誤,歡迎指出。

mysql作為資料儲存軟體的一種實現,必然要滿足規定的資料儲存一致性要求,同時作為乙個廣泛使用的資料儲存軟體,在可靠性、可用性以及效能方面也必須表現良好,這離不開資料複製。

注意:本文所討論的「一致性」其含義不同於acid模型中的consistency特性,預設情況下本文中的「一致性」特指資料儲存一致性,當提及的是acid模型中的consistency(一致性)時用黑體加粗標識。

1、資料儲存一致性

mysql(innodb)和眾多資料庫有乙個共同特性即均支援acid事務模型,acid用於保證資料庫事務被可靠的處理。在資料庫上下文環境中,事務是指對資料所做的乙個單一的邏輯操作,它強調的是操作在邏輯概念上的單一性,而在實際實現時可能會被分解成多個具體的操作步驟。比如從乙個銀行賬戶轉賬到另乙個賬戶,這是乙個單一的事務,但涉及到記入和記出等多個變更操作。

1.1 acid模型

(1)atomicity(原子性):乙個事務中所包含的多個操作步驟是乙個不可分割的執行單元,要麼全部正常執行,要麼乙個也沒執行,不存在部分操作成功或部分操作失敗的狀態。

(2)consistency(一致性):乙個事務應確保資料庫從一種有效狀態轉變到另一種有效的狀態,有效狀態是指寫入到資料庫中的任何資料必須符合所有定義的規則,包括:約束條件(constraints)、級聯規則(cascades)、觸發器(triggers)以及其它組合規則。

(3)isolation(隔離性):決定乙個事務的完整性是如何被其它事務或其它操作所感知,是資料庫併發控制要達到的主要目標(資料一致性要求)。

(4)durability(永續性):一旦乙個事務完成,其執行結果應被持久化儲存,即便隨後發生斷電、崩潰等突發性故障。

1.2 隔離級別

(1)read uncommitted(讀未提交):允許髒讀,事務可以看到其它事務尚未提交的變更,該隔離級別實際中無意義,只存在理論中。

(2)read committed(讀提交):僅保證事務讀到的任何資料均是已經被其它事務提交過的,存在不可重複讀的現象(只是現象,不是問題)。

(3)repeatable read(可重複讀):僅保證事務可以做到重複讀,存在幻讀現象(因為沒有強制要求對讀操作增加range locks)。

(4)serializable(序列化):序列化執行事務,該隔離級別實際中無意義,只存在理論中。

在acid模型中和資料儲存一致性直接相關的就是隔離性,它決定了併發控制的目標,而併發控制的目標實質上就是實現某種資料儲存一致性。隔離性描述資料庫是如何解決併發程序在訪問資料庫時出現的競爭問題(race conditions)。在傳統的教科書中通常會把隔離性的含義描述成類似serializability,這樣事務就好像是乙個接乙個的執行,併發問題就不會出現。但是在隔離性的實際實現中,序列化很少被使用,這是出於可用性和效能的的考慮。acid模型和效能(高併發)之間是相互衝突的,資料庫通過提供可選的隔離性在效能和安全性之間進行折中,較弱的隔離性響應速度更快但是也會帶來更多的潛在的併發競爭衝突。在innodb中,預設的隔離級別是repeatable read,innodb使用nextkeylock來解決幻讀問題,使得資料一致性效果上等同於序列化而又不失併發的粒度和效能。

1.3 mvcc (multi-version concurrency control)

innodb在實現acid事務模型時使用了多版本併發控制(mvcc)技術來減少鎖的使用,以提高併發量、吞吐量和效能,顯然這是以降低資料一致性的強度作為代價的。innodb通過把mvcc和鎖機制等結合起來共同實現acid模型中的隔離性要求。mvcc使得使用者程序能夠看到資料庫在某個時間點的一致性狀態(這裡指滿足資料庫規則的快照資料),即使其它併發程序已經修改了資料庫,這是通過保留資料行的舊版本來實現的。當更新一行時,如果仍有事務需要讀取該行,則舊版本的行將被保留。mvcc只工作在read committed和repeatable read級別,在不同的隔離級別下mvcc工作模式也不相同。

如上所述,innodb採用mvcc機制來實現事務的隔離性,mvcc的基本思想是為不同的事務儲存其當時資料的快照(稱為「版本」),它既能保證事務內資料的一致性,又避免了鎖的大量使用,從而提公升了效能和併發度。innodb中的mvcc機制在邏輯上實際為每行資料建立了兩個版本:建立版本(insert)和過期版本(delete);但在實現時並不是如此的直觀,而是從undo 日誌中找到一行資料的建立版本和多個歷史過期版本。innodb對每一資料行(聚簇索引葉子節點)都會增加三個額外欄位和乙個刪除標記位:data_trx_id、data_roll_ptr、db_row_id、delete bit。其中,6位元組的data_trx_id標記了最新更新行記錄的transaction id;7位元組的data_roll_ptr是回滾指標,指向當前行記錄的undo資訊,找之前版本的資料就是通過這個指標,undo日誌中的記錄(行)儲存了舊的db_trx_id 和db_roll_ptr,可能指向更久之前的事務和undo日誌記錄。delete bit位用於標識該記錄是否被刪除;6位元組的db_row_id單調非遞減,當表中沒有可用的聚簇索引時,會將其作為聚簇索引。

在innodb預設的「repeatable read」隔離級別下,當執行各類sql命令時mvcc機制的工作方式如下(如未特別指明,以下所說的行均指聚簇索引中的行記錄,在這裡不討論執行sql命令時二級索引的變化情況,以免過於龐雜):

(1)insert:innodb使用db當前版本號作為新增行的版本號(建立版本)。

(2)delete

資料一致性

資料一致性通常指關聯資料之間的邏輯關係是否正確和完整。而資料儲存的一致性模型則可以認為是儲存系統和資料使用者之間的一種約定。如果使用者遵循這種約定,則可以得到系統所承諾的訪問結果。常用的一致性模型有 a 嚴格一致性 linearizability,strict atomic consistency ...

資料一致性

丟失更新 未確定的相關性 不一致的分析和幻想讀 事務a讀取與搜尋條件相匹配的若干行。事務b以插入或刪除行等方式來修改事務a的結果集,然後再提交。幻讀是指當事務不是獨立執行時發生的一種現象,例如第乙個事務對乙個表中的資料進行了修改,比如這種修改涉及到表中的 全部資料行 同時,第二個事務也修改這個表中的...

資料一致性

資料一致性通常指關聯資料之間的邏輯關係是否正確和完整。而資料儲存的一致性模型則可以認為是儲存系統和資料使用者之間的一種約定。如果使用者遵循這種約定,則可以得到系統所承諾的訪問結果。常用的一致性模型有 a 嚴格一致性 linearizability,strict atomic consistency ...