一、ClickHouse介紹
ClickHouse(開源)是一個面向列的數據庫管理系統(DBMS),用於在線分析處理查詢(OLAP)。
關鍵詞:開源、面向列、聯機分析處理(OLAP)
ClickHouse不僅查詢速度快(相較於hive等類似的分析型DBMS),而且硬件使用效率、容錯性、可靠性、易用性、線性擴展性等高。
1.1 ClickHouse的獨特功能
-
真正的列式DBMS 除了數據本身外不應該存在其他額外的數據。這意味着為了避免在值旁邊存儲它們的長度“number”,你必須支持固定長度數值類型。
-
數據壓縮 數據壓縮存儲在性能方面發揮着關鍵作用
-
數據的磁盤存儲 工作在傳統磁盤上的系統
-
多核心並行處理 大型查詢以一種自然的方式並行化,占用當前服務器上可用的所有必要資源
-
多服務器分布式處理 在ClickHouse中,數據可以保存在不同的shard上,每一個shard都由一組用於容錯的replica組成,查詢可以並行的在所有shard上進行處理
-
支持SQL ClickHouse支持基於SQL的查詢語言,該語言大部分情況下是與SQL標准兼容的。 支持的查詢包括 GROUP BY,ORDER BY,IN,JOIN以及非相關子查詢。 不支持窗口函數和相關子查詢
-
向量引擎 為了高效的使用CPU,數據不僅僅按列存儲,同時還按向量(列的一部分)進行處理
-
實時的數據更新 ClickHouse支持在表中定義主鍵。為了使查詢能夠快速在主鍵中進行范圍查找,數據總是以增量的方式有序的存儲在MergeTree中。因此,數據可以持續不斷高效的寫入到表中,並且寫入的過程中不會存在任何加鎖的行為
-
索引 按照主鍵對數據進行排序,使能夠以幾十毫秒的低延遲對數據進行特定值查找或范圍查找
-
適合在線查詢 在線查詢意味着在沒有對數據做任何預處理的情況下以極低的延遲處理查詢並將結果加載到用戶的頁面中
-
支持近似計算 ClickHouse提供各種各樣在允許犧牲數據精度的情況下對查詢進行加速的方法: 1、用於近似計算的各類聚合函數,如:distinct values, medians, quantiles 2、 基於數據的部分樣本進行近似查詢。這時,僅會從磁盤檢索少部分比例的數據。 3、 不使用全部的聚合條件,通過隨機選擇有限個數據聚合條件進行聚合。這在數據聚合條件滿足某些分布條件下,在提供相當准確的聚合結果的同時降低了計算資源的使用。
1.2 OLAP場景特征(適用場景)
-
絕大多數都是讀請求
-
數據以相當大的批量寫入(> 1000行),而不是單行。
-
不再修改已添加的數據
-
每次查詢都從數據庫中讀取大量的行,但是同時又僅需要少量的列
-
寬表,即每個表包含着大量的列
-
較少的查詢(通常每台服務器每秒數百個查詢或更少)
-
對於簡單查詢,允許延遲大約50毫秒
-
列中的數據相對較小: 數字和短字符串(例如,每個URL 60個字節)
-
處理單個查詢時需要高吞吐量(每個服務器每秒高達數十億行)
-
事務不是必須的
-
對數據一致性要求低
-
每一個查詢除了一個大表外,其他都是小表
-
查詢結果明顯小於源數據。換句話說,數據被過濾或聚合后能夠被存放在單台服務器的內存中
1.3 缺點(不適用場景)
-
沒有完整的事物支持
-
缺少高頻率,低延遲的修改或刪除已存在數據的能力。僅能用於批量刪除或修改數據,但這符合 GDPR
-
稀疏索引使得ClickHouse不適合通過其鍵檢索單行的點查詢
1.4 官方性能對比
ClickHouse的性能超過了市場上現有的類似的面向列的DBMS。它每秒處理數億到10億行,每台服務器每秒處理數百億字節的數據。單個查詢(解壓縮后,僅使用列)的處理性能峰值為每秒2 tb以上。 我們來看看官網提供的對比數據:分析型DBMS的性能比較
由上圖看出,ClickHouse比傳統的分析型數據庫快100-1000倍。
畢竟是官方自己提供的數據,為了更加真實的性能測試,后面會在實際環境中和GreenPlum等做測試對比。
1.5 數據類型支持
-
UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64 分別對應mysql數據類型smallint,tinyint,int,bigint/long
-
Float32, Float64分別對應mysql數據類型 float,double
-
DateTime 分別對應mysql數據類型datetime/timestamp
-
Nullable 嵌套數據類型
二、安裝部署(Centos7)
2.1 環境准備
參考hadoop集群搭建中的一、安裝環境准備
和二、安裝zookeeper
2.2 安裝CLickHouse(每台集群)
在此只介紹腳本安裝方式,手動及其他可參考: https://github.com/Altinity/clickhouse-rpm-install/blob/master/README.md https://clickhouse.yandex/docs/zh/getting_started/
Step1: 如果從官方倉庫安裝,需要確保您使用的是x86_64處理器構架的Linux並且支持SSE 4.2指令集 檢查是否支持SSE 4.2:
grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"
返回結果應為:“SSE 4.2 supported”
Step2: 基於腳本安裝
-
安裝依賴
sudo yum install -y curl
-
下載運行腳本 centos7顯式指定
os=centos dist=7
兩個參數
curl -s https://packagecloud.io/install/repositories/altinity/clickhouse/script.rpm.sh | sudo os=centos dist=7 bash
-
查看clickhouse可用安裝包
sudo yum list 'clickhouse*'
結果如下列表:有多個可用的包(包括新版本和舊工具),其中一些已經被棄用,因此不需要安裝所有可用的rpm。
Step3: 安裝ClickHouse的主要部分——服務器和客戶端應用程序
sudo yum install -y clickhouse-server clickhouse-client
查看校驗已安裝列表
sudo yum list installed 'clickhouse*'
Step4: 配置目錄查看及修改
-
安裝完后默認的配置文件路徑在
/etc/clickhouse-server/
下:config.xml(默認系統配置) 、users.xml(用戶相關配置) 通過查看配置文件config.xml,定了默認的數據目錄、臨時目錄、日志目錄等;/var/lib/clickhouse
/var/lib/clickhouse/tmp/
/var/log/clickhouse-server
實際生產環境中,這些數據目錄通常放在數據盤而不是系統盤,所以會做相應調整。 -
默認啟動腳本:
/etc/rc.d/init.d/clickhouse-server
-
最大打開文件數:
/etc/security/limits.d/clickhouse.conf
clickhouse soft nofile 262144 clickhouse hard nofile 262144 -
定時任務文件:
/etc/cron.d/clickhouse-server
(看看就好了。cron進程執行時,就會自動掃描該目錄下的所有文件,按照文件中的時間設定執行后面的命令),文件內容如下:
*/10 * * * * root (which service > /dev/null 2>&1 && (service clickhouse-server condstart ||:)) || /etc/init.d/clickhouse-server condstart > /dev/null 2>&1
-
安裝二進制文件目錄:
/usr/bin/clickhouse*
,共享文件目錄:/usr/share/clickhouse/
大都軟鏈接到了clickhouse這個二進制文件
更多服務端配置(/etc/clickhouse-server/config.xml )及說明文檔
Step5: 確保ClickHouse服務器正在運行
sudo /etc/init.d/clickhouse-server restart
Step6: 客戶端連接命令
clickhouse-client
至此單機安裝完畢。
2.3 集群配置
這一部分官方文檔整理的不夠清晰條理,個人覺得。 首先查看配置文件的文檔,里面大致介紹了服務端配置的覆蓋(替代)文件和用戶配置文件的創建和配置。然后找到分布式文檔參考配置新的內容。具體整理如下步驟。
2.3.1 創建擴展配置文件(metrika.xml)
-
配置對應config.xml的中的標簽進行復制擴展,新的標簽名應和config.xml中
incl="替換的標簽名"
一致。 -
每個clickhouse-server實例默認配置下對應只能被配置為某個數據分片(shard)的唯一副本(replica)。或添加內部復制端口配置。
默認本節點實例1: <http_port>8123</http_port> <tcp_port>9000</tcp_port> <interserver_http_port>9009</interserver_http_port> 添加本節點實例2 : <http_port>8124</http_port> <tcp_port>9001</tcp_port> <interserver_http_port>9010</interserver_http_port> 參考:https://www.cnblogs.com/freeweb/p/9352947.html
-
添加zookeeper配置需要重啟集群服務,此時會在zk客戶端查看生產/clickhouse目錄
-
配置需添加在``中。
完整配置示例如下:
<yandex>
<!-- 集群配置 -->
<clickhouse_remote_servers>
<!-- 集群名稱 -->
<hdc_3s1r_cluster>
<!-- 數據分片1 -->
<shard>
<weight>1</weight>
<internal_replication>true</internal_replication>
<replica>
<host>hdc-data4</host>
<port>9000</port>
<user>default</user>
<password>Hdc2019</password>
</replica>
</shard>
<!-- 數據分片2 -->
<shard>
<weight>1</weight>
<internal_replication>true</internal_replication>
<replica>
<host>hdc-data5</host>
<port>9000</port>
<user>default</user>
<password>Hdc2019</password>
</replica>
</shard>
<!-- 數據分片3 -->
<shard>
<weight>1</weight>
<internal_replication>true</internal_replication>
<replica>
<host>hdc-data6</host>
<port>9000</port>
<user>default</user>
<password>Hdc2019</password>
</replica>
</shard>
</hdc_3s1r_cluster>
</clickhouse_remote_servers>
<!-- 本節點副本名稱 (這里只配置單副本)-->
<macros>
<layer>01</layer>
<shard>03</shard>
<replica>hdc-data6</replica>
</macros>
<!-- 監聽網絡 -->
<networks