久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

SequoiaDB 分布式事務(wù)實(shí)現(xiàn)原理是什么

共計(jì) 3761 個(gè)字符,預(yù)計(jì)需要花費(fèi) 10 分鐘才能閱讀完成。

這篇文章將為大家詳細(xì)講解有關(guān) SequoiaDB 分布式事務(wù)實(shí)現(xiàn)原理是什么,文章內(nèi)容質(zhì)量較高,因此丸趣 TV 小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

1

分布式事務(wù)背景

隨著分布式數(shù)據(jù)庫技術(shù)的發(fā)展越來越成熟,業(yè)內(nèi)對(duì)于分布式數(shù)據(jù)庫的要求也由曾經(jīng)只用滿足解決海量數(shù)據(jù)的存儲(chǔ)和讀取這類邊緣業(yè)務(wù)向核心交易業(yè)務(wù)轉(zhuǎn)變。分布式數(shù)據(jù)庫如果要滿足核心賬務(wù)類交易需求,則其需要完善分布式事務(wù),向傳統(tǒng)關(guān)系型數(shù)據(jù)庫看齊。即分布式事務(wù)的實(shí)現(xiàn)也需要像傳統(tǒng)關(guān)系型數(shù)據(jù)庫的事務(wù)一樣滿足事務(wù)的標(biāo)準(zhǔn)要求及定義,即 ACID 特征。

分布式數(shù)據(jù)庫的數(shù)據(jù)是進(jìn)行多機(jī)器多節(jié)點(diǎn)分散存儲(chǔ)的,這樣的存儲(chǔ)架構(gòu)為實(shí)現(xiàn)分布式事務(wù)帶來了極大的難度。數(shù)據(jù)事務(wù)操作時(shí),事務(wù)操作會(huì)結(jié)合數(shù)據(jù)分布情況,到不同的存儲(chǔ)位置上去執(zhí)行,而這個(gè)存儲(chǔ)位置位于網(wǎng)絡(luò)中的不同機(jī)器的不同磁盤上。

2

事務(wù)基本概念

2.1 事務(wù)使用場景

銀行應(yīng)用是一個(gè)經(jīng)典案例,可以解釋事務(wù)應(yīng)用的必要性。假設(shè)銀行數(shù)據(jù)庫有兩張表,支票賬戶表(check)和存款賬戶表(save)。現(xiàn)在要從 LiLei 的支票賬戶里轉(zhuǎn)賬 200 元到她的存款賬戶,那么需要至少完成 3 步操作:

1. 檢查支票存款賬戶的余額是否大于 200 元;

2. 從支票存款賬戶余額中減去 200 元;

3. 在存款賬戶余額中增加 200 元;

所有的操作被打包在一個(gè)事務(wù)里執(zhí)行,如果某一步失敗,就回滾所有已完成步驟。事務(wù)操作一般用  START TRANSACTION  語句開始一個(gè)事務(wù),用  COMMIT  語句提交整個(gè)事務(wù),永久地修改數(shù)據(jù),或者用  ROLLBACK  語句回滾整個(gè)事務(wù),取消已做的修改。事務(wù) SQL 操作樣例如下:

START TRANSACTION;SELECT balance FROM check WHERE customer_id = 10233276 ; UPDATE check SET balance = balance - 200.00 WHERE customer_id = 10233276; UPDATE save SET balance = balance + 200.00 WHERE customer_id = 10233276; COMMIT;

此為銀行對(duì)于轉(zhuǎn)賬類的交易所必須使用的事務(wù)操作場景,而在實(shí)際的生產(chǎn)環(huán)境中,事務(wù)操作的復(fù)雜度比這復(fù)雜得多。

2.2 事務(wù)概念和特性

事務(wù)是訪問及操作數(shù)據(jù)庫各類數(shù)據(jù)項(xiàng)的操作序列集合,如各類增刪改查 SQL 操作組合。它通常由 begin transaction 和 end transaction 語句來界定。

數(shù)據(jù)庫系統(tǒng)的事務(wù)需包含以下特性:

原子性(Atomicity):事務(wù)的所有操作在數(shù)據(jù)庫中要么全部執(zhí)行成功,要么全部執(zhí)行失敗。

一致性(Correspondence):事務(wù)操作前后,數(shù)據(jù)的完整性必須保持一致。

隔離性(Isolation):多個(gè)用戶并發(fā)訪問數(shù)據(jù)庫時(shí),數(shù)據(jù)庫為每個(gè)用戶開啟事務(wù),不能被其他事務(wù)的操作數(shù)據(jù)所干擾。即每個(gè)事務(wù)都感覺不到系統(tǒng)中有其他事務(wù)在并發(fā)地執(zhí)行。

持久性(Durability):一個(gè)事務(wù)成功完成后,它對(duì)數(shù)據(jù)庫的改變必須是永久的,即使出現(xiàn)系統(tǒng)故障也不會(huì)對(duì)事務(wù)有影響。

事務(wù)隔離級(jí)別

針對(duì)事務(wù)隔離,SQL 標(biāo)準(zhǔn)定義了 4 類隔離級(jí)別,包括了一些具體規(guī)則,用來限定事務(wù)內(nèi)外的哪些改變是可見的,哪些是不可見的。下面介紹四種隔離級(jí):

READ UNCOMMITTED(讀取未提交內(nèi)容)

在 READ UNCOMMITTED 隔離級(jí)別,所有事務(wù)都可以“看到”未提交事務(wù)的執(zhí)行結(jié)果。讀取未提交數(shù)據(jù),也被稱之為“臟讀”。

READ COMMITTED(讀取提交內(nèi)容)

大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認(rèn)隔離級(jí)是 read committed。它滿足了隔離的早先單定義:一個(gè)事務(wù)在開始時(shí),只能“看見”已經(jīng)提交事務(wù)所做的改變,一個(gè)事務(wù)從開始到提交前,所做的任何數(shù)據(jù)改變都是不可見的,除非已經(jīng)提交。此隔離級(jí)別不支持“可重復(fù)讀”的操作。這意味著用戶運(yùn)行同一語句兩次,看到的結(jié)果是不同的。

REPEATABLE READ(可重讀)

REPEATABLE READ 隔離級(jí)解決了 READ UNCOMMITTED 隔離級(jí)導(dǎo)致的問題。它確保同一事務(wù)的多個(gè)實(shí)例在并發(fā)讀取數(shù)據(jù)時(shí),會(huì)“看到同樣的”數(shù)據(jù)行。不過理論上,這會(huì)導(dǎo)致另一個(gè)棘手問題:幻讀(Phantom Read)。簡單來說,幻讀指當(dāng)用戶讀取某一范圍的數(shù)據(jù)行時(shí),另一個(gè)事務(wù)又在該范圍內(nèi)插入了新行,當(dāng)用戶再讀取該范圍的數(shù)據(jù)行時(shí),會(huì)發(fā)現(xiàn)有新的“幻影”行。數(shù)據(jù)庫存儲(chǔ)引擎可以通過多版本并發(fā)控制 (Multiversion Concurrency Control)機(jī)制解決了幻讀問題,如 MySQL 的 InnoDB 和 Falcon。

SERIALIZABLE (可串行化)

SERIALIZABLE 是最高級(jí)別的隔離級(jí),它通過強(qiáng)制事務(wù)排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,SERIALIZABLE 是在每個(gè)讀的數(shù)據(jù)行上加鎖。在這個(gè)級(jí)別,可能導(dǎo)致大量的超時(shí)現(xiàn)象和鎖競爭現(xiàn)象。數(shù)據(jù)庫應(yīng)用中很少看到有用戶選擇這種隔離級(jí)。但如果用戶的應(yīng)用為了數(shù)據(jù)的穩(wěn)定性,需要強(qiáng)制減少并發(fā)的話,也可以選擇這種隔離級(jí)。

3

分布式事務(wù)

分布式事務(wù)的實(shí)現(xiàn)需要保證事務(wù)的原子性、一致性、隔離性和持久性,而實(shí)現(xiàn)此 ACID 屬性的基本技術(shù)思路有:

通過“兩階段提交(Two-phase Commit,2PC)”協(xié)議實(shí)現(xiàn)事務(wù)的原子性、一致性和持久性等屬性;

隔離性級(jí)別的實(shí)現(xiàn)通常使用多版本并發(fā)控制機(jī)制來保證。實(shí)現(xiàn)多版本并發(fā)控制常用的方式是“快照隔離(Snapshot Isolation)”技術(shù);

下面先分別介紹一下這兩個(gè)概念。

3.1 兩階段提交

兩階段提交(Two-phase Commit,2PC)是為了使基于分布式系統(tǒng)架構(gòu)下的所有節(jié)點(diǎn)在進(jìn)行事務(wù)提交時(shí)保持一致性而設(shè)計(jì)的一種協(xié)議。

兩階段提交算法的成立基于以下假設(shè):

該分布式系統(tǒng)中,存在一個(gè)節(jié)點(diǎn)作為事務(wù)協(xié)調(diào)器,其他節(jié)點(diǎn)作為事務(wù)管理器,且節(jié)點(diǎn)之間可以進(jìn)行網(wǎng)絡(luò)通信。

所有節(jié)點(diǎn)都采用預(yù)寫式日志(Write Ahead Log),且日志被寫入后即被保持在可靠的存儲(chǔ)設(shè)備上,即使節(jié)點(diǎn)損壞不會(huì)導(dǎo)致日志數(shù)據(jù)的消失。

所有節(jié)點(diǎn)不會(huì)永久性損壞,即使損壞后仍然可以恢復(fù)。

以下對(duì)二階段提交算法分階段進(jìn)行說明。

第一階段(提交請(qǐng)求階段)

事務(wù)協(xié)調(diào)器節(jié)點(diǎn)向所有事務(wù)管理器節(jié)點(diǎn)詢問是否可以執(zhí)行提交操作,并開始等待各事務(wù)管理器節(jié)點(diǎn)的響應(yīng)。事務(wù)管理器節(jié)點(diǎn)執(zhí)行詢問發(fā)起為止的所有事務(wù)操作,并將 Undo 信息和 Redo 信息寫入日志。

各事務(wù)管理器節(jié)點(diǎn)響應(yīng)事務(wù)協(xié)調(diào)器節(jié)點(diǎn)發(fā)起的詢問。如果事務(wù)管理器節(jié)點(diǎn)的事務(wù)操作實(shí)際執(zhí)行成功,則它返回一個(gè)“同意”消息;如果事務(wù)管理器節(jié)點(diǎn)的事務(wù)操作實(shí)際執(zhí)行失敗,則它返回一個(gè)“中止”消息。有時(shí)候,第一階段也被稱作投票階段,即各事務(wù)管理器投票是否要繼續(xù)接下來的提交操作。

第二階段(提交執(zhí)行階段)

巨杉數(shù)據(jù)庫在實(shí)現(xiàn)多版本并發(fā)控制技術(shù)時(shí),除了采用事務(wù)鎖和內(nèi)存老版本機(jī)制外,還采用了磁盤回滾段對(duì)并發(fā)控制策略進(jìn)行了完善與補(bǔ)充。眾所周知,內(nèi)存是高速存儲(chǔ)設(shè)備,但是其存在存儲(chǔ)空間比較小以及斷電數(shù)據(jù)丟失的問題。針對(duì)此問題,磁盤回滾段機(jī)制通過將內(nèi)存中的“老版本數(shù)據(jù)”持久化到磁盤上,保證數(shù)據(jù)庫在掉電等異常情況下不會(huì)影響事務(wù)的正常操作。

回滾段使用系統(tǒng)集合空間,名為”SYSRBS”。另外,其內(nèi)部會(huì)使用 1 個(gè)集合,命名格式為”SYSRBSXXXX”,其中 XXXX 為循環(huán)編號(hào),范圍為 0~4096。同時(shí),回滾段使用第一個(gè)集合(即:SYSRBS0000)存儲(chǔ) RBS 的元數(shù)據(jù),包括當(dāng)前 RBS 集合和最后空閑 RBS 集合。巨杉數(shù)據(jù)庫會(huì)在啟動(dòng)時(shí)檢查是否支持 MVCC,如果支持,則會(huì)檢查”SYSRBS”集合空間是否存在,不存在的話則會(huì)創(chuàng)建此集合空間,同時(shí)創(chuàng)建 SYSRBSCL0000 和 SYSRBSCL0001 集合。如果回滾段的集合空間和集合均存在,則會(huì)從 SYSRBSCL0000 中讀取元數(shù)據(jù)信息,根據(jù)當(dāng)前 RBS 集合和最后空閑 RBS 集合信息創(chuàng)建下一下 SYSRBSCLXXXX。

為了更進(jìn)一步提高讀取速度,巨杉數(shù)據(jù)庫將磁盤回滾段與內(nèi)存老版本相結(jié)合,最新的老版本還是掛在記錄鎖的 oldversionContainer 上,其它更老的版本放磁盤上。這樣滿足大多數(shù)據(jù)短事務(wù)只用讀內(nèi)存的老版本,無需再讀磁盤,從而提供了讀取速度。考慮到主節(jié)點(diǎn)異常的情況,多版本控制需要將記錄老版本數(shù)據(jù)的回滾段也同步至備節(jié)點(diǎn),當(dāng)備節(jié)點(diǎn)升為主節(jié)點(diǎn)后,可以通過回滾段重建老版本。

當(dāng)事務(wù) ID 小于全局最小事務(wù) ID(lowTranID)時(shí),數(shù)據(jù)庫后臺(tái)的異步線程負(fù)責(zé)回收老版本記錄和索引節(jié)點(diǎn)內(nèi)存。內(nèi)存老版本清理時(shí)要將其保存的老版本寫入 RBS。而磁盤老版本的清理則是從最后空閑集合 (lastFreeCL) 開始,逐個(gè)對(duì)比表的最大事務(wù) ID(MaxGTID),如果小于全局最小事務(wù) ID,則可以刪除這個(gè)表(即 SYSRBSCLXXXX)。

巨杉數(shù)據(jù)庫通過采用事務(wù)鎖、內(nèi)存老版本以及磁盤回滾段重建老版本的設(shè)計(jì)來實(shí)現(xiàn)了多版本并發(fā)控制技術(shù)。此設(shè)計(jì)通過對(duì)內(nèi)存結(jié)構(gòu)的合理利用,存儲(chǔ)數(shù)據(jù)和索引的老版本信息,從而實(shí)現(xiàn)多版本數(shù)據(jù)的快速的并發(fā)訪問。

關(guān)于 SequoiaDB 分布式事務(wù)實(shí)現(xiàn)原理是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-19發(fā)表,共計(jì)3761字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒有評(píng)論)
主站蜘蛛池模板: 徐水县| 广东省| 呼和浩特市| 洛川县| 太白县| 新泰市| 仁寿县| 道真| 贵定县| 黄大仙区| 巩留县| 旬邑县| 无为县| 舟曲县| 宝丰县| 留坝县| 霍邱县| 韶山市| 天祝| 博白县| 永胜县| 印江| 台中市| 敦化市| 贵州省| 日喀则市| 巴里| 祁连县| 西乡县| 涟源市| 龙门县| 利津县| 宁阳县| 旅游| 芦山县| 永丰县| 馆陶县| 若尔盖县| 惠州市| 临漳县| 许昌市|