與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海量分布式存儲系統架構和運營優化工作。曾從事千萬億次超級計算機管理和作業調度系統開發。