騰訊CKV海量分布式存儲系統

摘要:騰訊CKV,是騰訊自主研發的高性能、低延時、持久化、分布式KV存儲服務。在騰訊的微信平臺、開放平臺、騰訊云、騰訊游戲和電商平臺廣泛使用,日訪問量超過萬億次。本文將全面剖析CKV的實現原理和技術挑戰。

與Memcached和Redis等開源NoSQL相比,CKV具有以下優點。

  • 低成本:CKV利用數據冷熱自動分離技術,將熱數據存儲在內存,冷數據存儲在SSD中,從而大幅度降低成本,且保證99%以上的訪問命中內存。而Memcached和Redis的數據都存儲在內存中,成本是CKV的3倍。
  • 可擴展性強:CKV單表存儲空間可以在1GB到1PB之間在線自動無損伸縮,業務基本無感知,適合各種規模的業務和業務的各個生命周期。而Memcached和Redis是單機的,受限于單機的性能和內存容量,雖然可以通過客戶端或者Twemproxy等構建分布式集群,但是不能做到完全無損擴容,伸縮修改配置較麻煩。
  • ?高性能:CKV單表最大支持千萬次/秒的訪問,通過網絡訪問的延時在1ms左右,單臺Cache服務器千兆網絡環境支持50萬/秒的訪問,萬兆網絡環境支持超過100萬/秒的訪問。Memcached采用多線程,但性能比CKV Cache略低。而Redis是單線程的,性能垂直擴展性差。
  • 可用性超過99.95%:CKV軟硬件全冗余設計,雙機熱備,主備切換對業務透明,跨機架跨交換機部署。Memcached機器死機后,部分key訪問就會miss。Redis有雙機方案,但還不成熟。
  • 數據持久性超過8個9:CKV數據在磁盤存儲,多內存和磁盤副本,具有災難時回檔能力。Memcached死機后,數據就丟失了。Redis雖然數據有雙機方案,但還不成熟。
  • 完善的運維體系:CKV能預防并及時發現和處理故障,自動化運營。而Mem-cached和Redis缺乏專門的運維系統。

圖1 ?CKV SET架構

CKV系統包含多個SET。SET包含多種角色的服務器,是一個獨立完整可運營的單元。圖1是一個完整的CKV SET架構圖。本文將主要介紹CKV系統的基本原理,如何實現高性能、可擴展性強、高可用、數據持久化,以及完善的運維體系。

基本原理

每個業務都有一個唯一的tid。Master負責管理tid的路由表,路由表描述tid的key存儲在Cache的位置信息。Access是無狀態、全鏡像的,Access啟動或者業務路由表發生變化時,Master向Access推送tid路由表。


圖2 ?CKV SET操作流程

我們以寫入key-value的set操作為例,說明業務訪問流程(如圖2所示):業務向L5服務獲取負載和延時最佳Access地址;業務向Access發送寫入數據請求;Access根據業務的tid找出相應的路由表,對key進行sharding,把key映射為一個shard ID,然后在路由表中找出key所屬的shard位于的Cache地址;Access向Cache發送寫入數據請求,Cache把數據寫入內存并落磁盤;Cache向Access返回操作結果;Access將結果傳回給業務。

對key進行sharding的方法很多,最簡單的是對key進行Hash然后取余。

CKV讀寫訪問都能做到高性能、低延時,能夠解決Memcached+MySQL不能解決的海量低延時寫問題。

Cache集群定期將內存中的冷數據存儲到SSD中,當這些冷數據再次被訪問時,數據會按一定策略從SSD遷移到內存,從而大幅度降低成本,且保證99%以上的訪問命中內存。

單機高性能

CKV單臺Cache機器具有極高性能,且具有垂直可擴展性,能夠充分發揮高配置機器的CPU和網絡性能。優化的方法主要有:充分運用Zero-copy的思想,模塊間消息傳遞時盡量減少內存拷貝的次數;快速Hash技術;快速內存分配和回收技術;利用多隊列網卡提高網絡小包處理能力;多線程無鎖共享技術;通過這些優化方法,單臺Cache可以支撐超過100萬/秒的訪問。

水平可擴展性

對于單個業務表而言,CKV集群具有良好的水平可擴展性,可以通過水平擴展來提高表的容量和性能。CKV Access和Cache都具有很好的水平可擴展性。

Access水平擴展

由于Access是無狀態、全鏡像的,所以很容易通過L5名字服務實現水平擴容和縮容。業務只配置表的L5服務ID,而不是具體的機器IP。L5服務類似DNS,將L5服務ID映射為機器IP和端口,而且能夠根據機器的負載和延時情況選擇最佳的機器IP和端口,起到負載均衡和容錯的作用。

當Access整體負載過高或者過低時,通過增加或者刪除Access機器,并在L5服務中增加或刪除Access地址,實現Access的擴容和縮容。

Cache水平擴展

當業務表空間使用率過高或者過低時,需要對業務表進行容量擴容或者縮容。如圖3所示,業務數據的key空間劃分為4個shard,原來存儲在2臺Cache中。擴容過程如下:Master將禁止shard2數據寫訪問命令發送給Access;Transfer模塊把Cache1屬于shard2的數據搬遷到Cache3;Master將更新后的tid路由表和恢復shard數據訪問命令發送給Access;搬遷其他shard,重復以上過程。縮容的過程與擴容過程類似。

圖3 ?Cache擴容/縮容路由表變化

容量擴容除了能夠增加表的容量外,將shard分散到更多的Cache機器,或者將shard遷移到負載低的Cache機器上,能夠實現表的整體性能提升。

高可用

CKV所有的服務器和網絡全冗余。每對Access和每對主備Cache機器位于不同的交換機和機架上,避免某臺交換機故障或者機架掉電導致所有Access、主備Cache都不可用。

正常的訪問流程是業務通過Access訪問主Cache上的數據,主Cache將變化的數據同步到備Cache中。當某臺Access出現故障時,L5服務將出現故障的Access剔除,業務通過L5服務獲取正常的Access地址。當主Cache出現故障時,Master通知Access把訪問切換到備Cache。當備Cache出現故障時,服務不受影響。備Cache恢復后,主Cache把數據重新同步到備Cache。通過硬件冗余和軟件的容災處理,CKV可用性超過99.95%。

數據持久化

單臺Cache死機,數據不會丟失,且不影響訪問。如果主備Cache都死了,只要Cache磁盤的數據正常,那么Cache重啟后,通過磁盤上的備份和流水重構內存數據,就能恢復服務。即便主備Cache同時死機并且磁盤損壞,也能通過備份中心的備份和流水中心的流水回檔到任意5分鐘的Cache內存狀態。回檔功能還能減少用戶自己誤操作造成的損失。曾經有業務人員由于誤操作,把自己的表數據寫錯了,最后通過CKV的備份和流水才恢復到正確的數據狀態。

運維系統

云服務除了要有好的架構設計和實現外,更需要好的運營。CKV運營近萬臺服務器,機器故障、表容量滿等問題每天都會出現幾個,有時甚至幾十個。因而,需要全面的監控,及時的告警,提供快速的故障處理工具,以及常見的故障自動化處理。

多維度的監控

  • 軟件層面。監控進程自身的資源使用率,例如TCP連接數量、存儲空間使用率、進程是否死掉、數據遷移失敗、信息同步失敗等異常狀態。
  • 硬件層面。監控機器的CPU、內存、磁盤、網絡的使用率、機器死機等。
  • 整個系統層面。空閑的資源是否足夠滿足業務的增長擴容,業務調用CKV服務的成功率和延時。

告警方式多樣化

  • 日報。匯總系統的隱患,例如系統空閑的資源不足、互為主備的機器位于相同的機架或者交換機下、機器之間的網絡延時過大、機器的負載偏高等。通過日報能夠把潛在的隱患處理掉,減少故障的出現。
  • 短信告警。通知處于萌芽狀態的故障,例如表空間使用率超過90%、需要提前擴容和機器的負載偏高等。
  • 電話告警。需要緊急處理的故障。例如表空間使用率超過95%、需要緊急擴容、機器的CPU使用率100%和機器死機等。

總結

CKV利用數據冷熱分離技術大幅度降低了成本,同時保證99%以上的訪問命中內存,做到與純內存訪問延時幾乎無差別。內存存儲的CKV集群具有高性能、性能和容量可擴展性強、高可用、數據持久化等特點。完善的運維體系保證了大規模的CKV服務高效和可靠性。

CKV已經持續穩定運營4年多,成熟可靠,根據業務增長彈性伸縮,解決業務海量存儲訪問的難題,業務可以更加專注于自己的領域。云的時代已經到來,CKV將會助力更多的業務發展。

作者梁曉湛,騰訊TEG(技術工程事業群)基礎架構部工程師,主要負責CKV海量分布式存儲系統架構和運營優化工作。曾從事千萬億次超級計算機管理和作業調度系統開發。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448855.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448855.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448855.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Apache RocketMQ 安裝、測試、報錯解決

1. 準備 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 64bit OS, Linux/Unix/Mac 64bit JDK 1.8; Maven 3.2.x 2.下載和構建 下載 4.2.0 源代碼版本地址:http://mirro…

編程之法:面試和算法心得

《編程之法:面試和算法心得》高清中文版PDF 含書目錄 下載地址: 鏈接:https://pan.baidu.com/s/1Kcd2bRsIfhagKZR6NaOgXg 提取碼:054s 《編程之法:面試和算法心得》高清中文版PDF高清中文版PDF 含書目錄,36…

localStorage存、取數組

localStorage存儲數組時需要先使用JSON.stringify()轉成字符串,取的時候再字符串轉數組JSON.parse()。 var arr[1,2,3,4];localStorage.setItem(key,arr);console.log(localStorage(key); //打印出字符串:1,2,3,4 正常存儲:localStorage.setI…

10歲起編程,并不認為自己是“黑客”

摘要:一直以來,女性在“黑客”群體中缺乏代表性,但這不是因為她們缺乏興趣。麻省理工學院的Liz Denys從十歲開始接觸編程,但由于被忽視以及性別歧視問題,她和許多女性一樣,游走在“黑客”圈子之外。 我10歲…

Redis原理及拓展

Redis是單線程程序。單線程的Redis為何還能這么快? 1、所有的數據都在內存中,所有的運算都是內存級別的運算(因此時間復雜度為O(n)的指令要謹慎使用) 2、單線程操作,避免了頻繁的上下文切換 3、多路復用(非…

日常問題 - 遠程服務器運行Tomcat出現卡頓阻塞

問題描述: 遠程服務器Tomcat容器運行一個WEB項目,瀏覽器訪問時,請求一直得不到響應,并且除此之外沒有出現任何異常,像是被阻塞了。查看遠程Tomcat窗口,也沒有任何報錯。鼠標在Tomcat窗口右鍵點擊后&#xf…

linux : ulimit 命令使用說明、參數解說

ulimit -a 用來顯示當前的各種用戶進程限制 Linux 對于每個用戶,系統限制其最大進程數,為提高性能,可以根據設備資源情況, 設置個Linux用戶的最大進程數,一些需要設置為無限制: 數據段長度:uli…

給技術人上的管理課:平衡和集中

摘要:大中型團隊管理是技術人轉型的巨大挑戰,這個階段的管理工作,仍然可以歸為技術范疇,依靠的大抵是管理人的筋肉力量。是否會管理,要看能否管好超出自己筋肉力量規模的團隊。此中的關鍵,在于把握平衡和集…

理解分布式id生成算法--雪花算法(SnowFlake)

分布式ID生成算法的有很多種,Twitter的SnowFlake就是其中經典的一種。 注: 1B就是1個字節。Byte、KB、B、MB、GB之間的關系是:Bit——比特 ; B ——字節;KB——千字節;MB——兆字節;GB——吉字節…

[ZJOI2010]貪吃的老鼠

P2570 [ZJOI2010]貪吃的老鼠 在Ta的博客查看 顯然二分,最大流判定 要滿足兩個條件: (1) 在任一時刻,一只老鼠最多可以吃一塊奶酪; (2) 在任一時刻,一塊奶酪最多被一只老鼠吃。 先按照奶酪的邊界進行離散化&#xff0c…

IP: 169.254.0.0/16 地址用途

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 一直困惑169.254.0.0/16是干嘛的,每次筆記本dhcp獲取地址失敗后,就會隨機在這個B類地址段獲取一個地址&#…

值得借鑒的30條好習慣

我有幸一直能生活在比較好的圈子中,我的優秀的同學、舍友,乃至我現在創業后遇到的優秀創業者,從他們身上看到和學到一些好的習慣。 我一直覺得,好的習慣,是成功和進步的重要一點。我隨手總結一些給大家,零散…

【PKUSC2019】線弦圖【計數】【樹形DP】【分治FFT】

Description 定義線圖為把無向圖的邊變成點,新圖中點與點之間右邊當且僅當它們對應的邊在原圖中有公共點,這樣得到的圖。 定義弦圖為不存在一個長度大于3的純環,純環的定義是在環上任取兩個不相鄰的點,它們之間都沒有邊&#xff0…

注解 @PostConstruct 與 @PreDestroy 詳解及實例

簡介 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 Java EE5 引入了PostConstruct和PreDestroy這兩個作用于Servlet生命周期的注解,實現Bean初始化之前和銷毀之前的自定義操…

別讓6種不良心理偷走你的好人緣

眾所周知,擁有正常、健康的交際圈對于人的身心健康都是很有幫助的。但是若想維系好自己的交際圈,也是很不容易的,甚至在不經意間產生的某些心理,就會直接給大家的人際交往帶來影響。那么接下來,小編就先為大家歸納一下…

PHP 安裝xdebug

xdebug官網: https://xdebug.org 安裝步驟如下: 使用 phpinfo() 打印出PHP相關信息, 全選, 復制 打開 xdebug 網站: https://xdebug.org/wizard.php 在圖中輸入框中粘貼你復制的信息, 點擊 Analyse my phpinfo() output 在結果中點擊下載, 然后按照它提示的步驟進行操作即可…

apt-clone:備份已安裝的軟件包并在新的 Ubuntu 系統上恢復它們

當我們在基于 Ubuntu/Debian 的系統上使用 apt-clone,包安裝會變得更加容易。如果你需要在少量系統上安裝相同的軟件包時,apt-clone 會適合你。 如果你想在每個系統上手動構建和安裝必要的軟件包,這是一個耗時的過程。它可以通過多種方式實現…

分布式消息中間件 : Rocketmq

簡述 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 分布式消息中間件,主要是實現分布式系統中解耦、異步消息、流量銷鋒、日志處理等場景。生產中用的最多的消息隊…

PV、UV、UIP、VV、CPC、CPM、RPM、CTR指的是什么?

PV(PageView):網站瀏覽量,指頁面的瀏覽次數,用以衡量網站用戶訪問的網頁數量。用戶沒打開一個頁面便記錄1次PV,多次打開同一頁面則瀏覽量累計;UV(UniqueVistor):獨立訪客數,指1天內訪問某站點的…

linux opencl(AMD) Example

最近對并行計算很感興趣。不過搞MPI對我來說暫時沒什么用,基于GPU的并行計算倒是挺實用。網上的資料都是CUDA的。實質上我對CUDA一點興趣都沒有。無論別人的架構多么先進,我這個只有AMD顯卡的小孩都是旁觀者而已。在這里記錄一下一個opencl程序的編譯過程…