欧美,精品,综合,亚洲,好吊妞视频免新费观看,免费观看三级吃奶,一级a片女人自慰免费看

您當(dāng)前的位置是:  首頁 > 新聞 > 文章精選 >
 首頁 > 新聞 > 文章精選 >

融云高性能消息數(shù)據(jù)存儲引擎的設(shè)計解析

2018-10-26 11:10:46   作者:   來源:CTI論壇   評論:0  點擊:


  2018年10月22日,QCon全球軟件開發(fā)大會上海站成功落下帷幕。融云聯(lián)合創(chuàng)始人兼首席架構(gòu)師李淼再次受邀出席大會,并進行《高性能消息數(shù)據(jù)存儲引擎的設(shè)計解析》的主題演講,為參會者深入剖析了融云首次公開的最新技術(shù)研究成果“數(shù)據(jù)存儲引擎設(shè)計”。
  作為互聯(lián)網(wǎng)通信云獨角獸的融云每天要存儲的消息量高達數(shù)十億條,多年來融云一直致力于消息存儲的優(yōu)化,從原型階段的MySQL到后來的Redis、LevelDB,融云不停的探索實踐。隨著業(yè)務(wù)的發(fā)展和數(shù)據(jù)的持續(xù)增長,融云需要一個既能滿足業(yè)務(wù)需求,又能滿足大業(yè)務(wù)量的消息數(shù)據(jù)存儲,因此融云研究院在2017年決定研發(fā)可以滿足自身業(yè)務(wù)特點的高性能消息存儲服務(wù)(內(nèi)部代號RCTSDB),并使用全新設(shè)計的數(shù)據(jù)存儲引擎。
  以下內(nèi)容摘自李淼演講實錄。
  融云消息存儲歷程
  首先是融云在開始時的原型產(chǎn)品驗證階段,大概是在2013年初創(chuàng)階段,為了驗證融云的即時通信業(yè)務(wù)模式,此時的消息都是存儲在MySQL中,其特點是開發(fā)簡單,可以滿足各種產(chǎn)品需求。
  在原型驗證通過后,正式上線前融云將離線消息遷移到了Redis中以滿足性能需求,而歷史消息則繼續(xù)保存在MySQL中。
  融云經(jīng)過一年多業(yè)務(wù)飛速的發(fā)展,要存儲的消息越來越多,而Redis集群也幾乎每1-2個月就要進行擴容。當(dāng)時處于對成本的考量,融云決定采用相對低廉的磁盤存儲方案。此時融云做了很多選型,最終決定采用基于levelDB作為存儲引擎并自研DB。但是當(dāng)時的由于levelDB數(shù)據(jù)歸并消耗高,數(shù)據(jù)淘汰困難等問題,運行兩個月后替換了原來的Redis存儲方案。
  目前融云的線上情況是Redis存儲離線消息,levelDB存儲歷史消息,而融云的業(yè)務(wù)也相對進入了平穩(wěn)期,Redis最近一次擴容是在2018年的5、6月份,根據(jù)業(yè)務(wù)增速情況可以支持到2018年底。
  存儲架構(gòu)相對穩(wěn)定,為什么融云還要啟動自研存儲項目呢?
  滿足一些復(fù)雜的業(yè)務(wù)場景需求
  基于目前的存儲方案,一些需求實現(xiàn)起來非常困難,而這些需求都是來自客戶,從而制約產(chǎn)品的演進,所以融云急需一個替代方案;
  降低整體的成本投入
  融云線上的Redis集群成本是所有設(shè)備投入的一半以上,對于存儲的優(yōu)化,顯然是可以持續(xù)降低公司運營成本;
  簡化部署模型
  對于Redis的部署不是很復(fù)雜,但是融云除了公有云的業(yè)務(wù)以外還有私有云項目,繼續(xù)使用Redis對客戶側(cè)的運維部署成本就會變的很高;
  源碼可控
  之前融云使用過很多的開源產(chǎn)品,當(dāng)這些產(chǎn)品不能滿足業(yè)務(wù)需求時,融云又急需某些特性時,這就需要和作者聯(lián)系,但是大部分時候作者都不能及時響應(yīng)或者根本不在其計劃內(nèi),而這時融云只能等或者自己改,自己改的又回饋不了開源產(chǎn)品的主干上,或者當(dāng)開源產(chǎn)品更新沒辦法合并,這樣就迫使融云必須啟動自研存儲項目。
  即時通信類產(chǎn)品,自研存儲需具備哪些特點?
  快速的數(shù)據(jù)淘汰能力
  數(shù)據(jù)淘汰的過程不能對系統(tǒng)產(chǎn)生任何的影響;
  避免數(shù)據(jù)合并
  相對于levelDB來講,當(dāng)寫入很多操作的時候levelDB的數(shù)據(jù)合并經(jīng)常會發(fā)生CPU報警,導(dǎo)致寫入查詢響應(yīng)速度慢等情況;
  讀寫性能要求高
  至少不能比融云現(xiàn)有使用的Redis速度慢;
  開發(fā)使用靈活
  在融云存儲引擎設(shè)計過程中,不僅只是存儲數(shù)據(jù),而是當(dāng)作開發(fā)框架來進行設(shè)計的,在各操作點上都提供Hook,從而能夠滿足各種業(yè)務(wù)場景需求。
  站在前人的肩膀上遠眺
  融云在存儲引擎設(shè)計過程中借鑒很多已有的成熟方案,并將這些方案進行優(yōu)化整合,最終完成了自有的引擎設(shè)計。下面將羅列一些方案,并向前人致敬。
  數(shù)據(jù)寫入采用WAL模式
  數(shù)據(jù)在寫入內(nèi)存時同時記錄,當(dāng)服務(wù)宕機或重啟的時候可以根據(jù)這些恢復(fù)內(nèi)存數(shù)據(jù)。這些都是按照磁盤順序?qū)懭,可以變相的提高存儲引擎性能。一般主流的?shù)據(jù)庫都會采用這種模式完成數(shù)據(jù)寫入。
  借鑒InfluxDB中的LSM數(shù)據(jù)結(jié)構(gòu)
  LSM數(shù)據(jù)結(jié)構(gòu)是目前一些新興數(shù)據(jù)庫采用的數(shù)據(jù)結(jié)構(gòu),像LevelDB、RocksDB、HBase、Cassandra等。即時通訊消息具備時序數(shù)據(jù)的特點,而InfluxDB更是時序數(shù)據(jù)庫中的佼佼者,融云對InfulxDB做了一些改造,使其更適合存儲一些時序數(shù)據(jù)
  借鑒whiskey 的 K / V 分離存儲設(shè)計
  whiskey 是2016年發(fā)表的一篇論文,主要解決了LSM中大數(shù)量寫入后頻繁數(shù)據(jù)歸并的問題,在LSM這種數(shù)據(jù)結(jié)構(gòu)中,數(shù)據(jù)的Key和Value值都是要寫入內(nèi)存的,當(dāng)數(shù)據(jù)到達內(nèi)存設(shè)定的閾值時進行歸檔處理。對于value值較大的數(shù)據(jù)來說,這個歸檔就會變得特變頻繁,而whiskey的理念是將value單獨保存至另外的文件位置,LSM結(jié)構(gòu)內(nèi)保存的是Key以及這個Value所在文件的偏移量和長度,以此來降低歸檔頻。按照論文上的介紹,歸檔頻率可以降低一個數(shù)量級。
  借鑒MyISAM的存儲文件設(shè)計
  在文件設(shè)計這塊融云一共經(jīng)歷四版改動,最終殊途同歸。融云發(fā)現(xiàn)Mysql中MyISAM引擎的文件設(shè)計很有類似之處。
  融云消息存儲引擎設(shè)計
  1.存儲邏輯劃分
  2.存儲文件規(guī)劃
  關(guān)于Table文件分為三種文件進行組織存儲:
  • xxx.data 數(shù)據(jù)存儲文件;
  • xxx.index 數(shù)據(jù)索引文件;
  • xxx.info table信息文件。
  文件并沒有按照Table文件進行劃分存儲,是按照序號字段進行排序,為的是在設(shè)計過程中解決主從復(fù)制,提高便捷性。
  3.數(shù)據(jù)寫入邏輯
  4.數(shù)據(jù)文件設(shè)計
  5.日志文件設(shè)計
  6.索引文件設(shè)計
  7.信息文件設(shè)計
  內(nèi)存優(yōu)化
  • 在M_block中融云重度依賴跳表這種數(shù)據(jù)結(jié)構(gòu),融云的存儲引擎是用java寫的,主要考慮是后面可移植的問題。起初融云采用了java里面內(nèi)置的ConcurrentSkipList,但是其內(nèi)存消耗很高,這個主要是java的中對象內(nèi)存分配的規(guī)則導(dǎo)致的。所以融云重寫了SkipList,放棄了java中的對象模式。重新造的輪子其內(nèi)存消耗只有原始 1/4,同時也犧牲了一些東西,例如:刪除跳表內(nèi)的數(shù)據(jù)時,其刪除的數(shù)據(jù)所占的內(nèi)存無法釋放,但是對于即時通信消息來講基本上不存在刪除的場景,同樣一些時序數(shù)據(jù)也極少存在刪除場景;
  • 索引數(shù)據(jù)融云進行了一系列緊湊處理。優(yōu)化后40億級的索引數(shù)據(jù),只消耗內(nèi)存400MB。放棄java對象模式,直接采用byte數(shù)值的方式進行數(shù)據(jù)組織;
  • 對很多的對象又做了一些細節(jié)處理,想辦法把Java本身的一些內(nèi)存模型給抹平掉,通過這種方式來降低內(nèi)存利用率;
  • 最后融云做了LIRS的緩存機制。
  存儲優(yōu)化
  • 索引數(shù)據(jù)前綴壓縮,降低磁盤的寫入量;
  • 數(shù)值數(shù)據(jù)采用VarInt編碼;
  • 業(yè)務(wù)數(shù)據(jù)QuickLZ壓縮,平衡了存儲及CPU的使用率;
  • 數(shù)據(jù)寫入采用雙循環(huán)可變長度Buffer,使數(shù)據(jù)寫入過程中是沒有直接操作的,有效降低延遲的產(chǎn)生;
  • 重復(fù)數(shù)據(jù)引用寫入,該優(yōu)化對于即時通信場景有顯著成效。
  服務(wù)端架構(gòu)
  該架構(gòu)主要包含Broker,以及一些數(shù)據(jù)的分組Master、Slaver,這些數(shù)據(jù)是根據(jù)ZooKeeper進行管理,同時向Broker進行匯報。在Broker上會開設(shè)不同的端口去設(shè)置各種不同的協(xié)議。最后是DB manger,主要是用于管理引擎的各種數(shù)據(jù)查詢的插件,就像前文提到的該引擎除了是用于數(shù)據(jù)存儲外還是開發(fā)框架,程序員在架構(gòu)上可以靈活按照熟悉的開發(fā)語言去直接操作這些數(shù)據(jù)。
  數(shù)據(jù)存儲引擎項目將在年底開源
  李淼在會上表示,為了促進產(chǎn)業(yè)內(nèi)的技術(shù)交流,融云會在未來兩個月時間對數(shù)據(jù)存儲引擎項目進行開源,開源前除了對引擎做一些優(yōu)化以外,還會補充一些相關(guān)的文檔,同時為了方便開發(fā)者集成參考還會對代碼增加一些注釋。項目開源后意味著融云是國內(nèi)首家將自研的消息存儲引擎開源的云通信廠商,也正在為中國的開源環(huán)境貢獻自己應(yīng)盡的力量。
  關(guān)于融云:融云,安全、可靠的全球互聯(lián)網(wǎng)通信云服務(wù)商,向開發(fā)者和企業(yè)提供即時通訊和實時音視頻通信云服務(wù),據(jù)艾瑞等權(quán)威數(shù)據(jù)顯示,融云即時通訊云業(yè)務(wù)市場份額穩(wěn)居第一。目前,已有數(shù)十萬互聯(lián)網(wǎng)用戶及上千家企業(yè)級用戶通過融云實現(xiàn)了場景化溝通,并從中獲益,包括招商銀行、工商銀行、交通銀行、民生銀行、中國移動、四川航空、CCTV微視、中聯(lián)重科、58 趕集、大河報業(yè)、新東方、陸金所、易車網(wǎng)、豬八戒、蔚來汽車、得到APP、荔枝 FM、汽車之家、優(yōu)酷來瘋、攜程愛玩、聚力視頻、百姓網(wǎng)等知名企業(yè)及應(yīng)用。
【免責(zé)聲明】本文僅代表作者本人觀點,與CTI論壇無關(guān)。CTI論壇對文中陳述、觀點判斷保持中立,不對所包含內(nèi)容的準(zhǔn)確性、可靠性或完整性提供任何明示或暗示的保證。請讀者僅作參考,并請自行承擔(dān)全部責(zé)任。

專題