自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

ES不香嗎,為啥還要ClickHouse?

開發(fā) 前端 開發(fā)工具
Elasticsearch 是一個(gè)實(shí)時(shí)的分布式搜索分析引擎,它的底層是構(gòu)建在 Lucene 之上的。簡(jiǎn)單來(lái)說(shuō)是通過(guò)擴(kuò)展 Lucene 的搜索能力,使其具有分布式的功能。

 Elasticsearch 是一個(gè)實(shí)時(shí)的分布式搜索分析引擎,它的底層是構(gòu)建在 Lucene 之上的。簡(jiǎn)單來(lái)說(shuō)是通過(guò)擴(kuò)展 Lucene 的搜索能力,使其具有分布式的功能。

[[410030]]

圖片來(lái)自包圖網(wǎng)

ES 通常會(huì)和其它兩個(gè)開源組件 Logstash(日志采集)和 Kibana(儀表盤)一起提供端到端的日志/搜索分析的功能,常常被簡(jiǎn)稱為 ELK。

Clickhouse 是俄羅斯搜索巨頭 Yandex 開發(fā)的面向列式存儲(chǔ)的關(guān)系型數(shù)據(jù)庫(kù)。ClickHouse 是過(guò)去兩年中 OLAP 領(lǐng)域中最熱門的,并于 2016 年開源。

ES 是最為流行的大數(shù)據(jù)日志和搜索解決方案,但是近幾年來(lái),它的江湖地位受到了一些挑戰(zhàn),許多公司已經(jīng)開始把自己的日志解決方案從 ES 遷移到了 Clickhouse,這里就包括:攜程,快手等公司。

架構(gòu)和設(shè)計(jì)的對(duì)比

ES 的底層是 Lucenc,主要是要解決搜索的問(wèn)題。搜索是大數(shù)據(jù)領(lǐng)域要解決的一個(gè)常見的問(wèn)題,就是在海量的數(shù)據(jù)量要如何按照條件找到需要的數(shù)據(jù)。搜索的核心技術(shù)是倒排索引和布隆過(guò)濾器。

ES 通過(guò)分布式技術(shù),利用分片與副本機(jī)制,直接解決了集群下搜索性能與高可用的問(wèn)題。

ElasticSearch 是為分布式設(shè)計(jì)的,有很好的擴(kuò)展性,在一個(gè)典型的分布式配置中,每一個(gè)節(jié)點(diǎn)(node)可以配制成不同的角色。

如上圖所示:

  • Client Node,負(fù)責(zé) API 和數(shù)據(jù)的訪問(wèn)的節(jié)點(diǎn),不存儲(chǔ)/處理數(shù)據(jù)。
  • Data Node,負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和索引。
  • Master Node,管理節(jié)點(diǎn),負(fù)責(zé) Cluster 中的節(jié)點(diǎn)的協(xié)調(diào),不存儲(chǔ)數(shù)據(jù)。

ClickHouse 是基于 MPP 架構(gòu)的分布式 ROLAP(關(guān)系 OLAP)分析引擎。每個(gè)節(jié)點(diǎn)都有同等的責(zé)任,并負(fù)責(zé)部分?jǐn)?shù)據(jù)處理(不共享任何內(nèi)容)。

ClickHouse 是一個(gè)真正的列式數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)。在 ClickHouse 中,數(shù)據(jù)始終是按列存儲(chǔ)的,包括矢量(向量或列塊)執(zhí)行的過(guò)程。

讓查詢變得更快,最簡(jiǎn)單且有效的方法是減少數(shù)據(jù)掃描范圍和數(shù)據(jù)傳輸時(shí)的大小,而列式存儲(chǔ)和數(shù)據(jù)壓縮就可以幫助實(shí)現(xiàn)上述兩點(diǎn)。

Clickhouse 同時(shí)使用了日志合并樹,稀疏索引和 CPU 功能(如 SIMD 單指令多數(shù)據(jù))充分發(fā)揮了硬件優(yōu)勢(shì),可實(shí)現(xiàn)高效的計(jì)算。

Clickhouse 使用 Zookeeper 進(jìn)行分布式節(jié)點(diǎn)之間的協(xié)調(diào)。

為了支持搜索,Clickhouse 同樣支持布隆過(guò)濾器。

查詢對(duì)比實(shí)戰(zhàn)

為了對(duì)比 ES 和 Clickhouse 的基本查詢能力的差異,我寫了一些代碼來(lái)驗(yàn)證:

  1. https://github.com/gangtao/esvsch 

這個(gè)測(cè)試的架構(gòu)如下:

架構(gòu)主要有四個(gè)部分組成:

①ES stack

ES stack 有一個(gè)單節(jié)點(diǎn)的 Elastic 的容器和一個(gè) Kibana 容器組成,Elastic 是被測(cè)目標(biāo)之一,Kibana 作為驗(yàn)證和輔助工具。

部署代碼如下:

  1. version: '3.7' 
  2.  
  3. services: 
  4.   elasticsearch: 
  5.     image: docker.elastic.co/elasticsearch/elasticsearch:7.4.0 
  6.     container_name: elasticsearch 
  7.     environment: 
  8.       - xpack.security.enabled=false 
  9.       - discovery.type=single-node 
  10.     ulimits: 
  11.       memlock: 
  12.         soft: -1 
  13.         hard: -1 
  14.       nofile: 
  15.         soft: 65536 
  16.         hard: 65536 
  17.     cap_add: 
  18.       - IPC_LOCK 
  19.     volumes: 
  20.       - elasticsearch-data:/usr/share/elasticsearch/data 
  21.     ports: 
  22.       - 9200:9200 
  23.       - 9300:9300 
  24.     deploy: 
  25.       resources: 
  26.         limits: 
  27.           cpus: '4' 
  28.           memory: 4096M 
  29.         reservations: 
  30.           memory: 4096M 
  31.  
  32.   kibana: 
  33.     container_name: kibana 
  34.     image: docker.elastic.co/kibana/kibana:7.4.0 
  35.     environment: 
  36.       - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 
  37.     ports: 
  38.       - 5601:5601 
  39.     depends_on: 
  40.       - elasticsearch 
  41.  
  42. volumes: 
  43.   elasticsearch-data: 
  44.     driver: local 

②Clickhouse stack

Clickhouse stack 有一個(gè)單節(jié)點(diǎn)的 Clickhouse 服務(wù)容器和一個(gè) TabixUI 作為 Clickhouse 的客戶端。

部署代碼如下:

  1. version: "3.7" 
  2. services: 
  3.   clickhouse: 
  4.     container_name: clickhouse 
  5.     image: yandex/clickhouse-server 
  6.     volumes: 
  7.       - ./data/config:/var/lib/clickhouse 
  8.     ports: 
  9.       - "8123:8123" 
  10.       - "9000:9000" 
  11.       - "9009:9009" 
  12.       - "9004:9004" 
  13.     ulimits: 
  14.       nproc: 65535 
  15.       nofile: 
  16.         soft: 262144 
  17.         hard: 262144 
  18.     healthcheck: 
  19.       test: ["CMD""wget""--spider""-q""localhost:8123/ping"
  20.       interval: 30s 
  21.       timeout: 5s 
  22.       retries: 3 
  23.     deploy: 
  24.       resources: 
  25.         limits: 
  26.           cpus: '4' 
  27.           memory: 4096M 
  28.         reservations: 
  29.           memory: 4096M 
  30.  
  31.   tabixui: 
  32.     container_name: tabixui 
  33.     image: spoonest/clickhouse-tabix-web-client 
  34.     environment: 
  35.       - CH_NAME=dev 
  36.       - CH_HOST=127.0.0.1:8123 
  37.       - CH_LOGIN=default 
  38.     ports: 
  39.       - "18080:80" 
  40.     depends_on: 
  41.       - clickhouse 
  42.     deploy: 
  43.       resources: 
  44.         limits: 
  45.           cpus: '0.1' 
  46.           memory: 128M 
  47.         reservations: 
  48.           memory: 128M 

③數(shù)據(jù)導(dǎo)入 stack

數(shù)據(jù)導(dǎo)入部分使用了 Vector.dev 開發(fā)的 vector,該工具和 fluentd 類似,都可以實(shí)現(xiàn)數(shù)據(jù)管道式的靈活的數(shù)據(jù)導(dǎo)入。

④測(cè)試控制 stack

測(cè)試控制我使用了 Jupyter,使用了 ES 和 Clickhouse 的 Python SDK 來(lái)進(jìn)行查詢的測(cè)試。

用 Docker compose 啟動(dòng) ES 和 Clickhouse 的 stack 后,我們需要導(dǎo)入數(shù)據(jù),我們利用 Vector 的 generator 功能,生成 syslog,并同時(shí)導(dǎo)入 ES 和 Clickhouse。

在這之前,我們需要在 Clickhouse 上創(chuàng)建表。ES 的索引沒(méi)有固定模式,所以不需要事先創(chuàng)建索引。

創(chuàng)建表的代碼如下:

  1. CREATE TABLE default.syslog( 
  2.     application String, 
  3.     hostname String, 
  4.     message String, 
  5.     mid String, 
  6.     pid String, 
  7.     priority Int16, 
  8.     raw String, 
  9.     timestamp DateTime('UTC'), 
  10.     version Int16 
  11. ) ENGINE = MergeTree() 
  12.     PARTITION BY toYYYYMMDD(timestamp
  13.     ORDER BY timestamp 
  14.     TTL timestamp + toIntervalMonth(1); 

創(chuàng)建好表之后,我們就可以啟動(dòng) vector,向兩個(gè) stack 寫入數(shù)據(jù)了。vector 的數(shù)據(jù)流水線的定義如下:

  1. [sources.in
  2.   type = "generator" 
  3.   format = "syslog" 
  4.   interval = 0.01 
  5.   count = 100000 
  6.  
  7. [transforms.clone_message] 
  8.   type = "add_fields" 
  9.   inputs = ["in"
  10.   fields.raw = "{{ message }}" 
  11.  
  12. [transforms.parser] 
  13.   # General 
  14.   type = "regex_parser" 
  15.   inputs = ["clone_message"
  16.   field = "message" # optional, default 
  17.   patterns = ['^<(?P<priority>\d*)>(?P<version>\d) (?P<timestamp>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z) (?P<hostname>\w+\.\w+) (?P<application>\w+) (?P<pid>\d+) (?P<mid>ID\d+) - (?P<message>.*)$'
  18.  
  19. [transforms.coercer] 
  20.   type = "coercer" 
  21.   inputs = ["parser"
  22.   types.timestamp = "timestamp" 
  23.   types.version = "int" 
  24.   types.priority = "int" 
  25.  
  26. [sinks.out_console] 
  27.   # General 
  28.   type = "console" 
  29.   inputs = ["coercer"]  
  30.   target = "stdout"  
  31.  
  32.   # Encoding 
  33.   encoding.codec = "json"  
  34.  
  35.  
  36. [sinks.out_clickhouse] 
  37.   host = "http://host.docker.internal:8123" 
  38.   inputs = ["coercer"
  39.   table = "syslog" 
  40.   type = "clickhouse" 
  41.  
  42.   encoding.only_fields = ["application""hostname""message""mid""pid""priority""raw""timestamp""version"
  43.   encoding.timestamp_format = "unix" 
  44.  
  45. [sinks.out_es] 
  46.   # General 
  47.   type = "elasticsearch" 
  48.   inputs = ["coercer"
  49.   compression = "none"  
  50.   endpoint = "http://host.docker.internal:9200"  
  51.   index = "syslog-%F" 
  52.  
  53.   # Encoding 
  54.  
  55.   # Healthcheck 
  56.   healthcheck.enabled = true 

這里簡(jiǎn)單介紹一下這個(gè)流水線:

  • source.in:生成 syslog 的模擬數(shù)據(jù),生成 10w 條,生成間隔和 0.01 秒。
  • transforms.clone_message:把原始消息復(fù)制一份,這樣抽取的信息同時(shí)可以保留原始消息。
  • transforms.parser:使用正則表達(dá)式,按照 syslog 的定義,抽取出 application,hostname,message,mid,pid,priority,timestamp,version 這幾個(gè)字段。
  • transforms.coercer:數(shù)據(jù)類型轉(zhuǎn)化。
  • sinks.out_console:把生成的數(shù)據(jù)打印到控制臺(tái),供開發(fā)調(diào)試。
  • sinks.out_clickhouse:把生成的數(shù)據(jù)發(fā)送到Clickhouse。
  • sinks.out_es:把生成的數(shù)據(jù)發(fā)送到 ES。

運(yùn)行 Docker 命令,執(zhí)行該流水線:

  1. docker run \ 
  2.         -v $(mkfile_path)/vector.toml:/etc/vector/vector.toml:ro \ 
  3.         -p 18383:8383 \ 
  4.         timberio/vector:nightly-alpine 

數(shù)據(jù)導(dǎo)入后,我們針對(duì)一下的查詢來(lái)做一個(gè)對(duì)比。ES 使用自己的查詢語(yǔ)言來(lái)進(jìn)行查詢,Clickhouse 支持 SQL,我簡(jiǎn)單測(cè)試了一些常見的查詢,并對(duì)它們的功能和性能做一些比較。

返回所有的記錄:

  1. # ES 
  2.   "query":{ 
  3.     "match_all":{} 
  4.   } 
  5.  
  6. # Clickhouse  
  7. "SELECT * FROM syslog" 

匹配單個(gè)字段:

  1. # ES 
  2.   "query":{ 
  3.     "match":{ 
  4.       "hostname":"for.org" 
  5.     } 
  6.   } 
  7.  
  8. # Clickhouse  
  9. "SELECT * FROM syslog WHERE hostname='for.org'" 

匹配多個(gè)字段:

  1. # ES 
  2.   "query":{ 
  3.     "multi_match":{ 
  4.       "query":"up.com ahmadajmi"
  5.         "fields":[ 
  6.           "hostname"
  7.           "application" 
  8.         ] 
  9.     } 
  10.   } 
  11.  
  12. # Clickhouse、 
  13. "SELECT * FROM syslog WHERE hostname='for.org' OR application='ahmadajmi'" 

單詞查找,查找包含特定單詞的字段:

  1. # ES 
  2.   "query":{ 
  3.     "term":{ 
  4.       "message":"pretty" 
  5.     } 
  6.   } 
  7.  
  8. # Clickhouse 
  9. "SELECT * FROM syslog WHERE lowerUTF8(raw) LIKE '%pretty%'" 

范圍查詢,查找版本大于 2 的記錄:

  1. # ES 
  2.   "query":{ 
  3.     "range":{ 
  4.       "version":{ 
  5.         "gte":2 
  6.       } 
  7.     } 
  8.   } 
  9.  
  10. # Clickhouse 
  11. "SELECT * FROM syslog WHERE version >= 2" 

查找到存在某字段的記錄:

  1. # ES 
  2.   "query":{ 
  3.     "exists":{ 
  4.       "field":"application" 
  5.     } 
  6.   } 
  7.  
  8. # Clickhouse 
  9. "SELECT * FROM syslog WHERE application is not NULL" 

ES 是文檔類型的數(shù)據(jù)庫(kù),每一個(gè)文檔的模式不固定,所以會(huì)存在某字段不存在的情況;而 Clickhouse 對(duì)應(yīng)為字段為空值。

正則表達(dá)式查詢,查詢匹配某個(gè)正則表達(dá)式的數(shù)據(jù):

  1. # ES 
  2.   "query":{ 
  3.     "regexp":{ 
  4.       "hostname":{ 
  5.         "value":"up.*"
  6.           "flags":"ALL"
  7.             "max_determinized_states":10000, 
  8.               "rewrite":"constant_score" 
  9.       } 
  10.     } 
  11.   } 
  12.  
  13. # Clickhouse 
  14. "SELECT * FROM syslog WHERE match(hostname, 'up.*')" 

聚合計(jì)數(shù),統(tǒng)計(jì)某個(gè)字段出現(xiàn)的次數(shù):

  1. # ES 
  2.   "aggs":{ 
  3.     "version_count":{ 
  4.       "value_count":{ 
  5.         "field":"version" 
  6.       } 
  7.     } 
  8.   } 
  9.  
  10. # Clickhouse 
  11. "SELECT count(version) FROM syslog" 

聚合不重復(fù)的值,查找所有不重復(fù)的字段的個(gè)數(shù):

  1. # ES 
  2.   "aggs":{ 
  3.     "my-agg-name":{ 
  4.       "cardinality":{ 
  5.         "field":"priority" 
  6.       } 
  7.     } 
  8.   } 
  9.  
  10. # Clickhouse 
  11. "SELECT count(distinct(priority)) FROM syslog " 

我用 Python 的 SDK,對(duì)上述的查詢?cè)趦蓚€(gè) Stack 上各跑 10 次,然后統(tǒng)計(jì)查詢的性能結(jié)果。

我們畫出出所有的查詢的響應(yīng)時(shí)間的分布:

總查詢時(shí)間的對(duì)比如下:

通過(guò)測(cè)試數(shù)據(jù)我們可以看出 Clickhouse 在大部分的查詢的性能上都明顯要優(yōu)于 Elastic。

在正則查詢(Regex query)和單詞查詢(Term query)等搜索常見的場(chǎng)景下,也并不遜色。

在聚合場(chǎng)景下,Clickhouse 表現(xiàn)異常優(yōu)秀,充分發(fā)揮了列村引擎的優(yōu)勢(shì)。

注意,我的測(cè)試并沒(méi)有任何優(yōu)化,對(duì)于 Clickhouse 也沒(méi)有打開布隆過(guò)濾器??梢?Clickhouse 確實(shí)是一款非常優(yōu)秀的數(shù)據(jù)庫(kù),可以用于某些搜索的場(chǎng)景。

當(dāng)然 ES 還支持非常豐富的查詢功能,這里只有一些非?;镜牟樵?,有些查詢可能存在無(wú)法用 SQL 表達(dá)的情況。

總結(jié)

本文通過(guò)對(duì)于一些基本查詢的測(cè)試,對(duì)比了 Clickhouse 和 Elasticsearch 的功能和性能。

測(cè)試結(jié)果表明,Clickhouse 在這些基本場(chǎng)景表現(xiàn)非常優(yōu)秀,性能優(yōu)于 ES,這也解釋了為什么用很多的公司應(yīng)從 ES 切換到 Clickhouse 之上。

作者:Gang Tao

編輯:陶家龍

出處:zhuanlan.zhihu.com/p/353296392

 

責(zé)任編輯:武曉燕 來(lái)源: 知乎
相關(guān)推薦

2021-04-06 10:48:52

MySQLElasticsear數(shù)據(jù)庫(kù)

2020-07-30 09:10:21

DockerK8s容器

2021-05-19 09:37:45

SessionTokencookie

2020-12-29 05:29:39

DockerK8s容器

2020-04-29 08:04:11

NoSQLMySQLSQL

2021-11-02 16:44:40

部署DevtoolsJRebel

2021-12-17 15:05:55

CSSwhenelse

2020-05-25 10:37:58

自學(xué)編程技巧

2020-12-25 09:07:38

EclipseCode工具

2020-10-12 09:48:55

SSR JSPPHP

2020-09-25 15:50:41

鴻蒙小米國(guó)產(chǎn)

2024-02-01 08:21:40

2020-10-21 09:19:27

Flutter開源項(xiàng)目

2021-12-05 23:17:18

iOS蘋果系統(tǒng)

2021-12-03 10:46:49

ELKGraylog運(yùn)維

2022-03-28 11:06:38

Nacos監(jiān)聽配置

2020-01-21 21:15:16

WiFi網(wǎng)絡(luò)WiFi6

2021-12-02 06:34:34

GraylogELK日志

2023-12-01 08:18:24

Redis網(wǎng)絡(luò)

2020-09-23 13:37:25

Redis6.0
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)