華為雲企業級Redis揭祕第16期:超越開源Redis的ACID"真"事務

語言: CN / TW / HK

日常生活中的shopping、交通、手遊都離不開高頻的金融消費、虛擬交易。熟悉MySQL的讀者,一定知道數據庫事務(Transaction)可以搞定這類關鍵場景,事務不但極大簡化了上層業務的編程模型,給開發者帶來便利,同時它也讓“交易”、“庫存”等核心業務正確可靠。

其實,Redis也有事務,但社區版只做了簡版實現,無法滿足ACID要求,因此應用有限。

本文將介紹華為雲企業級數據庫GaussDB(for Redis)(下文簡稱為高斯Redis)的事務功能,與社區版不同,高斯Redis提供了滿足ACID的企業級事務特性。

1.什麼是事務?

請設想如下場景:

在一個月黑風高之夜,一場交易正在進行。玩家B收款成功,但A卻沒拿到裝備。

好了,一場PK在所難免。

玩家做幾次點擊即可完成交易,但底層數據庫內部,卻需要執行至少4個關鍵操作:

試想,如步驟4失敗,而前置步驟成功,會發生邏輯錯亂,這將帶來災難性的用户體驗。

事務是如何解決這類場景的?這依賴於4大特性:

  • 原子性(Atomicity):一組操作要麼全成功,要麼全失敗。

  • 一致性(Consistency):即滿足既定約束,保證系統不脱離合理狀態。例如,如果A只有20枚金幣,則A不能消費100金幣。

  • 隔離性(Isolation):多個事務的執行相互隔離,互不影響。

  • 持久性(Durability):提交成功的事務應帶來永久性狀態變化,即使掉電,數據也不應丟失。

其中,一致性是最關鍵的,而原子性、隔離性、持久性都是為了保證一致性。當然,為了確保整體系統的一致性,也需要業務層的共同設計實現,本文不詳細展開。

那麼,開源Redis事務存在哪些問題,GaussDB(for Redis)的企業級事務功能又是什麼樣的?下面我們來具體看看。

2. 從四大特性看Redis的事務

2.1 原子性

社區版Redis

開源Redis事務是一種極簡設計,並不支持事務失敗時的回滾操作,不滿足事務的原子性。

此外還有以下問題:

l   入隊校驗不完備: 只校驗簡單語法,無法識別key的類型錯誤;

l   錯誤處理不完備: 直接跳過錯誤,繼續執行後續命令。

GaussDB(for Redis)

如圖所示,開源Redis事務在第一條命令出錯的情況下仍舊執行了下面的命令,而高斯Redis則避免了這樣的問題。

  • 每個事務的執行在 提交前會進行錯誤判斷 ,如有錯誤則會觸發回滾邏輯,放棄之前的操作,對原數據無影響

高斯Redis在保留社區版事務使用邏輯的同時,在底層實現了對 回滾 的支持,滿足了事務的原子性。

2.2 隔離性

社區版Redis

事務在併發執行時,應當處理各種隔離性問題。

開源Redis對命令的執行是單線程設計,因此的確可以保證不會有兩個事務同時被執行,具體來看:

  • 開源Redis不存在隔離性問題;

  • 代價是性能的降低和對整體吞吐的影響,事務只能單線程處理,對其他請求的干擾較大。

GaussDB(for Redis)

高斯Redis是多線程架構,內部對數據進行自動分片,在同數據分片內保留序列化的隔離性級別,同時極大提高整體實例的併發能力。

2.3 持久性

社區版Redis

開源Redis是純內存設計,不提供可靠的數據存儲能力。掉電後數據丟失,即使開啟RDB或AOF,也只能在一定程度上挽回部分數據,具體來看:

  • RDB方式會丟失部分數據,數據只能恢復到上次快照的時間

  • 即使是AOF方式,持久性也存在問題,從命令執行到保存到硬盤之間,仍舊存在時間差

  • AOF方式恢復緩慢、維護文件龐大,維護管理成本都會非常高,重建時間也很長

綜合來看,社區版Redis的持久化能力有限,不足以支持事務的持久性要求。

GaussDB(for Redis)

高斯Redis採用存算分離的設計理念,底層使用高性能分佈式存儲池保存全量數據,結合RocksDB存儲引擎,可保證核心數據的可靠存儲,架構圖:

GaussDB(for Redis)核心優勢

  • 核心數據存儲:全量數據落盤,3副本宂餘,不怕丟數據

  • 高可用:秒級故障接管,即使N-1節點故障,全量數據也可用

  • 低時延:自動冷熱分離,亞毫秒級時延,能Hold緩存場景

  • 高吞吐:全部節點可寫,QPS可水平擴展,能抗流量高峯

  • 強一致:3副本強一致同步,不會發生髒讀,業務免踩坑

  • 秒擴容:例如,8G到64G擴容只需1秒,且對業務0影響

  • 降成本:數據量越大價格越香,能夠真正幫用户省成本

高斯Redis強大的持久化保障,支持核心數據的可靠存儲,也為事務的執行提供了有力的保證。

2.4 一致性

從數據庫層面,數據庫通過原子性、隔離性、持久性來保證一致性,可以説在ACID中一致性是事務的目的,其他特性是手段。

如上文所述,開源Redis在原子性和持久性上都存在種種問題,一致性自然也無法保障。在上述特性的保障下,不論是正常執行還是存在命令失敗場景,高斯Redis事務都有可靠的一致性。

2.5 對比總結

通過上述介紹我們從事務的四大特性出發詳細地介紹了高斯Redis的事務,最後做一個總結:

3. 結語

近年來,以Redis為代表的KV數據庫逐漸在越來越多的場景發揮作用,而高斯Redis作為華為雲旗艦KV數據庫,可滿足企業核心數據的可靠存儲要求。

高斯Redis的事務能力相比社區版Redis有極大提升,在ACID事務的加持下,更可在“庫存”、“交易”等關鍵場景簡化業務設計,帶來可靠數據存儲能力。

4. 附錄

  • 本文作者:華為雲數據庫GaussDB(for Redis)團隊

  • 杭州/西安/深圳簡歷投遞:[email protected]

  • 產品官網:https://www.huaweicloud.com/product/gaussdbforredis.html

想看更多內容 ,點擊“閲讀原文”, 立即瞭解