click house 概覽

clickhouse

what‘s it

面向列的數(shù)據(jù)庫管理系統(tǒng)亲配,可用于olap

ClickHouse允許在運(yùn)行時(shí)創(chuàng)建表和數(shù)據(jù)庫余耽,加載數(shù)據(jù)和運(yùn)行查詢眉孩,而無需重新配置和重新啟動(dòng)服務(wù)器渐苏。

數(shù)據(jù)壓縮

LZ4和ZSTD

好處:節(jié)省空間,降低網(wǎng)絡(luò)IO骄呼,磁盤IO

壞處:內(nèi)存中解壓縮共苛,增大cpu負(fù)載,查詢同樣不壓縮的數(shù)據(jù)性能相比較會(huì)有所下降

參考文章

多核心并行處理

簡言之就是支持任務(wù)并行處理谒麦,并行度取決整個(gè)集群的core的數(shù)量俄讹。利用可利用的一切資源去執(zhí)行任務(wù)

較為支持sql

支持的查詢包括 GROUP BY,ORDER BY绕德,IN患膛,JOIN以及非相關(guān)子查詢。不支持窗口函數(shù)和相關(guān)子查詢耻蛇。

向量搜索引擎

這個(gè)比較復(fù)雜踪蹬,采用knn胞此,kdtree等算法。

好處就是在精度不做特別要求時(shí)跃捣,速度要快

壞處就是消耗更多的資源

適用于topn場景

參考

支持索引

按照主鍵對(duì)數(shù)據(jù)進(jìn)行物理排序

在線計(jì)算

即現(xiàn)查現(xiàn)算

近似計(jì)算

用于近似計(jì)算的各類聚合函數(shù)漱牵,如:distinct values, medians, quantiles

基于數(shù)據(jù)的部分樣本進(jìn)行近似查詢。這時(shí)疚漆,僅會(huì)從磁盤檢索少部分比例的數(shù)據(jù)酣胀。

不使用全部的聚合條件,通過隨機(jī)選擇有限個(gè)數(shù)據(jù)聚合條件進(jìn)行聚合娶聘。這在數(shù)據(jù)聚合條件滿足某些分布條件下闻镶,在提供相當(dāng)準(zhǔn)確的聚合結(jié)果的同時(shí)降低了計(jì)算資源的使用。

限制

1.沒有完整的事務(wù)支持丸升。2.缺少高頻率铆农,低延遲的修改或刪除已存在數(shù)據(jù)的能力。僅能用于批量刪除或修改數(shù)據(jù)狡耻,但這符合 GDPR墩剖。3.稀疏索引使得ClickHouse不適合通過其鍵檢索單行的點(diǎn)查詢。

ps :ck是數(shù)據(jù)庫管理系統(tǒng)不是數(shù)據(jù)庫

how to use

安裝

sudo yum install yum-utilssudo rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPGsudo yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/clickhouse.reposudo yum install clickhouse-server clickhouse-clientsudo /etc/init.d/clickhouse-server startclickhouse-client

常用運(yùn)維命令

clickhouse start|stop|restart

clickhouse-client

日志路徑

/var/log/clickhouse-server/

常見問題

啟動(dòng)失敗

· 端口沖突夷狰,需要修改岭皂,修改文件conf.xml

需要設(shè)置密碼和登錄端口

常用配置文件 user.xml conf.xml

· 開啟遠(yuǎn)程訪問需要修改conf.xml

· 設(shè)置密碼需要修改user.xml

web訪問

http://ui.tabix.io/#!/sql

接口層

jdbc/odbc

clickhouse-client

mysql

· 即通過mysql客戶端工具鏈接ck

· 參考

http客戶端

· 即restapi操作

· 參考

第三方

tabix

https://clickhouse.tech/docs/en/interfaces/third-party/integrations/

HouseOps

DBeaver

DataGrip

數(shù)據(jù)格式

最為常見的就是csv格式,其他的見官網(wǎng)

引擎

概述

· 一般在創(chuàng)建數(shù)據(jù)庫的時(shí)候不指定引擎,默認(rèn)使用的就是clickhouse自己的引擎,也可以指定使用mysql的引擎,就是可以在clickhouse中調(diào)用mysql 中的數(shù)據(jù),進(jìn)行查詢,也可以使用 lazy引擎.

數(shù)據(jù)庫引擎

· 延時(shí)引擎Lazy

? CREATE DATABASE testlazy ENGINE = Lazy(expiration_time_in_seconds);

? 日志引擎孵淘,在該數(shù)據(jù)庫下只能創(chuàng)建 log 系列引擎的表

· MySQL

? MySQL引擎用于將遠(yuǎn)程的MySQL服務(wù)器中的表映射到ClickHouse中蒲障,并允許對(duì)表進(jìn)行INSERT和SELECT查詢MySQL數(shù)據(jù)庫引擎會(huì)將對(duì)其的查詢轉(zhuǎn)換為MySQL語法并發(fā)送到MySQL服務(wù)器中,可以執(zhí)行諸如SHOW TABLES或SHOW CREATE TABLE之類的操作瘫证。無法對(duì)其執(zhí)行以下操作:RENAMECREATE TABLEALTER

? CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]ENGINE = MySQL('host:port', ['database' | database], 'user', 'password')

? host:port — 鏈接的MySQL地址。database — 鏈接的MySQL數(shù)據(jù)庫庄撮。user — 鏈接的MySQL用戶背捌。password — 鏈接的MySQL用戶密碼

· Ordinary

? 默認(rèn)引擎

? 在這種數(shù)據(jù)庫下面的表可以是任意類型引擎。

· Dictionary

? 字典引擎洞斯,此類數(shù)據(jù)庫會(huì)自動(dòng)為所有數(shù)據(jù)字典創(chuàng)建它們的數(shù)據(jù)表(加載配置文件中配置的字段表信息和數(shù)據(jù))

· Memory

? 內(nèi)存引擎毡庆,用戶存放臨時(shí)數(shù)據(jù),數(shù)據(jù)只會(huì)在內(nèi)存中烙如,不會(huì)涉及任何磁盤操作么抗,當(dāng)服務(wù)重啟后數(shù)據(jù)會(huì)清空。并且對(duì)表引擎也有限制亚铁,只能使用memory類型表引擎蝇刀。

? 所有數(shù)據(jù)只會(huì)保存在內(nèi)存中,服務(wù)重啟數(shù)據(jù)消失.

表引擎

· log系列

? log系列表引擎功能相對(duì)簡單,主要用于快速寫入小表(1百萬行左右的表)徘溢,然后全部讀出的場景

? 表引擎的共性是:數(shù)據(jù)被順序append寫到磁盤上吞琐;不支持delete捆探、update;不支持index站粟;不支持原子性寫;insert會(huì)阻塞select操作。

? TinyLog

? 不支持并發(fā)讀取數(shù)據(jù)文件钉嘹,查詢性能較差蜕煌;格式簡單,適合用來暫存中間數(shù)據(jù)切诀;

? create table test(a UInt16 ,b string) ENGINE =TinyLog

? StripLog

? 支持并發(fā)讀取數(shù)據(jù)文件揩环,查詢性能比TinyLog好;將所有列存儲(chǔ)在同一個(gè)大文件中趾牧,減少了文件個(gè)數(shù)检盼;

? create table test(a UInt16 ,b string) ENGINE =StripLog

? Log

? 支持并發(fā)讀取數(shù)據(jù)文件,查詢性能比TinyLog好翘单;每個(gè)列會(huì)單獨(dú)存儲(chǔ)在一個(gè)獨(dú)立文件中

? create table test(a UInt16 ,b string) ENGINE =Log

· Integration系列

? Kafka

? 將Kafka Topic中的數(shù)據(jù)直接導(dǎo)入到ClickHouse吨枉;

? create table test(a UInt16 ,b string)ENGINE=Kafka SETTINGS kafka_broker_list='localhost:9092',kafak_topic_list='topic',kafka_group_name='groupname',kafka_formta='JSONEachRow',kafka_num_consumers=4

? MySQL

? 將Mysql作為存儲(chǔ)引擎,直接在ClickHouse中對(duì)MySQL表進(jìn)行select等操作哄芜;

? create table test(a UInt16 ,b string) ENGINE=MySQL('localhost:3306',''databases',username','password',)

? JDBC/ODBC

? 通過指定jdbc貌亭、odbc連接串讀取數(shù)據(jù)源;

? create table test(a UInt16 ,b string)ENGINE =ODBC('DSN=mysqlconn','test','test')

? create table test(a UInt16 ,b string)ENGINE =JDBC('jdbc:mysql://localhost:3306/?'user=username&password=password ,'test','test')

? HDFS

? 直接讀取HDFS上的特定格式的數(shù)據(jù)文件认臊;

? create table test(a UInt16 ,b string) ENGINE=HDFS('hdfs://clustername:9000/data','TSV')

· MergeTree系列

? MergeTree

? ReplacingMergeTree

? CollapsingMergeTree

? VersionedCollapsingMergeTree

? SummingMergeTree

? AggregatingMergeTree

? 詳情點(diǎn)擊

· Special系列

? Memory

? 將數(shù)據(jù)存儲(chǔ)在內(nèi)存中圃庭,重啟后會(huì)導(dǎo)致數(shù)據(jù)丟失。查詢性能極好失晴,適合于對(duì)于數(shù)據(jù)持久性沒有要求的1億一下的小表剧腻。在ClickHouse中,通常用來做臨時(shí)表涂屁。

? Buffer

? 為目標(biāo)表設(shè)置一個(gè)內(nèi)存buffer书在,當(dāng)buffer達(dá)到了一定條件之后會(huì)flush到磁盤。

? File

? 直接將本地文件作為數(shù)據(jù)存儲(chǔ)拆又;

? Null

? 寫入數(shù)據(jù)被丟棄儒旬、讀取數(shù)據(jù)為空;

SQL

https://clickhouse.tech/docs/zh/sql-reference/syntax/

how to work

架構(gòu)

向量化執(zhí)行引擎

[圖片上傳失敗...(image-5f11cd-1609924266376)]

· 向量化執(zhí)行帖族,可以簡單地看作一項(xiàng)消除程序中循環(huán)的優(yōu)化栈源。這里用一個(gè)形象的例子比喻。小胡經(jīng)營了一家果汁店竖般,雖然店里的鮮榨蘋果汁深受大家喜愛甚垦,但客戶總是抱怨制作果汁的速度太慢。小胡的店里只有一臺(tái)榨汁機(jī),每次他都會(huì)從籃子里拿出一個(gè)蘋果制轰,放到榨汁機(jī)內(nèi)等待出汁前计。如果有8個(gè)客戶,每個(gè)客戶都點(diǎn)了一杯蘋果汁垃杖,那么小胡需要重復(fù)循環(huán)8次上述的榨汁流程男杈,才能榨出8杯蘋果汁。如果制作一杯果汁需要5分鐘调俘,那么全部制作完畢則需要40分鐘伶棒。為了提升果汁的制作速度,小胡想出了一個(gè)辦法彩库。他將榨汁機(jī)的數(shù)量從1臺(tái)增加到了8臺(tái)肤无,這么一來,他就可以從籃子里一次性拿出8個(gè)蘋果骇钦,分別放入8臺(tái)榨汁機(jī)同時(shí)榨汁宛渐。此時(shí),小胡只需要5分鐘就能夠制作出8杯蘋果汁眯搭。為了制作n杯果汁窥翩,非向量化執(zhí)行的方式是用1臺(tái)榨汁機(jī)重復(fù)循環(huán)制作n次,而向量化執(zhí)行的方式是用n臺(tái)榨汁機(jī)只執(zhí)行1次鳞仙。

· 為了實(shí)現(xiàn)向量化執(zhí)行寇蚊,需要利用CPU的SIMD指令。SIMD的全稱是Single Instruction Multiple Data棍好,即用單條指令操作多條數(shù)據(jù)≌贪叮現(xiàn)代計(jì)算機(jī)系統(tǒng)概念中,它是通過數(shù)據(jù)并行以提高性能的一種實(shí)現(xiàn)方式 ( 其他的還有指令級(jí)并行和線程級(jí)并行 )借笙,它的原理是在CPU寄存器層面實(shí)現(xiàn)數(shù)據(jù)的并行操作扒怖。在計(jì)算機(jī)系統(tǒng)的體系結(jié)構(gòu)中,存儲(chǔ)系統(tǒng)是一種層次結(jié)構(gòu)业稼。典型服務(wù)器計(jì)算機(jī)的存儲(chǔ)層次結(jié)構(gòu)如圖1所示姚垃。一個(gè)實(shí)用的經(jīng)驗(yàn)告訴我們,存儲(chǔ)媒介距離CPU越近盼忌,則訪問數(shù)據(jù)的速度越快

· 從上圖中可以看到,從左向右掂墓,距離CPU越遠(yuǎn)谦纱,則數(shù)據(jù)的訪問速度越慢。從寄存器中訪問數(shù)據(jù)的速度君编,是從內(nèi)存訪問數(shù)據(jù)速度的300倍跨嘉,是從磁盤中訪問數(shù)據(jù)速度的3000萬倍。所以利用CPU向量化執(zhí)行的特性吃嘿,對(duì)于程序的性能提升意義非凡祠乃。

多線程與分布式

多主架構(gòu)

數(shù)據(jù)分片與分布式查詢

· 數(shù)據(jù)分片是將數(shù)據(jù)進(jìn)行橫向切分梦重,這是一種在面對(duì)海量數(shù)據(jù)的場景下,解決存儲(chǔ)和查詢瓶頸的有效手段亮瓷,是一種分治思想的體現(xiàn)琴拧。ClickHouse支持分片,而分片則依賴集群嘱支。每個(gè)集群由1到多個(gè)分片組成蚓胸,而每個(gè)分片則對(duì)應(yīng)了ClickHouse的1個(gè)服務(wù)節(jié)點(diǎn)。分片的數(shù)量上限取決于節(jié)點(diǎn)數(shù)量 ( 1個(gè)分片只能對(duì)應(yīng)1個(gè)服務(wù)節(jié)點(diǎn) )除师。

· ClickHouse并不像其他分布式系統(tǒng)那樣沛膳,擁有高度自動(dòng)化的分片功能。ClickHouse提供了本地表 ( Local Table ) 與分布式表 ( Distributed Table ) 的概念汛聚。一張本地表等同于一份數(shù)據(jù)的分片锹安。而分布式表本身不存儲(chǔ)任何數(shù)據(jù),它是本地表的訪問代理倚舀,其作用類似分庫中間件叹哭。借助分布式表,能夠代理訪問多個(gè)數(shù)據(jù)分片瞄桨,從而實(shí)現(xiàn)分布式查詢话速。

· 這種設(shè)計(jì)類似數(shù)據(jù)庫的分庫和分表,十分靈活芯侥。例如在業(yè)務(wù)系統(tǒng)上線的初期泊交,數(shù)據(jù)體量并不高,此時(shí)數(shù)據(jù)表并不需要多個(gè)分片柱查。所以使用單個(gè)節(jié)點(diǎn)的本地表 ( 單個(gè)數(shù)據(jù)分片 ) 即可滿足業(yè)務(wù)需求廓俭,待到業(yè)務(wù)增長、數(shù)據(jù)量增大的時(shí)候唉工,再通過新增數(shù)據(jù)分片的方式分流數(shù)據(jù)研乒,并通過分布式表實(shí)現(xiàn)分布式查詢。

[圖片上傳失敗...(image-69efb0-1609924266376)]

· Column與Field

? Column和Field是ClickHouse數(shù)據(jù)最基礎(chǔ)的映射單元淋硝。作為一款百分之百的列式存儲(chǔ)數(shù)據(jù)庫雹熬,ClickHouse按列存儲(chǔ)數(shù)據(jù),內(nèi)存中的一列數(shù)據(jù)由一個(gè)Column對(duì)象表示谣膳。Column對(duì)象分為接口和實(shí)現(xiàn)兩個(gè)部分竿报,在IColumn接口對(duì)象中,定義了對(duì)數(shù)據(jù)進(jìn)行各種關(guān)系運(yùn)算的方法继谚,例如插入數(shù)據(jù)的insertRangeFrom和insertFrom方法烈菌、用于分頁的cut,以及用于過濾的filter方法等。而這些方法的具體實(shí)現(xiàn)對(duì)象則根據(jù)數(shù)據(jù)類型的不同芽世,由相應(yīng)的對(duì)象實(shí)現(xiàn)挚赊,例如ColumnString、ColumnArray和ColumnTuple等济瓢。在大多數(shù)場合荠割,ClickHouse都會(huì)以整列的方式操作數(shù)據(jù),但凡事也有例外葬荷。如果需要操作單個(gè)具體的數(shù)值 ( 也就是單列中的一行數(shù)據(jù) )涨共,則需要使用Field對(duì)象,F(xiàn)ield對(duì)象代表一個(gè)單值宠漩。與Column對(duì)象的泛化設(shè)計(jì)思路不同举反,F(xiàn)ield對(duì)象使用了聚合的設(shè)計(jì)模式。在Field對(duì)象內(nèi)部聚合了Null扒吁、UInt64火鼻、String和Array等13種數(shù)據(jù)類型及相應(yīng)的處理邏輯。

? 這句話歸納如下:column與field是兩中不同的數(shù)據(jù)結(jié)構(gòu)雕崩,column定義了數(shù)據(jù)的處理邏輯魁索,filed定義了特殊的數(shù)據(jù)類型以及相應(yīng)的處理邏輯。column是列式操作盼铁,filed是單元格操作粗蔚。

· DataType

? 數(shù)據(jù)的序列化和反序列化工作由DataType負(fù)責(zé)。IDataType接口定義了許多正反序列化的方法饶火,它們成對(duì)出現(xiàn)鹏控,例如serializeBinary和deserializeBinary、serializeTextJSON和deserializeTextJSON等肤寝,涵蓋了常用的二進(jìn)制当辐、文本、JSON鲤看、XML缘揪、CSV和Protobuf等多種格式類型。IDataType也使用了泛化的設(shè)計(jì)模式义桂,具體方法的實(shí)現(xiàn)邏輯由對(duì)應(yīng)數(shù)據(jù)類型的實(shí)例承載找筝,例如DataTypeString、DataTypeArray及DataTypeTuple等慷吊。

? DataType雖然負(fù)責(zé)序列化相關(guān)工作呻征,但它并不直接負(fù)責(zé)數(shù)據(jù)的讀取,而是轉(zhuǎn)由從Column或Field對(duì)象獲取罢浇。在DataType的實(shí)現(xiàn)類中,聚合了相應(yīng)數(shù)據(jù)類型的Column對(duì)象和Field對(duì)象。例如嚷闭,DataTypeString會(huì)引用字符串類型的ColumnString攒岛,而DataTypeArray則會(huì)引用數(shù)組類型的ColumnArray,以此類推胞锰。

· Table

? 在數(shù)據(jù)表的底層設(shè)計(jì)中并沒有所謂的Table對(duì)象灾锯,它直接使用IStorage接口指代數(shù)據(jù)表。表引擎是ClickHouse的一個(gè)顯著特性嗅榕,不同的表引擎由不同的子類實(shí)現(xiàn)顺饮,例如IStorageSystemOneBlock ( 系統(tǒng)表 )、StorageMergeTree ( 合并樹表引擎 ) 和StorageTinyLog ( 日志表引擎 ) 等凌那。IStorage接口定義了DDL ( 如ALTER兼雄、RENAME、OPTIMIZE和DROP等 ) 帽蝶、read和write方法赦肋,它們分別負(fù)責(zé)數(shù)據(jù)的定義、查詢與寫入励稳。在數(shù)據(jù)查詢時(shí)佃乘,IStorage負(fù)責(zé)根據(jù)AST查詢語句的指示要求,返回指定列的原始數(shù)據(jù)驹尼。后續(xù)對(duì)數(shù)據(jù)的進(jìn)一步加工趣避、計(jì)算和過濾,則會(huì)統(tǒng)一交由Interpreter解釋器對(duì)象處理新翎。對(duì)Table發(fā)起的一次操作通常都會(huì)經(jīng)歷這樣的過程程帕,接收AST查詢語句,根據(jù)AST返回指定列的數(shù)據(jù)料祠,之后再將數(shù)據(jù)交由Interpreter做進(jìn)一步處理骆捧。

· Block與Block流

? Block對(duì)象可以看作數(shù)據(jù)表的子集。Block對(duì)象的本質(zhì)是由數(shù)據(jù)對(duì)象髓绽、數(shù)據(jù)類型和列名稱組成的三元組

· Parser與Interpreter

? Parser和Interpreter是非常重要的兩組接口:Parser分析器負(fù)責(zé)創(chuàng)建AST對(duì)象敛苇;而Interpreter解釋器則負(fù)責(zé)解釋AST,并進(jìn)一步創(chuàng)建查詢的執(zhí)行管道顺呕。它們與IStorage一起枫攀,串聯(lián)起了整個(gè)數(shù)據(jù)查詢的過程。Parser分析器可以將一條SQL語句以遞歸下降的方法解析成AST語法樹的形式株茶。不同的SQL語句来涨,會(huì)經(jīng)由不同的Parser實(shí)現(xiàn)類解析。例如启盛,有負(fù)責(zé)解析DDL查詢語句的ParserRenameQuery蹦掐、ParserDropQuery和ParserAlterQuery解析器技羔,也有負(fù)責(zé)解析INSERT語句的ParserInsertQuery解析器,還有負(fù)責(zé)SELECT語句的ParserSelectQuery等卧抗。

? Interpreter解釋器的作用就像Service服務(wù)層一樣藤滥,起到串聯(lián)整個(gè)查詢過程的作用,它會(huì)根據(jù)解釋器的類型社裆,聚合它所需要的資源拙绊。首先它會(huì)解析AST對(duì)象;然后執(zhí)行"業(yè)務(wù)邏輯" ( 例如分支判斷泳秀、設(shè)置參數(shù)标沪、調(diào)用接口等 );最終返回IBlock對(duì)象嗜傅,以線程的形式建立起一個(gè)查詢執(zhí)行管道

· Functions 與Aggregate Functions

? ClickHouse主要提供兩類函數(shù)—普通函數(shù)和聚合函數(shù)金句。普通函數(shù)由IFunction接口定義,擁有數(shù)十種函數(shù)實(shí)現(xiàn)磺陡,例如FunctionFormatDateTime趴梢、FunctionSubstring等。除了一些常見的函數(shù) ( 諸如四則運(yùn)算币他、日期轉(zhuǎn)換等 ) 之外坞靶,也不乏一些非常實(shí)用的函數(shù),例如網(wǎng)址提取函數(shù)蝴悉、IP地址脫敏函數(shù)等彰阴。普通函數(shù)是沒有狀態(tài)的,函數(shù)效果作用于每行數(shù)據(jù)之上拍冠。當(dāng)然尿这,在函數(shù)具體執(zhí)行的過程中,并不會(huì)一行一行地運(yùn)算庆杜,而是采用向量化的方式直接作用于一整列數(shù)據(jù)射众。

? 聚合函數(shù)由IAggregateFunction接口定義,相比無狀態(tài)的普通函數(shù)晃财,聚合函數(shù)是有狀態(tài)的叨橱。以COUNT聚合函數(shù)為例,其AggregateFunctionCount的狀態(tài)使用整型UInt64記錄断盛。聚合函數(shù)的狀態(tài)支持序列化與反序列化罗洗,所以能夠在分布式節(jié)點(diǎn)之間進(jìn)行傳輸,以實(shí)現(xiàn)增量計(jì)算钢猛。

· Cluster與Replication

? ClickHouse的集群由分片 ( Shard ) 組成伙菜,而每個(gè)分片又通過副本 ( Replica ) 組成。這種分層的概念命迈,在一些流行的分布式系統(tǒng)中十分普遍贩绕。例如火的,在Elasticsearch的概念中,一個(gè)索引由分片和副本組成丧叽,副本可以看作一種特殊的分片卫玖。如果一個(gè)索引由5個(gè)分片組成,副本的基數(shù)是1踊淳,那么這個(gè)索引一共會(huì)擁有10個(gè)分片 ( 每1個(gè)分片對(duì)應(yīng)1個(gè)副本 )。如果你用同樣的思路來理解ClickHouse的分片陕靠,那么很可能會(huì)在這里栽個(gè)跟頭迂尝。ClickHouse的某些設(shè)計(jì)總是顯得獨(dú)樹一幟,而集群與分片就是其中之一剪芥。這里有幾個(gè)與眾不同的特性垄开。ClickHouse的1個(gè)節(jié)點(diǎn)只能擁有1個(gè)分片,也就是說如果要實(shí)現(xiàn)1分片税肪、1副本溉躲,則至少需要部署2個(gè)服務(wù)節(jié)點(diǎn)。分片只是一個(gè)邏輯概念益兄,其物理承載還是由副本承擔(dān)的锻梳。

? 分片即表示安裝clickhouse的節(jié)點(diǎn)數(shù)

參考

原理

列式存儲(chǔ)

[圖片上傳失敗...(image-8d94a5-1609924266376)]

· 分析場景中往往需要讀大量行但是少數(shù)幾個(gè)列。在行存模式下净捅,數(shù)據(jù)按行連續(xù)存儲(chǔ)疑枯,所有列的數(shù)據(jù)都存儲(chǔ)在一個(gè)block中,不參與計(jì)算的列在IO時(shí)也要全部讀出蛔六,讀取操作被嚴(yán)重放大荆永。而列存模式下,只需要讀取參與計(jì)算的列即可国章,極大的減低了IO cost具钥,加速了查詢。

· 同一列中的數(shù)據(jù)屬于同一類型液兽,壓縮效果顯著骂删。列存往往有著高達(dá)十倍甚至更高的壓縮比,節(jié)省了大量的存儲(chǔ)空間抵碟,降低了存儲(chǔ)成本桃漾。

· 更高的壓縮比意味著更小的data size,從磁盤中讀取相應(yīng)數(shù)據(jù)耗時(shí)更短拟逮。

· 高壓縮比撬统,意味著同等大小的內(nèi)存能夠存放更多數(shù)據(jù),系統(tǒng)cache效果更好

數(shù)據(jù)有序存儲(chǔ)

· ClickHouse支持在建表時(shí)敦迄,指定將數(shù)據(jù)按照某些列進(jìn)行sort by恋追。sort by是局部排序凭迹,在hive中表示在一個(gè)reduce內(nèi)部排序排序后,保證了相同sort key的數(shù)據(jù)在磁盤上連續(xù)存儲(chǔ)苦囱,且有序擺放嗅绸。在進(jìn)行等值、范圍查詢時(shí)撕彤,where條件命中的數(shù)據(jù)都緊密存儲(chǔ)在一個(gè)或若干個(gè)連續(xù)的Block中鱼鸠,而不是分散的存儲(chǔ)在任意多個(gè)Block, 大幅減少需要IO的block數(shù)量羹铅。另外蚀狰,連續(xù)IO也能夠充分利用操作系統(tǒng)page cache的預(yù)取能力,減少page fault职员。

? 簡言之麻蹋,就是where后面的謂詞在建表時(shí)候要提前指定。由于集中存儲(chǔ)在一個(gè)數(shù)據(jù)塊內(nèi)焊切,就會(huì)減少掃描時(shí)間扮授。io

**better to use **

環(huán)境要求

如果可能的話,使用10G或更高級(jí)別的網(wǎng)絡(luò)专肪。

至少4GB的RAM來執(zhí)行重要的查詢

RAM所需的體積取決于:查詢的復(fù)雜性刹勃。查詢中處理的數(shù)據(jù)量

監(jiān)控體系

[圖片上傳失敗...(image-d202b4-1609924266376)]

參考

集群模式

支持分布式集群部署

參考1

參考2

參考3

主鍵索引

ClickHouse支持主鍵索引,它將每列數(shù)據(jù)按照index granularity(默認(rèn)8192行)進(jìn)行劃分牵祟,每個(gè)index granularity的開頭第一行被稱為一個(gè)mark行深夯。主鍵索引存儲(chǔ)該mark行對(duì)應(yīng)的primary key的值。對(duì)于where條件中含有primary key的查詢诺苹,通過對(duì)主鍵索引進(jìn)行二分查找咕晋,能夠直接定位到對(duì)應(yīng)的index granularity,避免了全表掃描從而加速查詢收奔。但是值得注意的是:ClickHouse的主鍵索引與MySQL等數(shù)據(jù)庫不同掌呜,它并不用于去重,即便primary key相同的行坪哄,也可以同時(shí)存在于數(shù)據(jù)庫中质蕉。要想實(shí)現(xiàn)去重效果,需要結(jié)合具體的表引擎ReplacingMergeTree翩肌、CollapsingMergeTree模暗、VersionedCollapsingMergeTree實(shí)現(xiàn)

稀疏索引

ClickHouse支持對(duì)任意列創(chuàng)建任意數(shù)量的稀疏索引。其中被索引的value可以是任意的合法SQL Expression念祭,并不僅僅局限于對(duì)column value本身進(jìn)行索引兑宇。之所以叫稀疏索引,是因?yàn)樗举|(zhì)上是對(duì)一個(gè)完整index granularity(默認(rèn)8192行)的統(tǒng)計(jì)信息粱坤,并不會(huì)具體記錄每一行在文件中的位置隶糕。目前支持的稀疏索引類型包括:minmax: 以index granularity為單位瓷产,存儲(chǔ)指定表達(dá)式計(jì)算后的min、max值枚驻;在等值和范圍查詢中能夠幫助快速跳過不滿足要求的塊濒旦,減少IO。set(max_rows):以index granularity為單位再登,存儲(chǔ)指定表達(dá)式的distinct value集合尔邓,用于快速判斷等值查詢是否命中該塊,減少IO锉矢。ngrambf_v1(n, size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed):將string進(jìn)行ngram分詞后铃拇,構(gòu)建bloom filter,能夠優(yōu)化等值沈撞、like、in等查詢條件雕什。tokenbf_v1(size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed): 與ngrambf_v1類似缠俺,區(qū)別是不使用ngram進(jìn)行分詞,而是通過標(biāo)點(diǎn)符號(hào)進(jìn)行詞語分割贷岸。bloom_filter([false_positive]):對(duì)指定列構(gòu)建bloom filter壹士,用于加速等值、like偿警、in等查詢條件的執(zhí)行躏救。

數(shù)據(jù)Sharding

ClickHouse支持單機(jī)模式,也支持分布式集群模式螟蒸。在分布式模式下盒使,ClickHouse會(huì)將數(shù)據(jù)分為多個(gè)分片,并且分布到不同節(jié)點(diǎn)上七嫌。不同的分片策略在應(yīng)對(duì)不同的SQL Pattern時(shí)少办,各有優(yōu)勢。ClickHouse提供了豐富的sharding策略诵原,讓業(yè)務(wù)可以根據(jù)實(shí)際需求選用英妓。1) random隨機(jī)分片:寫入數(shù)據(jù)會(huì)被隨機(jī)分發(fā)到分布式集群中的某個(gè)節(jié)點(diǎn)上。2) constant固定分片:寫入數(shù)據(jù)會(huì)被分發(fā)到固定一個(gè)節(jié)點(diǎn)上绍赛。3)column value分片:按照某一列的值進(jìn)行hash分片蔓纠。4)自定義表達(dá)式分片:指定任意合法表達(dá)式,根據(jù)表達(dá)式被計(jì)算后的值進(jìn)行hash分片吗蚌。數(shù)據(jù)分片腿倚,讓ClickHouse可以充分利用整個(gè)集群的大規(guī)模并行計(jì)算能力,快速返回查詢結(jié)果褪测。更重要的是猴誊,多樣化的分片功能潦刃,為業(yè)務(wù)優(yōu)化打開了想象空間。比如在hash sharding的情況下懈叹,JOIN計(jì)算能夠避免數(shù)據(jù)shuffle乖杠,直接在本地進(jìn)行l(wèi)ocal join; 支持自定義sharding澄成,可以為不同業(yè)務(wù)和SQL Pattern定制最適合的分片策略胧洒;利用自定義sharding功能,通過設(shè)置合理的sharding expression可以解決分片間數(shù)據(jù)傾斜問題等墨状。另外卫漫,sharding機(jī)制使得ClickHouse可以橫向線性拓展,構(gòu)建大規(guī)模分布式集群肾砂,從而具備處理海量數(shù)據(jù)的能力列赎。

數(shù)據(jù)Partitioning

ClickHouse支持PARTITION BY子句,在建表時(shí)可以指定按照任意合法表達(dá)式進(jìn)行數(shù)據(jù)分區(qū)操作镐确,比如通過toYYYYMM()將數(shù)據(jù)按月進(jìn)行分區(qū)包吝、toMonday()將數(shù)據(jù)按照周幾進(jìn)行分區(qū)、對(duì)Enum類型的列直接每種取值作為一個(gè)分區(qū)等源葫。數(shù)據(jù)Partition在ClickHouse中主要有兩方面應(yīng)用:在partition key上進(jìn)行分區(qū)裁剪诗越,只查詢必要的數(shù)據(jù)。靈活的partition expression設(shè)置息堂,使得可以根據(jù)SQL Pattern進(jìn)行分區(qū)設(shè)置嚷狞,最大化的貼合業(yè)務(wù)特點(diǎn)。對(duì)partition進(jìn)行TTL管理荣堰,淘汰過期的分區(qū)數(shù)據(jù)床未。

數(shù)據(jù)TTL

在分析場景中,數(shù)據(jù)的價(jià)值隨著時(shí)間流逝而不斷降低持隧,多數(shù)業(yè)務(wù)出于成本考慮只會(huì)保留最近幾個(gè)月的數(shù)據(jù)即硼,ClickHouse通過TTL提供了數(shù)據(jù)生命周期管理的能力。ClickHouse支持幾種不同粒度的TTL:1) 列級(jí)別TTL:當(dāng)一列中的部分?jǐn)?shù)據(jù)過期后屡拨,會(huì)被替換成默認(rèn)值只酥;當(dāng)全列數(shù)據(jù)都過期后硫椰,會(huì)刪除該列级野。2)行級(jí)別TTL:當(dāng)某一行過期后集畅,會(huì)直接刪除該行免猾。3)分區(qū)級(jí)別TTL:當(dāng)分區(qū)過期后厉熟,會(huì)直接刪除該分區(qū)薄扁。

why it's designed

將軍點(diǎn)兵

如果將軍點(diǎn)數(shù)一個(gè)方陣有多少人孕豹,是一個(gè)一個(gè)數(shù)方便還是先確定一個(gè)縱隊(duì)(列)有多少人废封,在確定有多少排(行)方便呢?顯然是后者十饥。雖然例子不是很生動(dòng)窟勃,但是思想是一致的,通過掃描同一個(gè)類型的列時(shí)(即面向列操作數(shù)據(jù))在同等數(shù)據(jù)處理要比傳統(tǒng)的按行讀取數(shù)據(jù)速度快逗堵,減少了將軍點(diǎn)兵時(shí)間(即io流)秉氧,

在古代行軍打仗中,兩軍對(duì)壘蜒秤,軍陣的排序往往對(duì)戰(zhàn)爭的成敗起著非常作用汁咏,這里的軍陣的排序就好比數(shù)據(jù)的有效排序(即sort by)數(shù)據(jù)的有效排序?qū)Σ樵兊男阅芤矔?huì)起著至關(guān)重要的作用

如果把將軍比作cpu,那么是不是最開始執(zhí)行將軍計(jì)劃的是不是身邊近臣作媚,然后是百夫長攘滩,在然后是士兵。(這個(gè)像極了向量的執(zhí)行引擎纸泡,越靠近c(diǎn)pu的block被處理的速度越快)

同樣漂问,士兵都有名字或者編號(hào),這個(gè)就好比主鍵索引女揭,在眾多的人中快速找到具體人

如果按照身手好级解,力氣大,這些群體特征點(diǎn)兵就是稀疏索引的體現(xiàn)田绑,快速過濾掉不符合此類特征的人

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市抡爹,隨后出現(xiàn)的幾起案子掩驱,更是在濱河造成了極大的恐慌,老刑警劉巖冬竟,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欧穴,死亡現(xiàn)場離奇詭異,居然都是意外死亡泵殴,警方通過查閱死者的電腦和手機(jī)涮帘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笑诅,“玉大人调缨,你說我怎么就攤上這事∵耗悖” “怎么了弦叶?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長妇多。 經(jīng)常有香客問我伤哺,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任立莉,我火速辦了婚禮绢彤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜓耻。我一直安慰自己茫舶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布媒熊。 她就那樣靜靜地躺著奇适,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芦鳍。 梳的紋絲不亂的頭發(fā)上嚷往,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音柠衅,去河邊找鬼皮仁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛菲宴,可吹牛的內(nèi)容都是我干的贷祈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼喝峦,長吁一口氣:“原來是場噩夢啊……” “哼势誊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谣蠢,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤粟耻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后眉踱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挤忙,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年谈喳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了册烈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡婿禽,死狀恐怖赏僧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扭倾,我是刑警寧澤次哈,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站吆录,受9級(jí)特大地震影響窑滞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一哀卫、第九天 我趴在偏房一處隱蔽的房頂上張望巨坊。 院中可真熱鬧,春花似錦此改、人聲如沸趾撵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽占调。三九已至,卻和暖如春移剪,著一層夾襖步出監(jiān)牢的瞬間究珊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工纵苛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剿涮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓攻人,卻偏偏與公主長得像取试,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怀吻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容