華為云企業(yè)級(jí)Redis揭秘第16期:超越開源Redis的ACID"真"事務(wù)
日常生活中的shopping、交通、手游都離不開高頻的金融消費(fèi)、虛擬交易。熟悉MySQL的讀者,一定知道數(shù)據(jù)庫(kù)事務(wù)(Transaction)可以搞定這類關(guān)鍵場(chǎng)景,事務(wù)不但極大簡(jiǎn)化了上層業(yè)務(wù)的編程模型,給開發(fā)者帶來(lái)便利,同時(shí)它也讓“交易”等核心業(yè)務(wù)正確可靠。
其實(shí),Redis也有事務(wù),但社區(qū)版只做了簡(jiǎn)版實(shí)現(xiàn),無(wú)法滿足ACID要求,因此應(yīng)用有限。
本文將介紹華為云企業(yè)級(jí)數(shù)據(jù)庫(kù)GaussDB(for Redis)(下文簡(jiǎn)稱為高斯Redis)的事務(wù)功能,與社區(qū)版不同,高斯Redis提供了滿足ACID的企業(yè)級(jí)事務(wù)特性。
1.什么是事務(wù)?
請(qǐng)?jiān)O(shè)想如下場(chǎng)景:
在一個(gè)月黑風(fēng)高之夜,一場(chǎng)交易正在進(jìn)行。玩家B收款成功,但A卻沒(méi)拿到裝備。
好了,一場(chǎng)PK在所難免。
玩家做幾次點(diǎn)擊即可完成交易,但底層數(shù)據(jù)庫(kù)內(nèi)部,卻需要執(zhí)行至少4個(gè)關(guān)鍵操作:
試想,如步驟4失敗,而前置步驟成功,會(huì)發(fā)生邏輯錯(cuò)亂,這將帶來(lái)災(zāi)難性的用戶體驗(yàn)。
事務(wù)是如何解決這類場(chǎng)景的?這依賴于4大特性:
原子性(Atomicity):一組操作要么全成功,要么全失敗。
一致性(Consistency):即滿足既定約束,保證系統(tǒng)不脫離合理狀態(tài)。例如,如果A、B各有50枚金幣,那么全局總數(shù)應(yīng)始終保持100。
隔離性(Isolation):多個(gè)事務(wù)的執(zhí)行相互隔離,互不影響。
持久性(Durability):提交成功的事務(wù)應(yīng)帶來(lái)永久性狀態(tài)變化,即使掉電,數(shù)據(jù)也不應(yīng)丟失。
其中,一致性是最關(guān)鍵的,而原子性、隔離性、持久性都是為了保證一致性。當(dāng)然,為了確保整體系統(tǒng)的一致性,也需要業(yè)務(wù)層的共同設(shè)計(jì)實(shí)現(xiàn),本文不詳細(xì)展開。
那么,開源Redis事務(wù)存在哪些問(wèn)題,GaussDB(for Redis)的企業(yè)級(jí)事務(wù)功能又是什么樣的?下面我們來(lái)具體看看。
2. 從四大特性看Redis的事務(wù)
2.1 原子性
社區(qū)版Redis
開源Redis事務(wù)是一種極簡(jiǎn)設(shè)計(jì),并不支持事務(wù)失敗時(shí)的回滾操作,不滿足事務(wù)的原子性。
此外還有以下問(wèn)題:
入隊(duì)校驗(yàn)不完備:只校驗(yàn)簡(jiǎn)單語(yǔ)法,無(wú)法識(shí)別key的類型錯(cuò)誤;
錯(cuò)誤處理不完備:直接跳過(guò)錯(cuò)誤,繼續(xù)執(zhí)行后續(xù)命令。
GaussDB(for Redis)
如圖所示,開源Redis事務(wù)在第一條命令出錯(cuò)的情況下仍舊執(zhí)行了下面的命令,而高斯Redis則避免了這樣的問(wèn)題。
每個(gè)事務(wù)的執(zhí)行在提交前會(huì)進(jìn)行錯(cuò)誤判斷,如有錯(cuò)誤則會(huì)觸發(fā)回滾邏輯,放棄之前的操作,對(duì)原數(shù)據(jù)無(wú)影響
高斯Redis在保留社區(qū)版事務(wù)使用邏輯的同時(shí),在底層實(shí)現(xiàn)了對(duì)回滾的支持,滿足了事務(wù)的原子性。
2.2 隔離性
社區(qū)版Redis
事務(wù)在并發(fā)執(zhí)行時(shí),應(yīng)當(dāng)處理各種隔離性問(wèn)題。
開源Redis對(duì)命令的執(zhí)行是單線程設(shè)計(jì),因此的確可以保證不會(huì)有兩個(gè)事務(wù)同時(shí)被執(zhí)行,具體來(lái)看:
開源Redis不存在隔離性問(wèn)題;
代價(jià)是性能的降低和對(duì)整體吞吐的影響,事務(wù)只能單線程處理,對(duì)其他請(qǐng)求的干擾較大。
GaussDB(for Redis)
高斯Redis是多線程架構(gòu),內(nèi)部對(duì)數(shù)據(jù)進(jìn)行自動(dòng)分片,在同數(shù)據(jù)分片內(nèi)保留序列化的隔離性級(jí)別,同時(shí)極大提高整體實(shí)例的并發(fā)能力。
2.3 持久性
社區(qū)版Redis
開源Redis是純內(nèi)存設(shè)計(jì),不提供可靠的數(shù)據(jù)存儲(chǔ)能力。掉電后數(shù)據(jù)丟失,即使開啟RDB或AOF,也只能在一定程度上挽回部分?jǐn)?shù)據(jù),具體來(lái)看:
RDB方式會(huì)丟失部分?jǐn)?shù)據(jù),數(shù)據(jù)只能恢復(fù)到上次快照的時(shí)間
即使是AOF方式,持久性也存在問(wèn)題,從命令執(zhí)行到保存到硬盤之間,仍舊存在時(shí)間差
AOF方式恢復(fù)緩慢、維護(hù)文件龐大,維護(hù)管理成本都會(huì)非常高,重建時(shí)間也很長(zhǎng)
綜合來(lái)看,社區(qū)版Redis的持久化能力有限,不足以支持事務(wù)的持久性要求。
GaussDB(for Redis)
高斯Redis采用存算分離的設(shè)計(jì)理念,底層使用高性能分布式存儲(chǔ)池保存全量數(shù)據(jù),結(jié)合RocksDB存儲(chǔ)引擎,可保證核心數(shù)據(jù)的可靠存儲(chǔ),架構(gòu)圖:
GaussDB(for Redis)核心優(yōu)勢(shì):
核心數(shù)據(jù)存儲(chǔ):全量數(shù)據(jù)落盤,3副本冗余,不怕丟數(shù)據(jù)
高可用:秒級(jí)故障接管,即使N-1節(jié)點(diǎn)故障,全量數(shù)據(jù)也可用
低時(shí)延:自動(dòng)冷熱分離,亞毫秒級(jí)時(shí)延,能Hold緩存場(chǎng)景
高吞吐:全部節(jié)點(diǎn)可寫,QPS可水平擴(kuò)展,能抗流量高峰
強(qiáng)一致:3副本強(qiáng)一致同步,不會(huì)發(fā)生臟讀,業(yè)務(wù)免踩坑
秒擴(kuò)容:例如,8G到64G擴(kuò)容只需1秒,且對(duì)業(yè)務(wù)0影響
降成本:數(shù)據(jù)量越大價(jià)格越香,能夠真正幫用戶省成本
高斯Redis強(qiáng)大的持久化保障,支持核心數(shù)據(jù)的可靠存儲(chǔ),也為事務(wù)的執(zhí)行提供了有力的保證。
2.4 一致性
從數(shù)據(jù)庫(kù)層面,數(shù)據(jù)庫(kù)通過(guò)原子性、隔離性、持久性來(lái)保證一致性,可以說(shuō)在ACID中一致性是事務(wù)的目的,其他特性是手段。
如上文所述,開源Redis在原子性和持久性上都存在種種問(wèn)題,一致性自然也無(wú)法保障。在上述特性的保障下,不論是正常執(zhí)行還是存在命令失敗場(chǎng)景,高斯Redis事務(wù)都有可靠的一致性。
2.5 對(duì)比總結(jié)
通過(guò)上述介紹我們從事務(wù)的四大特性出發(fā)詳細(xì)地介紹了高斯Redis的事務(wù),最后做一個(gè)總結(jié):
3. 結(jié)語(yǔ)
近年來(lái),以Redis為代表的KV數(shù)據(jù)庫(kù)逐漸在越來(lái)越多的場(chǎng)景發(fā)揮作用,而高斯Redis作為華為云旗艦KV數(shù)據(jù)庫(kù),可滿足企業(yè)核心數(shù)據(jù)的可靠存儲(chǔ)要求。
高斯Redis的事務(wù)能力相比社區(qū)版Redis有極大提升,在ACID事務(wù)的加持下,更可在“庫(kù)存”、“交易”等關(guān)鍵場(chǎng)景簡(jiǎn)化業(yè)務(wù)設(shè)計(jì),帶來(lái)可靠數(shù)據(jù)存儲(chǔ)能力。
4. 附錄
杭州/西安/深圳簡(jiǎn)歷投遞:yuwenlong4@huawei.com
產(chǎn)品資料導(dǎo)航:https://bbs.huaweicloud.com/blogs/248875
MySQL Redis 云數(shù)據(jù)庫(kù) GaussDB(for Redis) 數(shù)據(jù)庫(kù) 緩存
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。