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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/552575.html
標籤:大數據
上一篇:Apache Arrow DataFusion原理與架構
下一篇:返回列表