成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ES不香嗎,為啥還要ClickHouse?

開發(fā) 前端 開發(fā)工具
Elasticsearch 是一個實時的分布式搜索分析引擎,它的底層是構建在 Lucene 之上的。簡單來說是通過擴展 Lucene 的搜索能力,使其具有分布式的功能。

 Elasticsearch 是一個實時的分布式搜索分析引擎,它的底層是構建在 Lucene 之上的。簡單來說是通過擴展 Lucene 的搜索能力,使其具有分布式的功能。

[[410030]]

圖片來自包圖網

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

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

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

架構和設計的對比

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

ES 通過分布式技術,利用分片與副本機制,直接解決了集群下搜索性能與高可用的問題。

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

如上圖所示:

  • Client Node,負責 API 和數(shù)據(jù)的訪問的節(jié)點,不存儲/處理數(shù)據(jù)。
  • Data Node,負責數(shù)據(jù)的存儲和索引。
  • Master Node,管理節(jié)點,負責 Cluster 中的節(jié)點的協(xié)調,不存儲數(shù)據(jù)。

ClickHouse 是基于 MPP 架構的分布式 ROLAP(關系 OLAP)分析引擎。每個節(jié)點都有同等的責任,并負責部分數(shù)據(jù)處理(不共享任何內容)。

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

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

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

Clickhouse 使用 Zookeeper 進行分布式節(jié)點之間的協(xié)調。

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

查詢對比實戰(zhàn)

為了對比 ES 和 Clickhouse 的基本查詢能力的差異,我寫了一些代碼來驗證:

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

這個測試的架構如下:

架構主要有四個部分組成:

①ES stack

ES stack 有一個單節(jié)點的 Elastic 的容器和一個 Kibana 容器組成,Elastic 是被測目標之一,Kibana 作為驗證和輔助工具。

部署代碼如下:

  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 有一個單節(jié)點的 Clickhouse 服務容器和一個 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ù)導入 stack

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

④測試控制 stack

測試控制我使用了 Jupyter,使用了 ES 和 Clickhouse 的 Python SDK 來進行查詢的測試。

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

在這之前,我們需要在 Clickhouse 上創(chuàng)建表。ES 的索引沒有固定模式,所以不需要事先創(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)建好表之后,我們就可以啟動 vector,向兩個 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 

這里簡單介紹一下這個流水線:

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

運行 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ù)導入后,我們針對一下的查詢來做一個對比。ES 使用自己的查詢語言來進行查詢,Clickhouse 支持 SQL,我簡單測試了一些常見的查詢,并對它們的功能和性能做一些比較。

返回所有的記錄:

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

匹配單個字段:

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

匹配多個字段:

  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ù)庫,每一個文檔的模式不固定,所以會存在某字段不存在的情況;而 Clickhouse 對應為字段為空值。

正則表達式查詢,查詢匹配某個正則表達式的數(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.*')" 

聚合計數(shù),統(tǒng)計某個字段出現(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" 

聚合不重復的值,查找所有不重復的字段的個數(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,對上述的查詢在兩個 Stack 上各跑 10 次,然后統(tǒng)計查詢的性能結果。

我們畫出出所有的查詢的響應時間的分布:

總查詢時間的對比如下:

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

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

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

注意,我的測試并沒有任何優(yōu)化,對于 Clickhouse 也沒有打開布隆過濾器。可見 Clickhouse 確實是一款非常優(yōu)秀的數(shù)據(jù)庫,可以用于某些搜索的場景。

當然 ES 還支持非常豐富的查詢功能,這里只有一些非常基本的查詢,有些查詢可能存在無法用 SQL 表達的情況。

總結

本文通過對于一些基本查詢的測試,對比了 Clickhouse 和 Elasticsearch 的功能和性能。

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

作者:Gang Tao

編輯:陶家龍

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

 

責任編輯:武曉燕 來源: 知乎
相關推薦

2021-04-06 10:48:52

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

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

2020-05-25 10:37:58

自學編程技巧

2021-12-17 15:05:55

CSSwhenelse

2020-12-25 09:07:38

EclipseCode工具

2020-10-12 09:48:55

SSR JSPPHP

2020-09-25 15:50:41

鴻蒙小米國產

2024-02-01 08:21:40

2020-10-21 09:19:27

Flutter開源項目

2021-12-05 23:17:18

iOS蘋果系統(tǒng)

2022-03-28 11:06:38

Nacos監(jiān)聽配置

2021-12-03 10:46:49

ELKGraylog運維

2025-06-25 09:31:41

2020-01-21 21:15:16

WiFi網絡WiFi6

2021-12-02 06:34:34

GraylogELK日志

2023-12-01 08:18:24

Redis網絡
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九色91视频 | 男女在线免费观看 | 亚洲午夜精品 | 欧美精品一区二区在线观看 | 欧美国产视频 | 一级做a爰片性色毛片16美国 | 久久精品日产第一区二区三区 | 拍戏被cao翻了h承欢 | 狠狠综合久久av一区二区老牛 | 久久国产婷婷国产香蕉 | av在线播放网址 | 国产日韩久久 | 精品国产乱码一区二区三区 | 国产免费自拍 | 亚洲激情综合 | 91精品国产一区二区三区 | 成人在线视频免费看 | www精品美女久久久tv | 久久精品国产一区二区电影 | 国产综合av | av中文字幕在线 | 日韩高清中文字幕 | 日韩一区二区三区av | 男人的天堂在线视频 | 亚洲精品在 | 一区二区久久 | 欧美a√| 国产视频中文字幕 | www.888www看片 | 午夜激情国产 | 亚洲在线一区二区 | 青青伊人久久 | 免费在线观看黄色av | 天天艹 | 日韩久久久久 | 日本黄视频在线观看 | 国产精品福利久久久 | 国产精品一区二区三区在线播放 | 91视视频在线观看入口直接观看 | 日韩免费| 欧美日韩精品影院 |