中間件--ClickHouse-7--冷熱數據分離,解決Mysql海量數據瓶頸

在web應用中,當數據量非常大時,即使MySQL的存儲能夠滿足,但性能一般也會比較差。此時,可以考慮使用ClickHouse存儲歷史數據,在Mysql存儲最近熱點數據的方式,來優化和提升查詢性能。ClickHouse的設計初衷就是為了解決大規模數據分析場景下的性能問題,特別是在處理OLAP(聯機分析處理)任務時表現優異。

但是,通常不推薦直接使用Clickhouse作為數據庫使用,雖然Clickhouse查詢大數量時表現優秀,但其本身不支持事務,不具備Innodb鎖等機制。Clickhouse其主要作用是優化海量數據的查詢問題,所以結合Mysql做冷熱數據分離的方式更推薦。海量的冷數據存儲在Clickhouse中,最近的熱點數據存儲在Mysql中。

1、ClickHouse vs MySQL在大數據量場景下的對比

在這里插入圖片描述
ClickHouse更適合處理海量數據的分析查詢,而MySQL更擅長事務處理和頻繁的數據修改。

2、具體思路

(1)、數據遷移

  • 如果你的業務已經運行在MySQL上,但發現查詢性能瓶頸,可以將部分數據遷移到ClickHouse中。
  • 通常的做法是將需要頻繁分析的歷史數據或日志數據導入到ClickHouse,而MySQL繼續負責事務處理。
  • 遷移工具:
    • 可以通過ETL工具(如Apache NiFi、DataX等)將數據從MySQL導出并導入到ClickHouse。
    • 或者直接使用ClickHouse的INSERT INTO … SELECT …語句從MySQL中抽取數據。

(2)、數據分層架構

  • MySQL作為主數據庫:用于存儲在線交易數據,支持高頻的增刪改操作。
  • ClickHouse作為分析引擎:定期從MySQL同步數據,或者通過日志(如Binlog)實時訂閱MySQL的變化數據,加載到ClickHouse中進行分析。
  • 這種架構既能保證事務處理的靈活性,又能充分發揮ClickHouse在分析查詢上的優勢。

(3)、查詢分離

  • 將復雜的分析查詢從MySQL轉移到ClickHouse。例如:
    • 如果你需要統計過去一年的用戶行為數據,并按月進行匯總分析,這種查詢可能會讓MySQL不堪重負。
    • 而在ClickHouse中,這類查詢可以在秒級甚至毫秒級完成。

(4)、數據壓縮與列式存儲

  • ClickHouse的列式存儲和高效壓縮算法能夠顯著減少存儲空間占用,同時提高查詢性能。
  • 對于大規模數據集,存儲成本和I/O開銷往往是性能瓶頸的重要因素,ClickHouse在這方面具有明顯優勢。

3、具體案例

  • 場景:電商網站的日志分析
  • 問題:電商平臺每天產生大量的用戶訪問日志和訂單數據,存儲在MySQL中。隨著時間推移,數據量達到TB級別,查詢變得越來越慢。
  • 解決方案:
    (1)、將歷史日志數據從MySQL導出到ClickHouse。
    (2)、在ClickHouse中創建表,并使用MergeTree引擎進行存儲。
    (3)、定期將MySQL中的增量數據同步到ClickHouse。
    (4)、使用ClickHouse執行復雜的分析查詢,例如:

sql示例:

 SELECT toDate(event_time) AS event_date, COUNT(*) AS event_countFROM user_logsWHERE event_date BETWEEN '2025-01-01' AND '2025-01-31'GROUP BY event_date;

這類查詢在ClickHouse中通常只需幾秒鐘即可完成。

4、性能對比

場景:5000萬條日志數據查詢
在這里插入圖片描述
優化效果:

  • 查詢速度提升:200倍以上(從分鐘級到秒級)。
  • 存儲成本降低:壓縮率高達 17倍(10GB → 600MB)。

可以看到,相同的數據放到Mysql和ClickHouse中,占用的內存節省了90%多,查詢的速度也是非常高效的。

5、注意事項

盡管ClickHouse在處理大數據量方面表現出色,但也需要注意以下幾點:

(1)、不適合頻繁更新:

  • ClickHouse不擅長頻繁的單行更新或刪除操作。如果你的業務需要頻繁修改數據,可能需要結合其他工具(如Kafka)來實現增量更新。

(2)、學習曲線:

  • ClickHouse的功能和優化方式與傳統的關系型數據庫有很大不同,團隊可能需要時間熟悉其特性和最佳實踐。

(3)、數據一致性:

  • ClickHouse本身不提供強一致性保證,因此在需要高一致性的場景下,仍需依賴MySQL或其他事務型數據庫。

(4)、硬件需求:

  • ClickHouse對硬件資源(尤其是內存和CPU)要求較高,尤其是在分布式部署時。

6、數據遷移步驟

(1)、數據遷移

步驟 1:定義歷史數據范圍

  • 時間字段:確保 MySQL 表中存在時間字段(如 create_time 或 update_time),用于劃分歷史數據和近期數據。
  • 遷移條件:例如,將三個月之前 create_time < ‘2025-01-12’ 的數據遷移到 ClickHouse。

步驟 2:遷移歷史數據

  • 工具選擇:

    • 全量遷移:使用 mysqldump或mydumper導出歷史數據,通過clickhouse-client導入。
    • 增量遷移(可選):使用 Canal、Debezium 或 TapData 實時捕獲 MySQL 的 Binlog,過濾歷史數據并同步到 ClickHouse。
  • 遷移示例:
    – 在 MySQL 中導出歷史數據(示例)

  mysqldump -u user -p --where="create_time < '2025-01-12'" dbname table_name > history_data.sql

– 轉換為 CSV 格式(如通過腳本或工具)
– 導入到 ClickHouse

  clickhouse-client --query="INSERT INTO clickhouse_table FORMAT CSV" < history_data.csv

步驟 3:清理MySQL中的歷史數據

  • 分區表優化:在 MySQL 中按時間分區,刪除舊分區以釋放空間(參考知識庫[9])。
    – 創建分區表(示例)
  ALTER TABLE mysql_table PARTITION BY RANGE (TO_DAYS(create_time)) (PARTITION p2024 VALUES LESS THAN (TO_DAYS('2025-01-01')),PARTITION p2025 VALUES LESS THAN (TO_DAYS('2026-01-01')));

– 刪除舊分區

  ALTER TABLE mysql_table DROP PARTITION p2024;

(2)、查詢路由實現

方案 1:應用層路由

  • 邏輯判斷:在應用代碼中根據時間條件決定查詢 MySQL 或 ClickHouse。
    python示例:
  def query_data(start_time, end_time):if end_time < '2025-01-12':   // 三個月之前查詢 ClickHousereturn clickhouse_query(...)elif start_time > '2025-01-12':   // 三個月之內查詢 MySQLreturn mysql_query(...)else:合并查詢(如需跨時間范圍)return merge(mysql_query(...), clickhouse_query(...))

方案 2:中間件路由

  • 使用代理工具:如 ProxySQL 或自定義 SQL 路由服務,根據查詢條件動態轉發請求。
  • 示例規則:
    • 若查詢條件中 create_time < ‘2025-01-12’,則路由到 ClickHouse。
    • 否則路由到 MySQL。

7、總結建議

當MySQL在大數據量場景下性能不足時,ClickHouse是一個非常優秀的解決方案,特別是在需要高性能分析查詢的場景中。通過合理的數據分層架構和查詢分離策略,可以充分利用ClickHouse的優勢,同時保留MySQL在事務處理上的靈活性。
不過,ClickHouse并非萬能藥。它最適合的是只讀或批量寫入的大數據分析場景。在引入ClickHouse之前,建議充分評估業務需求,并制定清晰的數據遷移和查詢優化策略。

逆風翻盤,Dare To Be!!!

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

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

相關文章

阿里一面:Nacos配置中心交互模型是 push 還是 pull ?(原理+源碼分析)

對于Nacos大家應該都不太陌生&#xff0c;出身阿里名聲在外&#xff0c;能做動態服務發現、配置管理&#xff0c;非常好用的一個工具。然而這樣的技術用的人越多面試被問的概率也就越大&#xff0c;如果只停留在使用層面&#xff0c;那面試可能要吃大虧。 比如我們今天要討論的…

DAY09:【pytorch】nn網絡層

1、卷積層 1.1 Convolution 1.1.1 卷積操作 卷積運算&#xff1a;卷積核在輸入信號&#xff08;圖像&#xff09;上滑動&#xff0c;相應位置上進行乘加卷積核&#xff1a;又稱為濾波器、過濾器&#xff0c;可認為是某種模式、某種特征 1.1.2 卷積維度 一般情況下&#xf…

Pinpoint - 大型分布式系統的 APM(應用性能管理)工具

文章目錄 一、關于 Pinpoint最新版本&#xff08;2024/10/23&#xff09;-- v3.0.1PHP, PYTHON 二、概述支持的模塊 一、關于 Pinpoint Pinpoint 是一個用于大型分布式系統的 APM&#xff08;應用性能管理&#xff09;工具&#xff0c;由 Java / PHP/PYTHON 編寫。 受 Dapper …

設計模式實踐:模板方法、觀察者與策略模式詳解

目錄 1 模板方法1.1 模板方法基本概念1.2 實驗1.2.1 未使用模板方法實現代碼1.2.2 使用模板方法的代碼 2 觀察者模式2.1 觀察者模式基本概念2.2 實驗 3 策略模式3.1 策略模式基本概念3.2 實驗 1 模板方法 1.1 模板方法基本概念 定義&#xff1a;一個操作中的算法的骨架 &…

Vue 2.0和3.0筆記

Vue 3 關于組件 今天回顧了下2.0關于組件的內容&#xff0c;3.0定義組件的方式多了一種就是通過單文件組件&#xff08;Single-File Component&#xff09;的方式將Vue的模板&#xff0c;邏輯和樣式放到一個文件中&#xff0c;2.0則不同&#xff0c;它是將模板放到一個屬性中…

前端面試-微前端

1. 什么是微前端&#xff1f;它的核心價值是什么&#xff1f; 答案&#xff1a; 微前端是一種將前端應用拆分為獨立模塊的架構模式&#xff0c;每個模塊可由不同團隊獨立開發、測試、部署和運行。其核心價值包括&#xff1a; 技術棧無關性&#xff1a;支持 React、Vue、Angul…

Axure高保真AI算法訓練平臺

點擊下載《Axure高保真AI算法訓練平臺(.rp) 》 原型效果&#xff1a;https://axhub.im/ax9/69fdf8f2b10b59c3/#g1 摘要 本文介紹了一款功能全面且高效的AI算法訓練平臺&#xff0c;旨在為數據科學家、研究人員和工程師提供從數據準備到模型部署的一站式解決方案。該平臺由四大…

Ubuntu服務器日志滿audit:backlog limit exceeded了會報錯解決方案-Linux 審計系統 (auditd) 工具

auditd 是 Linux 系統中的審計守護進程&#xff0c;負責收集、記錄和監控系統安全相關事件。以下是相關工具及其功能&#xff1a; 核心組件 auditd - 審計守護進程 系統的審計服務主程序 收集系統調用信息并寫入日志文件 通常存儲在 /var/log/audit/audit.log auditctl - 審計控…

Windows10系統RabbitMQ無法訪問Web端界面

項目場景&#xff1a; 提示&#xff1a;這里簡述項目相關背景&#xff1a; 項目場景&#xff1a; 在一個基于 .NET 的分布式項目中&#xff0c;團隊使用 RabbitMQ 作為消息隊列中間件&#xff0c;負責模塊間的異步通信。開發環境為 Windows 10 系統&#xff0c;開發人員按照官…

Qt 的 事件隊列

Qt 的 事件隊列 是其核心事件處理機制之一&#xff0c;用于管理和分發系統與用戶生成的事件&#xff08;如鼠標點擊、鍵盤輸入、定時器、信號槽中的隊列連接等&#xff09;。理解 Qt 的事件隊列對多線程、界面響應以及異步處理尤為關鍵。 一、Qt 的事件處理模型概覽 Qt 是基于…

無人機自主導航與路徑規劃技術要點!

一、自主導航與路徑規劃技術要點 1. 傳感器融合 GPS/北斗定位&#xff1a;提供全局定位&#xff0c;但在室內或遮擋環境下易失效。 慣性測量單元&#xff08;IMU&#xff09;**&#xff1a;通過加速度計和陀螺儀實時追蹤姿態&#xff0c;彌補GPS信號丟失時的定位空缺。 …

Before After:SQL整容級優化

首先說明這個優化有一定提升&#xff0c;但不是我所期望的 我接到一個涉及優化的SQL&#xff0c;具體內容實在太長。而且可能也不利于閱讀。于是我脫敏以及簡化一下。SQL中間大量的充斥著 (select 列名1 from t1 where t1.id t2.id ) A, (select 列名2 from t1 where t1.id …

道可云人工智能每日資訊|首屆世界人工智能電影節在法國尼斯舉行

道可云元宇宙每日簡報&#xff08;2025年4月15日&#xff09;訊&#xff0c;今日元宇宙新鮮事有&#xff1a; 杭州《西湖區打造元宇宙產業高地的扶持意見》發布 杭州西湖區人民政府印發《西湖區打造元宇宙產業高地的扶持意見》。該意見已于4月4日正式施行&#xff0c;有效期至…

JVM 為什么需要即時編譯器?

JVM之所以需要即時編譯器 (JIT Compiler)&#xff0c;是為了提高 Java 程序的執行性能&#xff0c;彌補純解釋器執行的不足。 我們可以從以下幾個角度來分析一下這個問題&#xff1a; 1. 解釋器的性能瓶頸: 逐條解釋的開銷: 解釋器需要逐條讀取 Java 字節碼指令&#xff0c;并…

PromptUp 網站介紹:AI助力,輕松創作

1. 網站定位與核心功能 promptup.net 可能是一個面向 創作者、設計師、營銷人員及藝術愛好者 的AI輔助創作平臺,主打 零門檻、智能化的內容生成與優化。其核心功能可能包括: AI藝術創作:通過輸入關鍵詞、選擇主題或拖放模板,快速生成風格多樣的數字藝術作品(如插畫、海報…

ThingsBoard3.9.1 MQTT Topic(1)

1.網關轉發子設備的遙測信息, Topic:v1/gateway/telemetry { "m1": [{ "mode": "CW", "temperature": 23 }], "m2": [{ "mode": "CW", "temperature": 23 }] } 說明&#xff1a;json格式&a…

React 入門教程:構建第一個 React 應用

本教程將帶你從零開始構建你的第一個 React 應用。我們將創建一個簡單的計數器應用&#xff0c;涵蓋 React 的基本概念和開發流程。 準備工作 在開始之前&#xff0c;請確保你的開發環境滿足以下要求&#xff1a; Node.js (建議使用最新的 LTS 版本) npm 或 yarn (Node.js 安…

vue3中,element-plus中el-input的v-model和value的用法示例

el-input的v-model&#xff0c;邦定響應式變量 <el-col :span"6"><el-form-item label"檢驗類別" prop"verifyType"><el-input v-model"applyAllInfo.applyBasicInfo.verifyTypeName" readonly /></el-form-item…

策略模式隨筆~

若感行文枯燥&#xff0c;請移步至文末Gitee地址中查看源碼自行測試感受策略模式之魅力。 一、策略模式的核心概念 策略模式的定義 定義算法族&#xff0c;封裝每個算法&#xff0c;使其可互換。 核心三要素 Context&#xff1a;上下文&#xff0c;負責接收客戶端請求并委托…

Linux的目錄結構(介紹,具體目錄結構)

目錄 介紹 具體目錄結構 簡潔的目錄解釋 詳細的目錄解釋 介紹 Linux的文件系統是采用級層式的樹狀目錄結構&#xff0c;在此結構的最上層是根目錄“/”。Linux的世界中&#xff0c;一切皆文件&#xff08;比如&#xff1a;Linux會把硬件映射成文件來管理&#xff09; 具體目…