搜索引擎 : ClickHouse

 ClickHouse 介紹

  • ClickHouse 是 2016 年由俄羅斯搜索引擎Yandex 內部項目開發的關聯型的 OLAP 數據庫。
  • ClickHouse 是 ClickStream 和 Data WareHouse 的組合。以極高的查詢速度和性能而聞名。
  • 許多公司如 Uber、Slack、Tesla、Tencent、Tiktok、Cloudflare 等都在生產中使用 ClickHouse。
  • 其中 Tiktok 更是 ClickHouse 深度使用者,並且 Tiktok 在 ClickHouse 基礎上做了更多的擴展,例如加入雲端的架構等等,推出另外款名稱為 ByteHouse 產品,功能更加強大,不過需要另外收費

OLAP 介紹

概念:
OLAP 又稱為線上分析處理,主要是用於快速分析大數據的技術,利用多維的角度去分析數據,從而幫助用戶可更好的透過數據發現趨勢走向,做出基於數據資料的決策。

特點
  • 多維數據分析 - 提供多維數據分析的功能,能以不同的維度對數據進行分析。例如可以按照時間、地區、產品類別等多個維度進行數據分析,以此深入了解數據之間的關係和趨勢
  • 複雜分析功能 - 提供了包括分組、聚合、過濾和排序等操作。可以讓使用者根據具體的業務需求,進行多層次的分析,透過了解數據的細節來發現其中的模式和彼此間的關聯性。
  • 決策支持 - 廣泛應用於決策支持系統中,幫助使用者做出基於數據資料的決策。通過多維分析資料,讓使用者可以更好地理解企業的業務運作和趨勢,從而做出更明智的決策。
  • 快速查詢 - 系統通常具有快速查詢的能力,這是因為有預先聚集、快速索引和並行處理等技術。讓使用者可以在短時間內查詢大量數據,而不必擔心系統的速度問題。

Row-oriented 介紹

  • 將每列的資料存成一組,顧名思義它會將同一列的數據連續的儲存起來變成同一組
  • 適合在需要有 transaction 並且會頻繁異動資料的場景中使用
  • MySQL、PostgreSQL 都屬於 Row-oriented 的資料庫

ID

Name

Age

Sex

1

Amy

25

Female

2

Jhon

30

Male

3

Mark

28

Male

從上表中可以看出列儲存模式的儲存方式,會將每一列的資料連續存成一組。這種設計可以讓你很快的得到一整列的資訊,例如只要知道 id 就可以快速取得整列的資訊,包含 NameAgeSex 欄位資料。
缺點為使用空間較大,因為需要紀錄整列的數據,所以成本會比較大。查詢部份,就算不是篩選全部的欄位,也會需要先掃描整列資料,再依語法過濾需要的欄位,所以當資料過於龐大時會很耗時間。

Columnar 介紹

  • 行的儲存模式,會將來自同一行的資料儲存成一組
  • 其特性適合對大數據進行分析和複雜查詢
  • Cassandra、HBase、Clickhouse 都屬於 Columnar 的資料庫

               

從上圖可以看出 Columnar 是將一行一行的資料紀錄成一組,這種儲存方式在對於需要對資料做計算處理或是模糊搜尋的情境中,只需要針對特定的欄位去搜索就行了,不用像列儲存模式需要把整列資料全部掃描完才能夠做運算,所以速度會快比較快。

Row-oriented V.S Columnar

Row-oriented
Columnar
比較兩個儲存模式執行上的差異,列儲存模式會先掃描整列資料,再篩選出需要使用的資料欄位,將資料去做統計報表分析,所以速度較慢。
行儲存模式,則不需要掃描全部資料,只需要取所需要的資訊就能完成查詢,所以在大數據資料分析上,行儲存模式查詢速度上會比列的儲存模式來的更快。

ClickHouse 和 MySQL 比較 

 

ClickHouse

MySQL

儲存模式

Columnar

Row-oriented

資料庫類型

倉庫型數據(OLAP)

關聯式資料庫(OLTP)

索引差異

稀疏索引

B+ Tree

適用情境

大數據分析並且無需頻繁異動資料場景

需即時更新資料並且有 transaction 需求場景。

分散式架構

原始設計就為分散式資料庫

需額外套件擴展實現

ClickHouse 優點

  • 有完整的 DBMS 功能 - DBMS 全名又叫做資料庫管理系統,主要功能可以有效的管理和操作資料庫,確保資料的安全性、一致性和可用性,讓使用者可以很好的管理和控制資料庫。
  • 無須預先處理資料 - 可以直接處理原始數據資料,不需要再對資料做任何的預先處理或是轉換。意味著可以直接將即時生成的大量資料直接導入到 ClickHouse 中,就可以做查詢操作,而不用再等待資料處理完成後才能使用,使得資料轉移能更快速和便利。
  • 使用 Columnar 存儲模式 - Columnar 更適合用於大數據和有複雜查詢的情境來做使用,查詢速度會更加快速且有效率
  • 充分的利用所有可用的資源 - 底層技術可以同时利用多个 CPU 核心和磁碟資源來執行查詢的操作,以此加速數據查詢的處理速度。
  • 不依賴複雜生態系 - 不需要像其他分散式資料庫一樣,需要依賴過於複雜的生態系統,例如 Hadoop。可以獨立運作,並且更輕鬆的佈署和管理,減少系統的複雜性和維護的成本。

ClickHouse 缺點

  • 不適合頻繁的資料異動 - 在 ClickHouse 中異動資料算是很耗效能的操作,當發生異動時不管是 delete 或是 update, ClickHouse 都需調整相關的索引值,並且重新規劃資料分區,所以要是頻繁的異動資料,會嚴重影響系統穩定性和可用性。
  • 異動資料為非同步操作 - ClickHouse 在實際更新時,並不會真的刪除資料,而是會新增一筆新的資料,並且將對應的原始的資料做刪除標記。ClickHouse 底層會不定時的批次處理需要刪除的資料,這樣就會導致資料在合併前,可能會出現資料重複的情況,要解決這個情況,就必須要要在查詢時另外做處理,例如下 Distinct 去重或是 ClickHouse 提供的 FINAL 和 OPTIMIZE 語法強制合併資料。 
  • 不支援 transaction - 因為上述所說缺點,導致 ClickHouse 無法支援 transaction。
  • 需要耗費大量的計算和儲存資源 - ClickHouse 不管是查詢單筆或是好幾千萬筆,都會用盡資源去查詢,如此就會導致當查詢筆數很少時,也需要耗費大量的資源

安裝 ClickHouse 和 Tabix

  • docker pull yandex/clickhouse-server
    - 拉取 ClickHouse 的 image 檔案
  • docker run -d -p 8123:8123 -p 9000:9000 --name clickhouse yandex/clickhouse-server
    - 啟動 ClickHouse 服務
  • 調整 clickhouse-server 的 config.xml 設定
    - 調整 ClickHouse config.xml 檔,啟用 Tabix GUI
ClickHouse 的安裝,目前實做是用 docker 來啟動 ClickHouse 的服務,先 pull clickhouse-server 的 image 並且預留 8123 和 9000 port 供 ClickHouse 使用。
這邊另外裝了 Tabix 套件,這個是 ClickHouse 的 GUI,可以讓使用者用介面方式去操作 ClickHouse 的資料,Tabix 可以直接透過修改 ClickHouse Config 設定就能建置起來。



上圖是 docker-compose.yml 有關 ClickHouse 的配置,這邊特別將 Config 印射出來,是因為 ClickHouse 相關內部的設定都可以在這邊做調整。

ClickHouse 在 Container 操作

  1. 進入 ClickHouse 的 container
  2. 輸入 clickhouse-client 指令進入操作的命令列
  3. 輸入要查的 sql 語法
  4. 顯示查詢結果
  5. 顯示查詢的筆數、讀取速度、數據大小等資訊

ClickHouse 在 Tabix 操作

可以使用 Tabix 已介面的方式操作 ClickHouse,使用 Tabix 前需要先登入,輸入自訂的連線名稱、連線 URL、帳號 (default) 密碼 (無)。
登入後就可以在上方輸入 sql 相關語法,執行後下方會出現查詢結果,包含查詢筆數、讀取速度、數據大小等資訊。 Tabix 特別的地方是可以將資訊轉換成圖表分析,如下圖。
 
 

ClickHouse 於 Laravel 應用

  • glushkovds/phpclickhouse-laravel - 整合 clickHouse 到 Laravel 專案上

資料寫入:
Model 建置
查詢新增範例 (原生語法)
 查詢新增範例 (Model)

參考資料

0 Comments:

張貼留言