色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于Clickhouse構建新一代日志存儲系統

Linux閱碼場 ? 來源:Linux閱碼場 ? 2024-03-12 14:06 ? 次閱讀

ClickHouse 是2016年開源的用于實時數據分析的一款高性能列式分布式數據庫,支持向量化計算引擎、多核并行計算、高壓縮比等功能,在分析型數據庫中單表查詢速度是最快的。2020年開始在滴滴內部大規模地推廣和應用,服務網約車和日志檢索等核心平臺和業務。本文主要介紹滴滴日志檢索場景從 ES 遷移到 CK 的技術探索。

背景

此前,滴滴日志主要存儲于 ES 中。然而,ES 的分詞、倒排和正排等功能導致其寫入吞吐量存在明顯瓶頸。此外,ES 需要存儲原始文本、倒排索引和正排索引,這增加了存儲成本,并對內存有較高要求。隨著滴滴數據量的不斷增長,ES 的性能已無法滿足當前需求。

在追求降低成本和提高效率的背景下,我們開始尋求新的存儲解決方案。經過研究,我們決定采用 CK 作為滴滴內部日志的存儲支持。據了解,京東、攜程、B站等多家公司在業界的實踐中也在嘗試用 CK 構建日志存儲系統。

挑戰

面臨的挑戰主要來自下面三個方面:

數據量大:每天會產生 PB 級別的日志數據,存儲系統需要穩定地支撐 PB 級數據的實時寫入和存儲。

查詢場景多:在一個時間段內的等值查詢、模糊查詢及排序場景等,查詢需要掃描的數據量較大且查詢都需要在秒級返回。

QPS 高:在 PB 級的數據量下,對 Trace 查詢同時要滿足高 QPS 的要求。

為什么選 Clickhouse

大數據量:CK 的分布式架構支持動態擴縮容,可支撐海量數據存儲。

寫入性能:CK 的 MergeTree 表的寫入速度在200MB/s,具有很高吞吐,寫入基本沒有瓶頸。

查詢性能:CK 支持分區索引和排序索引,具有很高的檢索效率,單機每秒可掃描數百萬行的數據。

存儲成本:CK 基于列式存儲,數據壓縮比很高,同時基于HDFS做冷熱分離,能夠進一步地降低存儲成本。

架構升級

1eeb01ce-df56-11ee-a297-92fbcf53809c.png

舊的存儲架構下需要將日志數據雙寫到 ES 和 HDFS 兩個存儲上,由ES提供實時的查詢,Spark 來分析 HDFS 上的數據。這種設計要求用戶維護兩條獨立的寫入鏈路,導致資源消耗翻倍,且操作復雜性增加。

在新升級的存儲架構中,CK 取代了 ES 的角色,分別設有 Log 集群和 Trace 集群。Log 集群專門存儲明細日志數據,而 Trace 集群則專注于存儲 trace 數據。這兩個集群在物理上相互隔離,有效避免了 log 的高消耗查詢(如 like 查詢)對 trace 的高 QPS 查詢產生干擾。此外,獨立的 Trace 集群有助于防止trace數據過度分散。

日志數據通過 Flink 直接寫入 Log 集群,并通過 Trace 物化視圖從 log 中提取 trace 數據,然后利用分布式表的異步寫入功能同步至 Trace 集群。這一過程不僅實現了 log 與 trace 數據的分離,還允許 Log 集群的后臺線程定期將冷數據同步到 HDFS 中。

新架構僅涉及單一寫入鏈路,所有關于 log 數據冷存儲至 HDFS 以及 log 與 trace 分離的處理均由 CK 完成,從而為用戶屏蔽了底層細節,簡化了操作流程。

考慮到成本和日志數據特點,Log 集群和 Trace 集群均采用單副本部署模式。其中,最大的 Log 集群有300多個節點,Trace 集群有40多個節點。

存儲設計

存儲設計是提升性能最關鍵的部分,只有經過優化的存儲設計才能充分發揮 CK 強大的檢索性能。借鑒時序數據庫的理念,我們將 logTime 調整為以小時為單位進行取整,并在存儲過程中按照小時順序排列數據。這樣,在進行其他排序鍵查詢時,可以快速定位到所需的數據塊。例如,查詢一個小時內數據時,最多只需讀取兩個索引塊,這對于處理海量日志檢索至關重要。

以下是我們根據日志查詢特性和 CK 執行邏輯制定的存儲設計方案,包括 Log 表、Trace 表和 Trace 索引表:

Log 表

Log 表旨在為明細日志提供存儲和查詢服務,它位于 Log 集群中,并由 Flink 直接從 Pulsar 消費數據后寫入。每個日志服務都對應一張 Log 表,因此整個 Log 集群可能包含數千張 Log 表。其中,最大的表每天可能會生成 PB 級別的數據。鑒于 Log 集群面臨表數量眾多、單表數據量大以及需要進行冷熱數據分離等挑戰,以下是針對 Log 表的設計思路:

CREATE TABLE ck_bamai_stream.cn_bmauto_local
(
    `logTime` Int64 DEFAULT 0, -- log打印的時間
    `logTimeHour` DateTime MATERIALIZED toStartOfHour(toDateTime(logTime / 1000)), -- 將logTime向小時取整
    `odinLeaf` String DEFAULT '',
    `uri` LowCardinality(String) DEFAULT '',
    `traceid` String DEFAULT '',
    `cspanid` String DEFAULT '',
    `dltag` String DEFAULT '',
    `spanid` String DEFAULT '',
    `message` String DEFAULT '',
    `otherColumn` Map,
    `_sys_insert_time` DateTime MATERIALIZED now()
)
ENGINE = MergeTree
PARTITION BY toYYYYMMDD(logTimeHour)
ORDER BY (logTimeHour,odinLeaf,uri,traceid)
TTL _sys_insert_time + toIntervalDay(7),_sys_insert_time + toIntervalDay(3) TO VOLUME 'hdfs'
SETTINGSindex_granularity=8192,min_bytes_for_wide_part=31457280

分區鍵:根據查詢特點,幾乎所有的 sql 都只會查1小時的數據,但這里只能按天分區,小時分區導致 Part 過多及 HDFS 小文件過多的問題。

排序鍵:為了快速定位到某一個小時的數據,基于 logTime 向小時取整物化了一個新的字段 logTimeHour,將 logTimeHour 作為第一排序鍵,這樣就能將數據范圍鎖定在小時級別,由于大部分查詢都會指定上 odinLeaf、uri、traceid,依據基數從小到大分別將其作為第二、三、四排序鍵,這樣查詢某個 traceid 的數據只需要讀取少量的索引塊,經過上述的設計所有的等值查詢都能達到毫秒級。

Map 列:引入了 Map 類型,實現動態的 Scheme,將不需要用來過濾的列統統放入 Map 中,這樣能有效減少 Part 的文件數,避免 HDFS 上出現大量小文件。

Trace 表

Trace 表是用來提供 trace 相關的查詢,這類查詢對 QPS 要求很高,創建在 Trace 集群。數據來源于從 Log 表中提取的 trace 記錄。Trace 表只會有一張,所有的 Log 表都會將 trace 記錄提取到這張 Trace 表,實現的方式是 Log 表通過物化視圖觸發器跨集群將數據寫到 Trace 表中。

Trace 表的難點在于查詢速度快且 QPS 高,以下是 Trace 表的設計思路:

CREATE TABLE ck_bamai_stream.trace_view
(
    `traceid` String,
    `spanid` String,
    `clientHost` String,
    `logTimeHour` DateTime,
    `cspanid` AggregateFunction(groupUniqArray, String),
    `appName` SimpleAggregateFunction(any, String),
    `logTimeMin` SimpleAggregateFunction(min, Int64),
    `logTimeMax` SimpleAggregateFunction(max, Int64),
    `dltag` AggregateFunction(groupUniqArray, String),
    `uri` AggregateFunction(groupUniqArray, String),
    `errno` AggregateFunction(groupUniqArray, String),
    `odinLeaf` SimpleAggregateFunction(any, String),
    `extractLevel` SimpleAggregateFunction(any, String)
)
ENGINE = AggregatingMergeTree
PARTITION BY toYYYYMMDD(logTimeHour)
ORDER BY (logTimeHour, traceid, spanid, clientHost)
TTL logTimeHour + toIntervalDay(7)
SETTINGS index_granularity = 1024

AggregatingMergeTree:Trace 表采用了聚合表引擎,會按 traceid 進行聚合,能很大程度的聚合 trace 數據,壓縮比在5:1,能極大地提升 Trace 表的檢索速度。

分區鍵和排序鍵:與 Log 的設計類似。

index_granularity:這個參數是用來控制稀疏索引的粒度,默認是8192,減小這個參數是為了減少數據塊中無效的數據掃描,加快 traceid 的檢索速度。

Trace 索引表

Trace 索引表的主要作用是加快 order_id、driver_id、driver_phone 等字段查詢 traceid 的速度。為此,我們給需要加速的字段創建了一個聚合物化視圖,以提高查詢速度。數據則是通過為 Log 表創建相應的物化視圖觸發器,將數據提取到 Trace 索引表中。

以下是建立 Trace 索引表的語句:

CREATE TABLE orderid_traceid_index_view
(
    `order_id` String,
    `traceid` String,
    `logTimeHour` DateTime
)
ENGINE = AggregatingMergeTree
PARTITION BY logTimeHour
ORDER BY (order_id, traceid)
TTL logTimeHour + toIntervalDay(7)
SETTINGS index_granularity = 1024

存儲設計的核心目標是提升查詢性能。接下來,我將介紹從 ES 遷移至 CK 過程中,在這一架構下所面臨的穩定性問題及其解決方法。

穩定性之路

支撐日志場景對 CK 來說是非常大的挑戰,面臨龐大的寫入流量及超大集群規模,經過一年的建設,我們能夠穩定的支撐重點節假日的流量高峰,下面的篇幅主要是介紹了在支撐日志場景過程中,遇到的一些問題。

大集群小表數據碎片化問題

在 Log 集群中,90%的 Log 表流量低于10MB/s。若將所有表的數據都寫入數百個節點,會導致大量小表數據碎片化問題。這不僅影響查詢性能,還會對整個集群性能產生負面影響,并為冷數據存儲到 HDFS 帶來大量小文件問題。

為解決大規模集群帶來的問題,我們根據表的流量大小動態分配寫入節點。每個表分配的寫入節點數量介于2到集群最大節點數之間,均勻分布在整個集群中。Flink 通過接口獲取表的寫入節點列表,并將數據寫入相應的 CK 節點,有效解決了大規模集群數據分散的問題。

寫入限流及寫入性能提升

在滴滴日志場景中,晚高峰和節假日的流量往往會大幅增加。為避免高峰期流量過大導致集群崩潰,我們在 Flink 上實現了寫入限流功能。該功能可動態調整每張表寫入集群的流量大小。當流量超過集群上限時,我們可以迅速降低非關鍵表的寫入流量,減輕集群壓力,確保重保表的寫入和查詢不受影響。

同時為了提升把脈的寫入性能,我們基于 CK 原生 TCP 協議開發了 Native-connector。相比于 HTTP 協議,Native-connector 的網絡開銷更小。此外,我們還自定義了數據類型的序列化機制,使其比之前的 Parquet 類型更高效。啟用 Native-connector 后,寫入延遲率從之前的20%降至5%,整體寫入性能提升了1.2倍。

HDFS 冷熱分離的性能問題

用 HDFS 來存儲冷數據,在使用的過程中出現以下問題:

服務重啟變得特別慢且 Sys cpu 被打滿,原因是在服務重啟的過程中需要并發的加載 HDFS 上 Part 的元數據,而 libhdfs3 庫并發讀 HDFS 的性能非常差,每當讀到文件末尾都會拋出異常打印堆棧,產生了大量的系統調用。

當寫入歷史分區的數據時,數據不會落盤,而是直接往 HDFS 上寫,寫入性能很差,并且直接寫到 HDFS 的數據還需要拉回本地 merge,進一步降低了 merge 的性能。

本地的 Part 路徑和 HDFS 的路徑是通過 uuid 來映射的,所有表的數據都是存儲在 HDFS 的同一路徑下,導致達到了 HDFS 目錄文件數 100w 的限制。

HDFS 上的 Part 文件路徑映射關系是存儲在本地的,如果出現節點故障,那么文件路徑映射關系將會丟失,HDFS 上的數據丟失且無法被刪除。

為此我們對 HDFS 冷熱分離功能進行了比較大的改造來解決上面的問題,解決 libhdfs3 庫并發讀 HDFS 的問題并在本地緩存 HDFS 的 Part 元數據文件,服務的啟動速度由原來的1小時到1分鐘。

1f007dd8-df56-11ee-a297-92fbcf53809c.png

同時禁止歷史數據直接寫 HDFS ,必須先寫本地,merge 之后再上傳到 HDFS ,最后對 HDFS 的存儲路徑進行改造。由原來數據只存儲在一個目錄下改為按cluster/shard/database/table/ 進行劃分,并按表級別備份本地的路徑映射關系到 HDFS。這樣一來,當節點故障時,可以通過該備份恢復 HDFS 的數據。

收益

在日志場景中,我們已經成功完成了從 ES 到 CK 的遷移。目前,CK 的日志集群規模已超過400個物理節點,寫入峰值流量達到40+GB/s,每日查詢量約為1500萬次,支持的 QPS 峰值約為200。相較于 ES,CK 的機器成本降低了30%。

1f140c2c-df56-11ee-a297-92fbcf53809c.png

查詢速度相比 ES 提高了約4倍。下圖展示了 bamailog 集群和 bamaitrace 集群的 P99 查詢耗時情況,基本都在1秒以內。

1f240ae6-df56-11ee-a297-92fbcf53809c.png

總結

將日志從 ES 遷移至 CK 不僅可以顯著降低存儲成本,還能提供更快的查詢體驗。經過一年多的建設和優化,系統的穩定性和性能都有了顯著提升。然而,在處理模糊查詢時,集群的資源消耗仍然較大。未來,我們將繼續探索二級索引、zstd 壓縮以及存算分離等技術手段,以進一步提升日志檢索性能。

審核編輯:黃飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1372

    瀏覽量

    79144
  • 存儲系統
    +關注

    關注

    2

    文章

    413

    瀏覽量

    40880
  • HDFS
    +關注

    關注

    1

    文章

    30

    瀏覽量

    9616
  • 大數據
    +關注

    關注

    64

    文章

    8897

    瀏覽量

    137527

原文標題:滴滴基于 Clickhouse 構建新一代日志存儲系統

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    網絡存儲系統可生存性量化評估

    【作者】:張益;霍珊珊;【來源】:《清華大學學報(自然科學版)》2009年S2期【摘要】:針對當前網絡存儲系統可生存性評估缺乏系統的評估指標和量化評估方法的現狀,提出了量化評估指標體系和基于多指標
    發表于 04-24 09:43

    Centos7下如何搭建ClickHouse列式存儲數據庫

    ,主要適合于批量數據處理和即時查詢。(2)數據壓縮在些列式數據庫管理系統中不是用數據壓縮。但是, 數據壓縮在實現優異的存儲系統中確實起著關鍵的作用。(3)數據的磁盤存儲許多的列式數據
    發表于 01-05 18:03

    新一代軍用通信系統的挑戰

    新一代軍用通信系統挑戰
    發表于 03-02 06:21

    如何構建個PCI-E架構的實時海量存儲系統

    如何設計個基于PC主機北橋的長時間不間斷高速采集和存儲系統。本文最后介紹了利用PC主機、PCI-E接口芯片PEX8311、Switch芯片PEX8616和RAID磁盤陣列卡,構建
    發表于 04-15 06:32

    什么是云存儲?云存儲系統的結構是如何構成的?

    到底什么是云存儲?云存儲系統的結構是如何構成的?云存儲有哪些技術前提?
    發表于 06-02 06:27

    存儲系統的層次結構

    文章目錄存儲系統的層次結構技術指標層次結構局部性原理主存儲器讀寫存儲器只讀存儲存儲器地址譯碼主存空間分配高速緩沖
    發表于 07-29 09:47

    存儲系統的層次結構是怎樣的?

    存儲系統的層次結構是怎樣的?怎么解決容量/速度和價格矛盾的問題?
    發表于 11-02 09:22

    基于FPGA的微型數字存儲系統設計

    基于FPGA的微型數字存儲系統設計 1 引言    針對航天測試系統的應用需求,提出種基于FPGA的微型數字存儲系統設計方案。該
    發表于 11-04 10:46 ?857次閱讀
    基于FPGA的微型數字<b class='flag-5'>存儲系統</b>設計

    公有云存儲系統性能評測方法研究

    存儲系統;測試環境構建復雜,測試時間長,準備測試環境成本高;受網絡因素及外界其他因素影響,評測結果不穩定。針對以上所述云存儲系統性能評測的重點和難點,提出種云測試云的公有云
    發表于 12-03 11:48 ?0次下載
    公有云<b class='flag-5'>存儲系統</b>性能評測方法研究

    富士通推出全新企業級全閃存儲系統系列產品:性能較上一代提升了30%以上

    富士通面向中國市場推出了全新的企業級全閃存存儲系統ETERNUS AF S2系列,官方稱新一代產品高度優化了算法、提升了緩存的容量、更換了更快速的處理器和光纖接口,新一代ETERNUS AF S2的性能較上
    發表于 07-24 15:27 ?869次閱讀

    如何使用iSCSI技術構建IP SAN網絡存儲系統的方法概述

    本文簡要介紹了主要存儲技術DAS、NAS及SAN的組成結構、原理、優點和缺陷。詳細分析了iSCSI技術標準的主要內容,闡述了用iSCSI技術構建IP SAN網絡存儲系統的解決方案。
    發表于 12-10 16:47 ?8次下載
    如何使用iSCSI技術<b class='flag-5'>構建</b>IP SAN網絡<b class='flag-5'>存儲系統</b>的方法概述

    新華三推出全新一代存儲系統

    據了解,全新的Primera存儲系統實現了存儲介質從HDD到SSD的質變,并做到了前所未有的100% SLA。而通過存儲協議、互聯架構、控制器、OS和應用層面的創新,Primera也實現了在性能、體驗和感知層面的全面超越。
    發表于 08-09 10:28 ?594次閱讀

    新華三推出全新一代數據存儲系統Primera

    紫光集團旗下新華三集團(以下簡稱新華三)以“天生極智·閃耀未來”為主題在天津正式發布全新一代關鍵業務智能存儲系統Primera。
    發表于 08-15 11:04 ?933次閱讀

    浪潮信息以新一代存儲核心構建新一代集中式和分布式存儲平臺

    隨著數字化轉型的持續深入,各行業用戶面臨的數據存儲挑戰也與日俱增。在此背景下,浪潮信息基于“存儲即平臺”戰略,以新一代G6存儲為核心,構建
    的頭像 發表于 12-06 12:22 ?3243次閱讀
    浪潮信息以<b class='flag-5'>新一代</b><b class='flag-5'>存儲</b>核心<b class='flag-5'>構建</b><b class='flag-5'>新一代</b>集中式和分布式<b class='flag-5'>存儲</b>平臺

    日志結構存儲下數據放置的方法淺析

    日志結構存儲在當今存儲系統中被廣泛使用,然而其中的垃圾回收會將有效數據重新寫入導致寫放大現象。
    發表于 07-28 10:31 ?414次閱讀
    <b class='flag-5'>日志</b>結構<b class='flag-5'>存儲</b>下數據放置的方法淺析
    主站蜘蛛池模板: 暖暖视频在线高清播放| 97国产精品久久精品国产| 亚洲精品AV一区午夜福利| 在线免费观看毛片网站| 扒开老师粉嫩的泬10P| 伦理片午夜在线视频| 亚洲成人一区| 国产精品无码视频一区二区| 秋霞电影网午夜鲁丝片| 51精品少妇人妻AV一区二区| 精品国产99久久久久久麻豆| 无码内射成人免费喷射| 德国xxxx| 日本熟妇乱妇熟色在线电影| japanesen女同| 男欢女爱免费视频| 最近2019中文字幕免费| 精品亚洲视频在线观看| 亚婷婷洲AV久久蜜臀无码| 第一次处破女完整版电影| 欧美亚洲日韩在线在线影院| 小SB几天没做SAO死了H| 粗好大用力好深快点漫画| 久久青草免费线观最新| 欧美特级特黄a大片免费| 网红刘婷hd国产高清| 欧洲美女人 一级毛片| 麻豆第一区MV免费观看网站| 久久 这里只精品 免费| 久久精品天天爽夜夜爽| 乱叫抽搐流白浆免费视频| 手机看片成人| 国产午夜精品一区二区| 亚洲色欲啪啪久久WWW综合网| 久久久久综合网久久| 超碰免费视频部落格| 亚洲精品午夜aaa级久久久久| 看全色黄大色大片免费久黄久| 被肉日常np快穿高h| 亚洲欧洲日韩国产一区二区三区| 老师掀开短裙让我挺进动态|