[編程工具]騰訊重磅開源 DCache,分佈式 NoSQL 存儲系統

當你在電商平臺秒殺商品或者在社交網絡刷熱門話題的時候,可以很明顯感受到當前網絡數據流量的恐怖,幾十萬商品剛開搶,一秒都不到就售罄;哪個大明星出軌的消息一出現,瞬間閱讀與轉發次數可以達到上億。作為終端用戶的我們可能會思考,服務系統是怎麼在這樣嚴峻的流量環境中存活下來的。

其實,服務系統的架構中有許多巧妙的設計來應對這樣的問題,而在這其中,通常系統都會架設緩存系統,用以緩解海量訪問請求與數據帶來的衝擊,實現高性能訪問需求。

同時,隨著微服務與雲等技術的發展,分佈式架構的需求變得越來越普遍,再加上今天 Web 上的數據類型已經不再單一,而且數據量也呈爆發式增長,傳統的結構化存儲方案已經跟不上腳步,對數據庫的 SQL 操作不再滿足要求,於是 NoSQL 出現。

將這幾種技術方案整合起來,我們可以設計出分佈式 NoSQL 緩存系統,當前這一類系統有一些比較強大的開源方案,比如 Memcached 和 Redis,它們對整個服務系統的可用性、可擴展性與性能起到至關重要的作用。

聽說最近騰訊開源了一個分佈式 NoSQL 存儲系統 DCache,它的典型應用場景就在分佈式緩存。根據官方介紹,DCache 基於 TARS 微服務治理方案,它支持 k-v、k-k-row、list、set 與 zset 多種數據結構,數據基於內存存儲,同時支持後接 DB 實現數據持久化。DCache 具備快速水平擴展能力,同時配套有 Web 運維平臺實現高效的運維操作。

我們第一時間採訪了 DCache 研發團隊成員山寶銀,希望對項目的研發背景與相關技術細節有進一步瞭解。

DCache:https://www.oschina.net/p/dcache-nosql

當前開源的分佈式緩存系統中,Memcached 與 Redis 是很普遍的選擇,騰訊此次為什麼要自己造一個系統呢?

山寶銀介紹,雖然 Memcached 與 Redis 本身都擁有極其強大的能力,但是存在運維困難、缺乏集群化方案與無法應對微服務趨勢帶來的挑戰等問題。

舉個例子,當前微服務是一大趨勢,大家都在說要做微服務,它可以讓計算與存儲之間解耦,實現輕量級通信。微服務不需要管理生命同期,而作為系統組件的 Redis 則不然,“我們做服務架構設計時希望把邏輯層和數據層分離開來,但是如果使用 Redis 做緩存,緩存與 DB 之間的數據一致性問題,以及緩存不命中如何解決等問題都需要使用者在業務邏輯中做相關處理,這增加了一定的複雜度和難度,也增加了邏輯層和數據層的耦合度。”

另一方面,山寶銀介紹,起初面對海量數據和高性能訪問需求,騰訊內部各個團隊其實都開發了各自的緩存系統,然而這些系統之間協議不統一、服務模型多樣化、不具有通用性容錯、擴展能力也參差不齊,所以團隊就著手研發了 DCache 這一套通用 Cache 系統,希望整體去解決業務、開發、運維和監控面臨的各種挑戰。

所以也可以看到,目前 DCache 已經應用於騰訊內部多個業務上,包括 QQ 瀏覽器、應用寶、騰訊地圖、騰訊電腦管家、手機管家與騰訊遊戲等。

SQL、分佈式與 NoSQL 的取捨

SQL 是指數據庫的結構化查詢語言,它是數據庫的操作命令集,傳統的關係型數據庫都使用標準的 SQL 語句操作處理數據。分佈式是軟件系統的一種架構模式,在分佈式系統中,多個硬件或軟件組件分佈在不同計算機上,彼此之間通過消息傳遞進行通信,對外表現為一個整體,提供統一化的服務。

有一種普遍的觀點是,數據庫 SQL 與分佈式之間存在天然對立性,山寶銀的理解是:“分佈式系統因為數據分散在不同的節點,所以像 SQL 的聯表、事務等操作需要全局的鎖保護,這樣處理起來比較複雜,並且影響性能。”

SQL 還有與 NoSQL 的取捨問題,NoSQL 是指一類數據庫,主要用於高性能處理超海量數據,它的一大特點是數據結構簡單,以 key-value 為主,數據之間非關聯,容易做水平擴展。

從字面上看,NoSQL 似乎是與 SQL 對立的,做 NoSQL 似乎就意味著放棄 SQL,然而實際上 NoSQL 本意是 Not Only SQL,它不僅僅是 SQL,那麼也就可以包含 SQL 的能力。

“NoSQL 也不是一定就得放棄 SQL,其實在代理層可以增加 SQL 的解析、計算邏輯來實現 SQL 操作,但這樣會影響性能,所以還是看應用場景和業務需求。”

山寶銀為我們簡單分析了 DCache “分佈式 NoSQL”的意義。在 SQL 處理方面,分佈式似乎存在劣勢,然而分佈式意味著可以聯結更多的廉價計算機,充分運用算力,以低成本的方式應對高強度的併發訪問請求,此外分佈式架構還有不少優勢,比如避免系統單點問題導致的整體故障,實現高可用。

而另一方面,山寶銀也說到:“DCache 因為主要的目標就是高性能,SQL 操作並不是主要想解決的問題,所以 DCache 沒有實現 SQL 的功能。”

DCache 分佈式策略與能力

DCache 對外提供服務的粒度是 group,一個 group 負責一部分的數據分片,至於每個 group 服務哪些數據,是根據數據的 key 做 hash 映射後所處的範圍來確定的。

DCache 會把數據的 key 通過 hash 算法映射到 0~4294967295 (unsigned int) 範圍內,然後把 0~4294967295 範圍均勻劃分到不同的 group 上。例如有兩個 group,key 做 hash 後的值在 0~2147483647 範圍就分發到 group1,在 2147483648~4294967295 範圍就分發到 group2。

在一個 group 內,採用主備架構,只有主節點接收讀寫請求,所以數據一致性是可以保證的,而當主機不可用時,會觸發主備自動切換,保證服務持續可用。

[編程工具]騰訊重磅開源 DCache,分佈式 NoSQL 存儲系統

DCache 架構

我們疑惑 DCache 似乎強依賴於 etcd 與 TARS 等中間件,那它本身的核心特性與能力體現在哪裡?

山寶銀解釋,DCache 並不強依賴 etcd,“etcd 只涉及了路由服務 RouterServer 的選主,如果 RouterServer 部署單點也是可用的,而且 RouterServer 的宕機不會影響到數據的讀寫訪問,因為所有的 Proxy 與 Cache 服務都有本地的路由緩存”,關於 TARS 的採用,他說:“因為 TARS 是一個非常優秀的服務開發框架,它屏蔽了底層的網絡通信細節,且自帶了名字服務等很多服務化需要的功能,對於 DCache 來說,使用已有的 TARS 框架可以更好地做到服務化,我們沒有必要去重複的造輪子。”

至於 DCache 本身的能力,山寶銀介紹:“DCache 自身的存儲引擎具有很高的性能,而且支持後接 DB,對使用者來說,不需要再關心 DB 和緩存之間的數據一致性,以及緩存不命中帶來的一系列問題。”

具體來說,DCache 持久化與 Redis 不一樣,後者只是把內存中的數據在本地磁盤做一個備份,保證 Redis 重啟之後做數據恢復。

“Redis 持久化主要是為了數據備份。DCache 後端有了 DB 以後,業務的邏輯與後臺的數據可以完全隔開,DCache 自身會處理緩存與 DB 之間的數據一致性問題。

DCache 會不斷地將 Cache 中的數據落地後端 DB,如果 Cache 中存儲空間不夠,會將已經落地 DB 的冷數據淘汰掉。在數據查詢的過程中,如果查詢 Cache 不命中,會從 DB 讀取並重新存到 Cache,以此來保證 Cache 中數據的熱點性和命中率,同時 DB 與 Cache 的穿透問題也得到解決。

另外,數據持久化到後端 DB 的能力對於一些需要做離線數據分析的業務場景也比較方便。總之你完全不用關心數據的東西,只需要把數據寫到 Cache,後端的落地由 DCache 處理。”

[編程工具]騰訊重磅開源 DCache,分佈式 NoSQL 存儲系統

DCache 特性

此外,DCache 的分佈式集群化、異地鏡像部署、容災容錯能力在實際線上應用中都會提供非常高的價值。

用武之地

作為一個分佈式存儲系統,DCache 的應用場景沒有限制在緩存上,山寶銀介紹,對於有高性能 NoSQL 存儲需求的場景,都可以使用 DCache,而且因為 DCache 具備容量淘汰與過期自動清理數據的功能,對於需要存儲熱點數據(如熱門文章)與臨時數據(如有時效性的聊天記錄)的場景也可以提供很好的支持。

山寶銀也提供了 DCache 的性能數據:

[編程工具]騰訊重磅開源 DCache,分佈式 NoSQL 存儲系統

目前騰訊內部包括 QQ 瀏覽器、應用寶、騰訊地圖、騰訊電腦管家、手機管家與騰訊遊戲在內的近百個業務都接入了 DCache,這些業務的體量之大可以想象,山寶銀補充:“除了提供的這一組簡單的數據,DCache 在高效可靠地支撐著近百個業務的運轉,日均調用量過萬億次,這也從側面說明了 DCache 在生產環境的性能與穩定性。”

而除了系統本身高性能、高擴展、高可用與數據安全的設計外,Web 可視化的高效運維平臺也成了 DCache 不可或缺的重要能力。基於內存的 NoSQL 存儲系統在運維上會產生巨大的額外開銷,它需要對相關技術進行深入理解,並且在緊要關頭果斷做出正確決策。

[編程工具]騰訊重磅開源 DCache,分佈式 NoSQL 存儲系統

DCache 基於 TARS 開發,所以運維平臺將 DCache 與 TARS 的服務管理統一做在了一個模塊上,山寶銀介紹該運維平臺將大大提高效率,同時降低了運維門檻,關於服務的部署、上線、遷移、擴容、監控與配置這些操作都可以輕鬆實現。


分享到:


相關文章: