ClickHouse的學習與了解

什么是ClickHouse?

ClickHouse是一個用于聯機分析(OLAP)的列式數據庫管理系統(DBMS)。

在傳統的行式數據庫系統中,數據按如下順序存儲:

RowWatchIDJavaEnableTitleGoodEventEventTime
#0893543506621Investor Relations12016/5/18 5:19
#1903295099580Contact us12016/5/18 8:10
#2899537060541Mission12016/5/18 7:38
#N

處于同一行中的數據總是被物理的存儲在一起。

常見的行式數據庫系統有:MySQLPostgresMS SQL Server

在列式數據庫系統中,數據按如下的順序存儲:

Row:#0#1#2#N
WatchID:893543506629032950995889953706054
JavaEnable:101
Title:Investor RelationsContact usMission
GoodEvent:111
EventTime:2016/5/18 5:192016/5/18 8:102016/5/18 7:38

這些示例只顯示了數據的排列順序。來自不同列的值被單獨存儲,來自同一列的數據被存儲在一起。

常見的列式數據庫有: Vertica、 Paraccel (Actian Matrix,Amazon Redshift)、 Sybase IQ、 Exasol、 Infobright、 InfiniDB、 MonetDB (VectorWise, Actian Vector)、 LucidDB、 SAP HANA、 Google Dremel、 Google PowerDrill、 Druid、 kdb+。

不同的數據存儲方式適用不同的業務場景,數據訪問的場景包括:進行了何種查詢、多久查詢一次以及各類查詢的比例;每種類型的查詢(行、列和字節)讀取多少數據;讀取數據和更新之間的關系;使用的數據集大小以及如何使用本地的數據集;是否使用事務,以及它們是如何進行隔離的;數據的復制機制與數據的完整性要求;每種類型的查詢要求的延遲與吞吐量等等。

系統負載越高,依據使用場景進行定制化就越重要,并且定制將會變的越精細。沒有一個系統能夠同時適用所有不同的業務場景。如果系統適用于廣泛的場景,在負載高的情況下,要兼顧所有的場景,那么將不得不做出選擇。是要平衡還是要效率?

OLAP場景的關鍵特征
  • 絕大多數是讀請求

  • 數據以相當大的批次(> 1000行)更新,而不是單行更新;或者根本沒有更新。

  • 已添加到數據庫的數據不能修改。

  • 對于讀取,從數據庫中提取相當多的行,但只提取列的一小部分。

  • 寬表,即每個表包含著大量的列

  • 查詢相對較少(通常每臺服務器每秒查詢數百次或更少)

  • 對于簡單查詢,允許延遲大約50毫秒

  • 列中的數據相對較小:數字和短字符串(例如,每個URL 60個字節)

  • 處理單個查詢時需要高吞吐量(每臺服務器每秒可達數十億行)

  • 事務不是必須的

  • 對數據一致性要求低

  • 每個查詢有一個大表。除了他以外,其他的都很小。

  • 查詢結果明顯小于源數據。換句話說,數據經過過濾或聚合,因此結果適合于單個服務器的RAM中

很容易可以看出,OLAP場景與其他通常業務場景(例如,OLTP或K/V)有很大的不同, 因此想要使用OLTP或Key-Value數據庫去高效的處理分析查詢場景,并不是非常完美的適用方案。例如,使用OLAP數據庫去處理分析請求通常要優于使用MongoDB或Redis去處理分析請求。

列式數據庫更適合OLAP場景的原因

列式數據庫更適合于OLAP場景(對于大多數查詢而言,處理速度至少提高了100倍),下面詳細解釋了原因(通過圖片更有利于直觀理解):

行式
在這里插入圖片描述
采用行式存儲的好處是想查某行所有數據時,可以通過一次磁盤查找加順序讀取就可以全部獲取到。但是當想查所有數據的某列局部數據時,需要不停的查找,或者全表掃描才行,遍歷的很多數據都是為了最終結果的中間遍歷過程,是不需要的。

列式
在這里插入圖片描述
采用列式存儲的好處是,如需要查某列,只需要通過一次磁盤查找就把對應列全部獲取出來。

輸入/輸出
  1. 針對分析類查詢,通常只需要讀取表的一小部分列。在列式數據庫中你可以只讀取你需要的數據。例如,如果只需要讀取100列中的5列,這將幫助你最少減少20倍的I/O消耗。
  2. 由于數據總是打包成批量讀取的,所以壓縮是非常容易的。同時數據按列分別存儲這也更容易壓縮。這進一步降低了I/O的體積。
  3. 由于I/O的降低,這將幫助更多的數據被系統緩存。

例如,查詢?統計每個廣告平臺的記錄數量?需要讀取?廣告平臺ID?這一列,它在未壓縮的情況下需要1個字節進行存儲。如果大部分流量不是來自廣告平臺,那么這一列至少可以以十倍的壓縮率被壓縮。當采用快速壓縮算法,它的解壓速度最少在十億字節(未壓縮數據)每秒。換句話說,這個查詢可以在單個服務器上以每秒大約幾十億行的速度進行處理。這實際上是當前實現的速度。

CPU

由于執行一個查詢需要處理大量的行,因此在整個向量上執行所有操作將比在每一行上執行所有操作更加高效。同時這將有助于實現一個幾乎沒有調用成本的查詢引擎。如果你不這樣做,使用任何一個機械硬盤,查詢引擎都不可避免的停止CPU進行等待。所以,在數據按列存儲并且按列執行是很有意義的。

有兩種方法可以做到這一點:

  1. 向量引擎:所有的操作都是為向量而不是為單個值編寫的。這意味著多個操作之間的不再需要頻繁的調用,并且調用的成本基本可以忽略不計。操作代碼包含一個優化的內部循環。

  2. 代碼生成:生成一段代碼,包含查詢中的所有操作。

這是不應該在一個通用數據庫中實現的,因為這在運行簡單查詢時是沒有意義的。但是也有例外,例如,MemSQL使用代碼生成來減少處理SQL查詢的延遲(只是為了比較,分析型數據庫通常需要優化的是吞吐而不是延遲)。

請注意,為了提高CPU效率,查詢語言必須是聲明型的(SQL或MDX), 或者至少一個向量(J,K)。 查詢應該只包含隱式循環,允許進行優化。

ClickHouse的特性

真正的列式數據庫管理系統

在一個真正的列式數據庫管理系統中,除了數據本身外不應該存在其他額外的數據。這意味著為了避免在值旁邊存儲它們的長度?number?,你必須支持固定長度數值類型。例如,10億個UInt8類型的數據在未壓縮的情況下大約消耗1GB左右的空間,如果不是這樣的話,這將對CPU的使用產生強烈影響。即使是在未壓縮的情況下,緊湊的存儲數據也是非常重要的,因為解壓縮的速度主要取決于未壓縮數據的大小。

這是非常值得注意的,因為在一些其他系統中也可以將不同的列分別進行存儲,但由于對其他場景進行的優化,使其無法有效的處理分析查詢。例如: HBase,BigTable,Cassandra,HyperTable。在這些系統中,你可以得到每秒數十萬的吞吐能力,但是無法得到每秒幾億行的吞吐能力。

需要說明的是,ClickHouse不單單是一個數據庫, 它是一個數據庫管理系統。因為它允許在運行時創建表和數據庫、加載數據和運行查詢,而無需重新配置或重啟服務。

數據壓縮

在一些列式數據庫管理系統中(例如:InfiniDB CE 和 MonetDB) 并沒有使用數據壓縮。但是, 若想達到比較優異的性能,數據壓縮確實起到了至關重要的作用。

除了在磁盤空間和CPU消耗之間進行不同權衡的高效通用壓縮編解碼器之外,ClickHouse還提供針對特定類型數據的專用編解碼器,這使得ClickHouse能夠與更小的數據庫(如時間序列數據庫)競爭并超越它們。

數據的磁盤存儲

許多的列式數據庫(如 SAP HANA, Google PowerDrill)只能在內存中工作,這種方式會造成比實際更多的設備預算。

ClickHouse被設計用于工作在傳統磁盤上的系統,它提供每GB更低的存儲成本,但如果可以使用SSD和內存,它也會合理的利用這些資源。

多核心并行處理

ClickHouse會使用服務器上一切可用的資源,從而以最自然的方式并行處理大型查詢。

多服務器分布式處理

上面提到的列式數據庫管理系統中,幾乎沒有一個支持分布式的查詢處理。 在ClickHouse中,數據可以保存在不同的shard上,每一個shard都由一組用于容錯的replica組成,查詢可以并行地在所有shard上進行處理。這些對用戶來說是透明的

支持SQL
ClickHouse支持一種基于SQL的聲明式查詢語言,它在許多情況下與ANSI SQL標準相同。

支持的查詢GROUP BY, ORDER BY, FROM, JOIN, IN以及非相關子查詢。

相關(依賴性)子查詢和窗口函數暫不受支持,但將來會被實現。

向量引擎

為了高效的使用CPU,數據不僅僅按列存儲,同時還按向量(列的一部分)進行處理,這樣可以更加高效地使用CPU。

實時的數據更新

ClickHouse支持在表中定義主鍵。為了使查詢能夠快速在主鍵中進行范圍查找,數據總是以增量的方式有序的存儲在MergeTree中。因此,數據可以持續不斷地高效的寫入到表中,并且寫入的過程中不會存在任何加鎖的行為。

索引

按照主鍵對數據進行排序,這將幫助ClickHouse在幾十毫秒以內完成對數據特定值或范圍的查找。

適合在線查詢

在線查詢意味著在沒有對數據做任何預處理的情況下以極低的延遲處理查詢并將結果加載到用戶的頁面中。

支持近似計算

ClickHouse提供各種各樣在允許犧牲數據精度的情況下對查詢進行加速的方法:

用于近似計算的各類聚合函數,如:distinct values, medians, quantiles
基于數據的部分樣本進行近似查詢。這時,僅會從磁盤檢索少部分比例的數據。
不使用全部的聚合條件,通過隨機選擇有限個數據聚合條件進行聚合。這在數據聚合條件滿足某些分布條件下,在提供相當準確的聚合結果的同時降低了計算資源的使用。

自適應連接算法

ClickHouse支持自定義JOIN多個表,它更傾向于散列連接算法,如果有多個大表,則使用合并-連接算法

支持數據復制和數據完整性

ClickHouse使用異步的多主復制技術。當數據被寫入任何一個可用副本后,系統會在后臺將數據分發給其他副本,以保證系統在不同副本上保持相同的數據。在大多數情況下ClickHouse能在故障后自動恢復,在一些少數的復雜情況下需要手動恢復。

更多信息,參見 數據復制。

角色的訪問控制

ClickHouse使用SQL查詢實現用戶帳戶管理,并允許角色的訪問控制,類似于ANSI SQL標準和流行的關系數據庫管理系統。

限制

沒有完整的事務支持。
缺少高頻率,低延遲的修改或刪除已存在數據的能力。僅能用于批量刪除或修改數據,但這符合 GDPR。
稀疏索引使得ClickHouse不適合通過其鍵檢索單行的點查詢。

ClickHouse的性能

根據Yandex的內部測試結果,ClickHouse表現出了比同類可比較產品更優的性能。你可以在 這里 查看具體的測試結果。

許多其他的測試也證實這一點。你可以使用互聯網搜索到它們,或者你也可以從 我們收集的部分相關連接 中查看。

單個大查詢的吞吐量

吞吐量可以使用每秒處理的行數或每秒處理的字節數來衡量。如果數據被放置在page cache中,則一個不太復雜的查詢在單個服務器上大約能夠以2-10GB/s(未壓縮)的速度進行處理(對于簡單的查詢,速度可以達到30GB/s)。如果數據沒有在page cache中的話,那么速度將取決于你的磁盤系統和數據的壓縮率。例如,如果一個磁盤允許以400MB/s的速度讀取數據,并且數據壓縮率是3,則數據的處理速度為1.2GB/s。這意味著,如果你是在提取一個10字節的列,那么它的處理速度大約是1-2億行每秒。

對于分布式處理,處理速度幾乎是線性擴展的,但這受限于聚合或排序的結果不是那么大的情況下。

處理短查詢的延遲時間

如果一個查詢使用主鍵并且沒有太多行(幾十萬)進行處理,并且沒有查詢太多的列,那么在數據被page cache緩存的情況下,它的延遲應該小于50毫秒(在最佳的情況下應該小于10毫秒)。 否則,延遲取決于數據的查找次數。如果你當前使用的是HDD,在數據沒有加載的情況下,查詢所需要的延遲可以通過以下公式計算得知: 查找時間(10 ms) * 查詢的列的數量 * 查詢的數據塊的數量。

處理大量短查詢的吞吐量

在相同的情況下,ClickHouse可以在單個服務器上每秒處理數百個查詢(在最佳的情況下最多可以處理數千個)。但是由于這不適用于分析型場景。因此我們建議每秒最多查詢100次。

數據的寫入性能

我們建議每次寫入不少于1000行的批量寫入,或每秒不超過一個寫入請求。當使用tab-separated格式將一份數據寫入到MergeTree表中時,寫入速度大約為50到200MB/s。如果您寫入的數據每行為1Kb,那么寫入的速度為50,000到200,000行每秒。如果您的行更小,那么寫入速度將更高。為了提高寫入性能,您可以使用多個INSERT進行并行寫入,這將帶來線性的性能提升。

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

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

相關文章

安卓11 12系統修改定制化_____修改系統 解鎖system分區 去除data加密 自由刪減系統應用

在定制化系統中。修改系統分區 解鎖system。讓用戶可以自由刪減應用。這個在定制化服務中比較常見。對于此項修改服務。需要我們了解基礎的分區常識以及常用的幾種基礎修改步驟。 通過博文了解?????? 1??????-----修改rom 解鎖 system 分區有什么意義 2????…

JetPack系列教程(八):PDF庫——讓Android應用也能優雅“翻頁”

JetPack系列教程(八):PDF庫——讓Android應用也能優雅“翻頁” 在Android開發的世界里,加載PDF文件一直是個讓人又愛又恨的“小妖精”。愛它,因為PDF是文檔界的“萬能鑰匙”;恨它,因為原生Andr…

Three.js三大組件:場景(Scene)、相機(Camera)、渲染器(Renderer)

上一篇中我們學習了第一個Three.js場景"Hello World"。這一篇就來學習three.js的核心組件。 此圖來源(Three.js中文網) three.js的核心由三大組件構成:場景(Scene)、相機(Camera)和渲染器(Renderer)。下面我將詳細介紹這三大件的作…

AI幻覺終結之后:GPT-5開啟的“可靠性”新賽道與開發者生存指南

摘要: Sam Altman關于GPT-5將基本終結幻覺的宣告,不僅僅是一次技術升級,它標志著一個“萬物皆可AI,但萬事皆需驗證”的混亂時代的結束。本文將從一個全新的戰略視角出發,探討當“可靠性”取代“創造性”成為AI競賽的核…

ubuntu遠程桌面很卡怎么解決?

服務端方案 完成XRDP的性能優化配置: 1. 首先檢查當前的xrdp.ini文件 grep -n "tcp_send_buffer_bytes" /etc/xrdp/xrdp.ini2. 編輯xrdp.ini文件,修改TCP發送緩沖區大小 sudo sed -i s/#tcp_send_buffer_bytes32768/tcp_send_buffer_bytes4194…

[Linux] Linux系統負載監控 Linux服務管理

目錄 Linux系統負載監控 系統負載介紹 查看系統負載 負載解讀 top 命令 Linux服務管理 systemd 介紹 系統啟動管理進程 基本概念 systemd 架構 unit 類型 查看 unit 列表信息 查看單個 unit 信息 控制系統服務 systemctl 命令 unit 配置文件 例:開發…

vector 手動實現 及遇到的各種細節問題

之前對vector的一些功能使用了一下 接下來手動實現一下vector vector的實現和string還是有不小區別的 有很多地方都有細節的問題不同于string的成員變量一個指針一個size一個capacity的成員變量 vector里面存的是三個迭代器iterator 這的迭代器其實就是模版T的指針 這樣就…

OpenStack Neutron中的L2 Agent與L3 Agent:新手友好指南

引言:云網絡的幕后英雄 在當今的云計算世界中,OpenStack作為開源云平臺的佼佼者,為成千上萬的企業提供了靈活、可擴展的基礎設施服務。而在OpenStack的眾多組件中,Neutron(網絡服務)扮演著至關重要的角色—…

【自用】JavaSE--特殊文件Properties與XML、日志技術

特殊文件概述使用特殊文件可以存儲多個有關系的數據,作為系統的配置信息屬性文件類似于鍵值對,一一對應存儲數據(比如用戶名與密碼)XML文件存儲多個用戶的多個屬性更適合,適合存儲更復雜的數據Properties注:這個屬性文件的后綴即使…

中本聰思想與Web3的困境:從理論到現實的跨越

一、中本聰思想的核心精髓中本聰通過比特幣白皮書提出的核心思想,可歸納為三大支柱:去中心化貨幣體系目標:擺脫中央機構控制,避免通貨膨脹和政治干預(如2008年金融危機暴露的中心化風險)。實現路徑&#xf…

Centos 用戶管理

一.創建用戶 在 root賬戶 或 sudo 權限下 1. 創建用戶 useradd xiaoyangzi2.為該用戶設置密碼或修改密碼 passwd xiaoyangzi3. 將用戶加入wheel用戶組 在 CentOS 中,屬于 wheel 組的用戶默認可以使用 sudo 權限。 查看所屬用戶組: groups xiaoyangzi將 xiaoyangzi 加…

C++枚舉算法習題

1. 3的倍數枚舉(基礎)題目:在之間有10和50多少個數是3的倍數?列舉這些數。 解析:枚舉10到50之間的數,判斷是否能被3整除。優化:計算第一個≥10的3的倍數(1234)&#xff0…

【SpringBoot系列-01】Spring Boot 啟動原理深度解析

【SpringBoot系列-01】Spring Boot 啟動原理深度解析 大家好!今天咱們來好好聊聊Spring Boot的啟動原理。估計不少人跟我一樣,剛開始用Spring Boot的時候覺得這玩意兒真神奇,一個main方法跑起來就啥都有了。但時間長了總會好奇:這…

windows環境下使用vscode以及相關插件搭建c/c++的編譯,調試環境

windows下使用vscode搭建c/c的編譯、運行、調試環境,需要注意的是生成的是xxx.exe可執行文件。另外使用的編譯器是mingw,也就是windows環境下的GNU。 我參考的網址是:https://zhuanlan.zhihu.com/p/1936443912806962622 文章分為2種環境搭建…

標準瓦片層級0~20,在EPSG:4326坐標系下,每個像素點代表的度數

在 EPSG:4326(WGS84經緯度坐標系) 下,瓦片層級(Zoom Level)的分辨率以 度/像素 為單位,其計算遵循 TMS Global Geodetic 規范(單位:度)。以下是 標準層級 0 至 20 的分辨…

Unity高級剔除技術全解析

目錄 ?編輯層級剔除(Layer Culling)原理詳解 代碼示例 業務應用場景 距離剔除(Distance Culling)技術細節 進階實現 開放世界優化技巧 視口裁剪(Viewport Culling)多攝像機協作方案 高級應用場景 …

[Linux] Linux文件系統基本管理

目錄 識別文件系統和設備 Linux 中設備 Linux 文件系統 查看設備和文件系統 lsblk命令 df命令 du命令 案例:查看根文件系統中哪個文件占用了最大空間 環境準備 查找過程 掛載和卸載文件系統 環境準備 掛載文件系統 卸載文件系統 卸載失敗處理 lsof …

如何在 Ubuntu 24.04 Server 或 Desktop 上安裝 XFCE

在 Ubuntu 24.04 上更改當前桌面環境或添加新的桌面環境并不是一項艱巨的任務。大多數流行的 Linux 桌面環境,包括 XFCE,都可以通過默認的 Ubuntu 24.04 LTS 系統倉庫安裝。在本教程中,我們將學習如何使用 Tasksel 工具在 Ubuntu Linux 上安裝和配置 XFCE。 訪問終端并運行…

linux下用c++11寫一個UDP回顯程序

需求&#xff1a;1&#xff09;從2個UDP端口接收數據&#xff0c;并在同樣的端口回顯。echo2&#xff09;多個處理線程&#xff0c;多個發送線程&#xff1b;3&#xff09;使用條件變量喚醒&#xff1b;#include <stack> #include <mutex> #include <atomic>…

MySQL 深分頁優化與條件分頁:把 OFFSET 換成“游標”,再用覆蓋索引抄近路

MySQL 深分頁優化與條件分頁:把 OFFSET 換成“游標”,再用覆蓋索引抄近路 這不是“玄學調優”,而是可復制的方案。本文用可復現的 DDL/造數腳本,演示為什么 OFFSET 越大越慢,如何用 條件游標(Keyset Pagination) 替換它,并配上 覆蓋索引。還會教你看 EXPLAIN/EXPLAIN A…