ClickHouse 屬於 OLAP 資料庫, 與 OLTP (Transaction Process) 相比, 註重數據分析, 重點在查詢的性能. 在業務系統中, 往往使用 OLTP 資料庫做業務數據存儲, 用 OLAP 資料庫做查詢分析, 在一些場景下ClickHouse可以取代ES(Elast... ...
ClickHouse
ClickHouse 屬於 OLAP 資料庫
OLTP 與 OLAP
- OLTP (On-Line Transaction Processing 聯機事務處理), 註重事務處理, 數據記錄的性能和安全性
- OLAP (On-Line Analytical Processing 聯機分析處理), 註重數據分析, 重點在查詢的性能
一般使用 OLTP 資料庫做業務數據存儲, 用 OLAP 資料庫做查詢分析.
ClickHouse 性能
- 寫入性能很高, 基本能到磁碟讀寫瓶頸
- 適合寬表查詢, 在JOIN查詢時, 關聯表需要控制在千萬級別以內
- 分散式場景下需要預先規劃容量, 對於持續擴容需求的場景運維成本比較高
- 支持全文搜索(inverted index, by n-gram or token), 具體討論可以看這個討論, 當前還處於experimental
- 僅支持有限的事務, 保證INSERT過程的原子性, 包括寫入和讀取
- 不支持 Windows. 雖然可以通過 WSL, Docker 之類運行在 Win10 上, 但是這樣的方式僅僅是"能運行", 性能已經大打折扣, 沒有實用價值.
在需要複雜查詢的分散式場景, 可以考慮 Apache Doris.
安裝
硬體需求
- 硬碟安裝需要2.5G空間
- 記憶體不小於4G, 推薦16G以上, 越大越好
- SSD + RAID, 文件格式 Ext4, XFS
- 集群部署, 建議使用10G(萬兆)網路
Ubuntu 安裝
sudo apt-get install -y apt-transport-https ca-certificates dirmngr
# 在 /tmp 下創建臨時目錄
GNUPGHOME=$(mktemp -d)
echo $GNUPGHOME
# 生成 clickhouse-keyring.gpg
sudo GNUPGHOME="$GNUPGHOME" gpg --no-default-keyring --keyring /usr/share/keyrings/clickhouse-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 8919F6BD2B48D754
sudo rm -r "$GNUPGHOME"
sudo chmod +r /usr/share/keyrings/clickhouse-keyring.gpg
# 創建 ck 的 apt list
echo "deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg] https://packages.clickhouse.com/deb stable main" | sudo tee /etc/apt/sources.list.d/clickhouse.list
# 更新軟體包
sudo apt-get update
# 安裝
sudo apt install -y clickhouse-server clickhouse-client
Centos7安裝
sudo yum-config-manager --add-repo https://packages.clickhouse.com/rpm/clickhouse.repo
sudo yum install -y clickhouse-server clickhouse-client
CK 文件結構
- 配置文件 /etc/clickhouse-server, config.xml 全局配置, users.xml 用戶配置
- 存儲目錄 /var/lib/clickhouse
- 路徑定義: /etc/clickhouse-server/config.xml
<path>/var/lib/clickhouse/</path>
,<tmp_path>/var/lib/clickhouse/tmp/</tmp_path>
,<user_files_path>/var/lib/clickhouse/user_files/</user_files_path>
- 路徑定義: /etc/clickhouse-server/config.xml
- 日誌路徑 /var/log/clickhouse-server/, clickhouse-server.err.log clickhouse-server.log
服務管理
啟動服務
sudo systemctl start clickhouse-server
sudo systemctl status clickhouse-server
服務IP和埠
預設只偵聽本地請求, 打開服務埠, 編輯 /etc/clickhouse-server/config.xml
sudo chmod 600 /etc/clickhouse-server/config.xml
sudo vi /etc/clickhouse-server/config.xml
取消註釋, 同時服務IPv6和IPv4
<listen_host>::</listen_host>
如果只需要提供IPv4, 可以取消這一行註釋
<listen_host>0.0.0.0</listen_host>
這兩行不能同時取消註釋, 啟動會報錯
用戶管理
ClickHouse 的用戶分兩種
- 直接配置在 /etc/clickhouse-server/user.xml 中的用戶, 例如 default
- 在SQL中創建的用戶
這兩種用戶的登錄方式是一樣的
配置用戶口令
打開 /etc/clickhouse-server/user.xml 能看到設置用戶口令相關的說明, 預設用戶 default 的口令為空
簡單的說就是
- 明文口令直接用
<password>qwerty</password>
進行設置 - SHA256口令用
<password_sha256_hex>65e84be33532fb784c48129675f9eff3a682b27168c0ea744b2cf58ee02337c5</password_sha256_hex>
- Double SHA1口令用
<password_double_sha1_hex>e395796d6546b1b65db9d665cd43f0e858dd4303</password_double_sha1_hex>
- LDAP驗證用
<ldap><server>my_ldap_server</server></ldap>
- Kerberos驗證用
<kerberos><realm>EXAMPLE.COM</realm></kerberos>
相應的口令生成命令
# SHA256
PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'
cY19OvVH <-- 口令
e17cd697e0845d75d2068ae1e1479d3fd10d76e5afa89724fbc6fe27554526e4 <-- SHA256結果
# Double SHA1
PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha1sum | tr -d '-' | xxd -r -p | sha1sum | tr -d '-'
1gQO8XpM <-- 口令
e9fdf3480016dfae8ad0170e846edd031180a3f4 <-- Double SHA1結果
如果 Centos7 下沒有 xxd 命令, 需要通過以下命令安裝
sudo yum install vim-common
如果需要增加位數
PASSWORD=$(base64 < /dev/urandom | head -c16); echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'
vlIlWHFqY0BbSy2f
e08ebd515246f1b5f3bfdb24b967a797b7218289b263ed0fbb3ff47fcc121f1b
如果需要自定義
PASSWORD=asdf1234; echo "$PASSWORD"; echo -n "$PASSWORD" | sha1sum | tr -d '-' | xxd -r -p | sha1sum | tr -d '-'
asdf1234
dda7b4594264195da8bb303516d7ec5509b7b942
通過 user.d 下的 xml 增加用戶
例如新增一個帶管理許可權的用戶 dbowner, 可以在 /etc/clickhouse-server/user.d 下創建文件 dbowner.xml, 內容為
<clickhouse>
<users>
<dbowner>
<password>abcd1234</password>
<networks>
<ip>::/0</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
<access_management>1</access_management>
</dbowner>
</users>
</clickhouse>
上面這個配置
- 用戶名為 dbowner
- 口令為明文的 abcd1234
- 網路來源: 所有IPv6, IPv4 地址
- 允許使用管理許可權(通過
access_management = 1
)
clickhouse啟動時, 會將 user.d 下的配置文件與 user.xml 合併, 並覆蓋 user.xml 中重覆的部分. 註意這個文件的許可權, 需要將這個文件的owner設為 clickhouse, 否則 clickhouse 啟動後讀取會失敗.
sudo chown clickhouse:clickhouse dbowner.xml
通過 SQL 增加用戶, 並配置許可權
具體的用戶許可權配置, 參考 ClickHouse 官方說明
https://clickhouse.com/docs/en/operations/access-rights
上面添加的 dbowner 用戶只開啟了 access_management, 預設情況下 SQL-driven access control 和 account management都是關閉的, 如果要啟用完整的 SQL user mode, 要在<dbowner>
下增加的配置為
<access_management>1</access_management>
<named_collection_control>1</named_collection_control>
<show_named_collections>1</show_named_collections>
<show_named_collections_secrets>1</show_named_collections_secrets>
在安裝 ClickHouse 的機器上, 使用上面創建的 dbowner 登入 client, 並創建一個新用戶 dbroot, 授予全部許可權
$ clickhouse-client --user dbowner --password abcd1234
:) CREATE USER dbroot IDENTIFIED BY 'root1234';
CREATE USER dbroot IDENTIFIED WITH sha256_hash BY '21AC41BC256B35A32EC2021D359AE5F297AD7ED2F8ED8F7A2A1A7B9F1F94F898' SALT '56DC39142C0AEB19BC2C61AACBD9F27DD040E25489CC29B76D07D65F6D2A3AA1'
Query id: d0099db9-b292-4905-84bd-a91da19f8edc
Ok.
0 rows in set. Elapsed: 0.005 sec.
創建用戶成功, 但是授予許可權時報錯了
:) GRANT ALL ON *.* TO dbroot WITH GRANT OPTION;
GRANT ALL ON *.* TO dbroot WITH GRANT OPTION
Query id: 92a50da8-d847-4f4f-a74c-95b9f1207a67
0 rows in set. Elapsed: 0.007 sec.
Received exception from server (version 23.4.2):
Code: 497. DB::Exception: Received from localhost:9000. DB::Exception: dbowner: Not enough privileges. To execute this query it's necessary to have grant SHOW, SELECT, INSERT, ALTER, CREATE, DROP, UNDROP TABLE, TRUNCATE, OPTIMIZE, BACKUP, KILL QUERY, KILL TRANSACTION, MOVE PARTITION BETWEEN SHARDS, ACCESS MANAGEMENT, NAMED COLLECTION CONTROL, SYSTEM, dictGet, INTROSPECTION, SOURCES ON *.* WITH GRANT OPTION. (ACCESS_DENIED)
給dbowner增加以下許可權
<named_collection_control>1</named_collection_control>
<show_named_collections>1</show_named_collections>
<show_named_collections_secrets>1</show_named_collections_secrets>
重啟 ClickHouse 後再執行, 就能授權成功
:) GRANT ALL ON *.* TO dbroot WITH GRANT OPTION;
GRANT ALL ON *.* TO dbroot WITH GRANT OPTION
Query id: f4eaa3ce-8182-4717-9270-ce2e95eb2b88
Ok.
0 rows in set. Elapsed: 0.004 sec.
這時候, 就可以用 dbroot / root1234 登錄 ClickHouse 了
連接
使用 clickhouse-client
clickhouse-client --user [user] --password [password]
使用 Tabix
用Firefox訪問 http://dash.tabix.io, Chrome貌似不行, 會報 CORS 錯誤
填寫伺服器地址, 預設為 http://[server_ip]:8123, 用戶 default, 口令為空
使用 DBeaver
伺服器地址, 預設為 http://[server_ip]:8123, 用戶 default, 口令為空
常用管理命令
創建資料庫
CREATE DATABASE my_db;
創建表
CREATE TABLE my_db.my_table (id UInt64, column1 String) ENGINE = MergeTree() ORDER BY id;
創建用戶
CREATE USER my_user IDENTIFIED BY 'password';
授予許可權
# my_db下所有表的 ALTER 許可權
GRANT ALTER ON my_db.* WITH GRANT OPTION;
# my_db下my_table表的 ALTER 許可權
GRANT ALTER ON my_db.my_table TO my_user;
# 多個許可權
GRANT SELECT, ALTER COLUMN ON my_db.my_table TO my_user WITH GRANT OPTION;
許可權樹
├── ALTER (only for table and view)/
│ ├── ALTER TABLE/
│ │ ├── ALTER UPDATE
│ │ ├── ALTER DELETE
│ │ ├── ALTER COLUMN/
│ │ │ ├── ALTER ADD COLUMN
│ │ │ ├── ALTER DROP COLUMN
│ │ │ ├── ALTER MODIFY COLUMN
│ │ │ ├── ALTER COMMENT COLUMN
│ │ │ ├── ALTER CLEAR COLUMN
│ │ │ └── ALTER RENAME COLUMN
│ │ ├── ALTER INDEX/
│ │ │ ├── ALTER ORDER BY
│ │ │ ├── ALTER SAMPLE BY
│ │ │ ├── ALTER ADD INDEX
│ │ │ ├── ALTER DROP INDEX
│ │ │ ├── ALTER MATERIALIZE INDEX
│ │ │ └── ALTER CLEAR INDEX
│ │ ├── ALTER CONSTRAINT/
│ │ │ ├── ALTER ADD CONSTRAINT
│ │ │ └── ALTER DROP CONSTRAINT
│ │ ├── ALTER TTL/
│ │ │ └── ALTER MATERIALIZE TTL
│ │ ├── ALTER SETTINGS
│ │ ├── ALTER MOVE PARTITION
│ │ ├── ALTER FETCH PARTITION
│ │ └── ALTER FREEZE PARTITION
│ └── ALTER LIVE VIEW/
│ ├── ALTER LIVE VIEW REFRESH
│ └── ALTER LIVE VIEW MODIFY QUERY
├── ALTER DATABASE
├── ALTER USER
├── ALTER ROLE
├── ALTER QUOTA
├── ALTER [ROW] POLICY
└── ALTER [SETTINGS] PROFILE
查看許可權
SHOW GRANTS FOR my_user;
可以看下只開了access_management的 default 和完整許可權的 dbroot 的許可權差別
:) show grants for dbroot;
┌─GRANTS FOR dbroot────────────────────────────┐
│ GRANT ALL ON *.* TO dbroot WITH GRANT OPTION │
└──────────────────────────────────────────────┘
:) show grants for default;
┌─GRANTS FOR default─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ GRANT SHOW, SELECT, INSERT, ALTER, CREATE, DROP, UNDROP TABLE, TRUNCATE, OPTIMIZE, BACKUP, KILL QUERY, KILL TRANSACTION, MOVE PARTITION BETWEEN SHARDS, SYSTEM, dictGet, INTROSPECTION, SOURCES, CLUSTER ON *.* TO default │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
取消許可權
REVOKE ALTER COLUMN ON my_db.my_table FROM my_user;
相關鏈接
- https://jishuin.proginn.com/p/763bfbd59c4b
- https://zhuanlan.zhihu.com/p/421469439
- https://www.tinybird.co/blog-posts/text-search-at-scale-with-clickhouse
- https://clickhouse.com/blog/clickhouse-search-with-inverted-indices