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

ES不香嗎,為啥還要ClickHouse?

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

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

[[410030]]

圖片來自包圖網

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

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

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

架構和設計的對比

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

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

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

如上圖所示:

  • Client Node,負責 API 和數據的訪問的節點,不存儲/處理數據。
  • Data Node,負責數據的存儲和索引。
  • Master Node,管理節點,負責 Cluster 中的節點的協調,不存儲數據。

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

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

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

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

Clickhouse 使用 Zookeeper 進行分布式節點之間的協調。

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

查詢對比實戰

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

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

這個測試的架構如下:

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

①ES stack

ES stack 有一個單節點的 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 有一個單節點的 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 

③數據導入 stack

數據導入部分使用了 Vector.dev 開發的 vector,該工具和 fluentd 類似,都可以實現數據管道式的靈活的數據導入。

④測試控制 stack

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

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

在這之前,我們需要在 Clickhouse 上創建表。ES 的索引沒有固定模式,所以不需要事先創建索引。

創建表的代碼如下:

  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); 

創建好表之后,我們就可以啟動 vector,向兩個 stack 寫入數據了。vector 的數據流水線的定義如下:

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

運行 Docker 命令,執行該流水線:

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

數據導入后,我們針對一下的查詢來做一個對比。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 是文檔類型的數據庫,每一個文檔的模式不固定,所以會存在某字段不存在的情況;而 Clickhouse 對應為字段為空值。

正則表達式查詢,查詢匹配某個正則表達式的數據:

  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.*')" 

聚合計數,統計某個字段出現的次數:

  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" 

聚合不重復的值,查找所有不重復的字段的個數:

  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 次,然后統計查詢的性能結果。

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

總查詢時間的對比如下:

通過測試數據我們可以看出 Clickhouse 在大部分的查詢的性能上都明顯要優于 Elastic。

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

在聚合場景下,Clickhouse 表現異常優秀,充分發揮了列村引擎的優勢。

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

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

總結

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

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

作者:Gang Tao

編輯:陶家龍

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

 

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

2021-04-06 10:48:52

MySQLElasticsear數據庫

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-09-25 15:50:41

鴻蒙小米國產

2020-10-12 09:48:55

SSR JSPPHP

2024-02-01 08:21:40

2021-12-05 23:17:18

iOS蘋果系統

2020-10-21 09:19:27

Flutter開源項目

2022-03-28 11:06:38

Nacos監聽配置

2021-12-03 10:46:49

ELKGraylog運維

2021-12-02 06:34:34

GraylogELK日志

2020-01-21 21:15:16

WiFi網絡WiFi6

2025-06-25 09:31:41

2023-12-01 08:18:24

Redis網絡
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲午夜av | 欧美激情a∨在线视频播放 成人免费共享视频 | 久久精品国产99国产精品亚洲 | 国产视频综合 | 免费成人在线网站 | 婷婷综合激情 | 国产精品久久午夜夜伦鲁鲁 | 日韩免费高清视频 | 午夜在线免费观看 | www.玖玖玖 | 午夜精品久久久久久久99黑人 | 成人在线观看免费 | 欧美日韩视频 | 久久精品欧美一区二区三区不卡 | 日韩在线欧美 | 黄色片在线观看网址 | 鸡毛片| 国产精品一区二区三区久久 | 国产精品久久久久久亚洲调教 | 91九色视频在线 | 91精品国产自产精品男人的天堂 | 男女羞羞免费网站 | 亚洲国产成人av好男人在线观看 | 午夜爱爱毛片xxxx视频免费看 | 在线日韩欧美 | 老牛影视av一区二区在线观看 | 美女福利视频一区 | 午夜视频一区 | 91久久国产 | 日本在线综合 | 久久久久国产一区二区三区四区 | 国产jizz女人多喷水99 | 国产精品免费一区二区三区 | 精品国产乱码久久久久久中文 | 97色在线视频 | 中文字幕免费 | 久一精品 | 99精品国产一区二区青青牛奶 | 一区二区视频在线观看 | 亚洲精品成人 | 一级视频在线免费观看 |