无码人妻精品一区二区三18禁,影音先锋男人AV橹橹色,污污污污污污www网站免费,日韩成人av无码一区二区三区,欧美性受xxxx狂喷水

深入解析 TDengine 中的緩存技術

Mark Wang

2021-10-12 / ,

編者按:本文為根據TDengine Database線上Meetup第四期王明明的分享《TDengine 緩存技術解析》()整理而成。

TDengine是一(yi)款高性能的(de)物聯網大數據平(ping)臺。為了(le)高效處理時序(xu)數據,TDengine中(zhong)大量用到(dao)了(le)緩存(cun)技(ji)術,自己實現了(le)哈希表(biao)、緩存(cun)池等(deng)技(ji)術。本文會為大家講解TDengine中(zhong)用到(dao)的(de)這(zhe)些緩存(cun)技(ji)術。

首先會介紹一下(xia)什么是緩(huan)(huan)存(cun),常用(yong)的緩(huan)(huan)存(cun)技術,最后(hou)重點分享TDengine中的相關(guan)技術,最好講一下(xia)改進(jin)和優(you)化(hua)的方向。下(xia)面我們正式開(kai)始(shi)。

什么是緩存

凡(fan)是位于(yu)速(su)度相差較大的(de)兩(liang)種硬件(jian)之間,用于(yu)協調兩(liang)者數據傳輸速(su)度差異的(de)結(jie)構,均可(ke)稱之為緩(huan)存。

  1. 緩存最早是用來協調CPU和主內存之間的速度差異,進化出了目前的L1/L2/L3三層CPU內部的高速緩存;
  2. 在內存和硬盤之間也有Cache,每次寫磁盤時并沒有立即刷到磁盤上,而是寫入到磁盤緩存中,由操作系統負責flush到磁盤;
  3. 此外,硬盤與網絡之間也有某種意義上的Cache,比如CDN緩存,代理服務器的緩存等等。

緩存工作的原則主(zhu)要是引用的局部(bu)(bu)性,包括空間(jian)局部(bu)(bu)性和時間(jian)局部(bu)(bu)性。

  1. 空間局部性是指CPU在某一時刻需要某個數據,那么很可能下一步就需要其附近的數據,例如加載讀磁盤數據的時候,雖然只需要一部分數據,但是每次都加載一個塊,那么當需要附近數據的時候就可以直接從內存獲取,避免再讀取磁盤。
  2. 時間局部性是指當某個數據被訪問過一次之后,過不了多久時間就會被再一次訪問。例如我們手機后臺運行程序,會把最近打開的應用緩存在后臺,很可能一會兒還會訪問相同的應用,這種情況下直接將其從后臺調到前臺即可。

在使(shi)用緩(huan)存(cun)(cun)時要(yao)根據系統的架構、性能的要(yao)求以及要(yao)解決的問題選擇合適的緩(huan)存(cun)(cun)位置,比如內存(cun)(cun)緩(huan)存(cun)(cun)、 磁盤(pan)緩(huan)存(cun)(cun)、分布式緩(huan)存(cun)(cun)等。

使用緩存有很多優點:

  1. 提高性能,將相應數據存儲起來以避免數據的重復創建、處理和傳輸,可有效提高性能。
  2. 提高穩定性,同一個應用中,對同一數據、邏輯功能的多次請求是經常發生的。當請求量很大時,如果每次請求都進行處理,消耗的資源是很大的浪費,也同時造成系統的不穩定。
  3. 提高可用性,有時,提供數據信息的服務可能會意外停止,如果使用了緩存技術,可以在一定時間內仍正常提供對最終用戶的支持,提高了系統的可用性。

緩(huan)存是有狀(zhuang)態的,包括時間(jian)狀(zhuang)態和(he)空間(jian)狀(zhuang)態。

  1. 時間狀態:應用程序使用的永久數據; 只在進程周期內有效;和特定的用戶會話有關; 處理某個消息的時間內有效。
  2. 空間狀態:應用程序/進程/線程/單機/分布式/用戶/角色。

使用緩存時需要考慮的問題:

  1. 安全性:線程安全/權限安全
  2. 序列化
  3. 緩存數據優化
  4. 提前加載/動態加載
  5. 過期策略:FIFO/LRU/LFU
  6. 管理:效率監控,大小限制

緩存一致性問題:

  1. 當使用分布式的緩存時,需要考慮多個緩存的一致性問題,防止由于不一致出現問題。
  2. 處理一致性問題時需要根據實際的應用場景兼顧CAP原則。根據問題的場景不同,一致性要求也不同,可以強一致性或者弱一致性(最終一致性)。
    1. 比如銀行轉賬場景需要強一致性,數據沒統一之前,不允許用戶進行操作,防止金額出錯。
    2. 大多數互聯網產品為了保證可用性和分區容錯性,通常采用弱一致性,比如不同地區的用戶看到的同一個排行榜可能有非常短暫的不同,但數據同步成功后,排行榜就相同了,這個延遲通常在幾十ms,對于用戶來說是可以接受的。

常用的緩存技術

  1. 使用硬件緩存 (CPU Cache)
  2. 使用本地內存緩存(雙緩沖/環形緩沖/緩沖池)
  3. 使用內存映射文件 (mmap)
  4. 使用數據庫緩存 (Redis/MySQL)

TDengine中的緩存方案

首先我(wo)們來復習一下TDengine的整體架構。

  1. 數據節點(dnode):服務進程,可以包括多個vnode和mnode,查詢數據時需要dnode的網絡位置來獲取數據。
  2. 虛擬節點(vnode):存儲、查詢的基本單位。多個vnode組成一個虛擬節點組(VGroup),分布在不同的機器上,起到備份的效果。同時vnode也便于水平擴展。
  3. 管理節點(mnode):存儲數據庫的元數據,起到管理集群的功能。
深入解析 TDengine 中的緩存技術 - TDengine Database 時序數據庫

再來(lai)看(kan)一(yi)下TDengine的(de)數據(ju)模型(xing)。

  1. 一個采集點一張表(時間戳作為主鍵,順序存儲)
  2. 一張表的數據在文件中以塊的形式連續存放
  3. 文件中的數據塊大小可配
  4. 采用Block Range Index(BRIN)索引塊數據
深入解析 TDengine 中的緩存技術 - TDengine Database 時序數據庫

TDengine中都有(you)哪(na)些數據需要緩存呢(ni)?具體可以分為如(ru)下(xia)幾(ji)類(lei):

  1. 元數據 (table meta/stable vgroup)
  2. 連接數據 (rpc/http session)
  3. 查詢緩存 (qinfo handle/ show info)
  4. 最新數據 (last和last_row)
  5. 時序數據 (buffer pool/ multilevel storage)

接下來我(wo)們就具體看一下TDengine中(zhong)的緩存(cun)(cun)方案。 首先是(shi)通用的哈希緩存(cun)(cun) (meta data/ rpcObj/ qinfo)。

  • 哈希緩存,通過一個列表來管理,每個元素是一個緩存結構,里面包括緩存信息、 哈希表 、垃圾回收鏈表、統計信息、更新頻率、鎖等信息。此外,有一個刷新線程定時檢測緩存列表中過期的數據,將其刪除。
深入解析 TDengine 中的緩存技術 - TDengine Database 時序數據庫
  • 查詢計劃id (query handle)
    • query handle 是數據庫查詢時,server先生產一個執行計劃,返回給client,然后client拿著這個計劃id,分多次去server取數據,直到數據查詢完。這個緩存是消息時間范圍,整個進程內有效的,不需要更新,使用完即釋放。
深入解析 TDengine 中的緩存技術 - TDengine Database 時序數據庫
  • 元數據緩存(meta data)
    • meta data數據主要記錄數據表的scheme,所在的節點地址。通過客戶端緩存meta data可以避免頻繁的向mnode取數據。但是meta數據需要考慮更新一致性問題。通過版本號來控制。
深入解析 TDengine 中的緩存技術 - TDengine Database 時序數據庫

其次(ci)是TSDB內(nei)存(cun)塊緩存(cun) (double buffer/buffer pool)。

  1. TDengine 提供雙緩存/緩存池來優化數據寫入查詢的性能。預分配16M*6的buffer pool,使用超過1/3容量落地,落地時mem轉化為imei(不可變更),負責寫入磁盤。
  2. 直接將最近到達的數據保存在緩存中,可以更加快速地響應用戶針對最近數據的查詢分析,整體上提供更快的數據庫查詢響應能力。
  3. TDengine重啟以后系統的緩存將被清空,之前緩存的數據均會被批量寫入磁盤,之前緩存的數據不會重新加載到緩存中。
  4. 數據查詢時首先通過time range定位數據所在的位置,因為MEM 和 IMEM中都記錄有最新、最舊數據的時間戳。然后如果在MEM中,通過跳表來快速查詢數據位置。在磁盤中,通過磁盤塊文件索引查找數據,最后做結果融合返回。
深入解析 TDengine 中的緩存技術 - TDengine Database 時序數據庫
深入解析 TDengine 中的緩存技術 - TDengine Database 時序數據庫

再來(lai)看(kan)last和last_row緩存(cun) (local storage)。

  1. 時序數據庫總是有對最新一行數據或者某列最新一條數據查詢的需求,因此設計了last和last_row緩存來快速響應用戶需求。防止每次都去磁盤查詢數據。
  2. 每個表開辟緩存區緩存該數據,服務啟動時會全量加載,插入時會更新,此外在配置更新的時候,也會更新緩存數據。比如,默認是關閉的。用戶使用命令開啟緩存功能時,就會加載數據,同理關閉開關時,會釋放之前的緩存區。
深入解析 TDengine 中的緩存技術 - TDengine Database 時序數據庫
深入解析 TDengine 中的緩存技術 - TDengine Database 時序數據庫

最后我們再來看一下多級存儲 (ssd/hdd/cloud)。

由于物聯網的(de)(de)數據(ju)量是巨大(da)的(de)(de),為了(le)很好的(de)(de)平衡性能和(he)成本,TDengine還采用了(le)分級(ji)存(cun)儲的(de)(de)思(si)想,不同熱度數據(ju)存(cun)儲在(zai)不同的(de)(de)地方。分級(ji)存(cun)儲的(de)(de)這(zhe)一思(si)想也體(ti)現在(zai)計算機的(de)(de)體(ti)系結構里(li)(寄存(cun)器(qi)、L1/L2 Cache、內存(cun)、硬(ying)盤)。

深入解析 TDengine 中的緩存技術 - TDengine Database 時序數據庫

緩存對性能提升舉例

  • 測試環境: 12核 i7 3.2GHz 64GB 4T HDD
  • last_row緩存性能對比 (select last_row(*) from stable查詢語句1000次,統計查詢時間)
深入解析 TDengine 中的緩存技術 - TDengine Database 時序數據庫
  • last緩存性能對比 (select last(*) from stable和select last_row(*) from stable查詢語句1000次,統計查詢時間)
深入解析 TDengine 中的緩存技術 - TDengine Database 時序數據庫
  • 開啟緩存性能比不開啟緩存提升將近1個數量級。緩存對系統性能提升還是很大的,所以,在使用TDengine時,可以根據自己的需求,打開或關閉開關

問題及改進優化方向

先來看(kan)問題,主要是(shi)兩點(dian):

  1. mnode的meta數據全量加載,表數量很大時,內存占用大,啟動慢;
  2. last和last_row緩存啟動全量加載。

最(zui)后(hou)我們再來看(kan)一(yi)下優化方(fang)向:

  1. 全量加載改為動態加載;
  2. 預分配緩存大小,通過LRU等策略來更新數據;
  3. qhandle 通過對象池管理,避免頻繁calloc。

如果想(xiang)了解(jie)更具體(ti)的實(shi)現細節(jie),可以(yi)在(zai)上查看相(xiang)關源(yuan)代(dai)碼(ma),也(ye)期(qi)待大家(jia)加(jia)入進來,一起改進TDengine Database!

關于作者:

王明明,北京郵電大(da)學畢業,主修方(fang)向為電子信息、模(mo)式識(shi)別和圖像處理。畢業后(hou)(hou)入職騰訊,先后(hou)(hou)在 TEG 魔王工作室卡牌游戲(xi)開(kai)發(fa)(fa)、騰訊地圖手圖后(hou)(hou)臺(tai)開(kai)發(fa)(fa)、騰訊看點(dian)知識(shi)圖譜后(hou)(hou)臺(tai)開(kai)發(fa)(fa)。對(dui)網絡編程、RPC 框架原理、Redis 緩存等技(ji)術有深入的研究。