政府網(wǎng)站建設(shè)發(fā)展指引軟文吧
ClickHouse
ClickHouse 屬于 OLAP 數(shù)據(jù)庫
OLTP 與 OLAP
- OLTP (On-Line Transaction Processing 聯(lián)機(jī)事務(wù)處理), 注重事務(wù)處理, 數(shù)據(jù)記錄的性能和安全性
- OLAP (On-Line Analytical Processing 聯(lián)機(jī)分析處理), 注重數(shù)據(jù)分析, 重點在查詢的性能
一般使用 OLTP 數(shù)據(jù)庫做業(yè)務(wù)數(shù)據(jù)存儲, 用 OLAP 數(shù)據(jù)庫做查詢分析.
ClickHouse 性能
- 寫入性能很高, 基本能到磁盤讀寫瓶頸
- 適合寬表查詢, 在JOIN查詢時, 關(guān)聯(lián)表需要控制在千萬級別以內(nèi)
- 分布式場景下需要預(yù)先規(guī)劃容量, 對于持續(xù)擴(kuò)容需求的場景運維成本比較高
- 支持全文搜索(inverted index, by n-gram or token), 具體討論可以看這個討論, 當(dāng)前還處于experimental
- 僅支持有限的事務(wù), 保證INSERT過程的原子性, 包括寫入和讀取
- 不支持 Windows. 雖然可以通過 WSL, Docker 之類運行在 Win10 上, 但是這樣的方式僅僅是"能運行", 性能已經(jīng)大打折扣, 沒有實用價值.
在需要復(fù)雜查詢的分布式場景, 可以考慮 Apache Doris.
安裝
硬件需求
- 硬盤安裝需要2.5G空間
- 內(nèi)存不小于4G, 推薦16G以上, 越大越好
- SSD + RAID, 文件格式 Ext4, XFS
- 集群部署, 建議使用10G(萬兆)網(wǎng)絡(luò)
Ubuntu 安裝
sudo apt-get install -y apt-transport-https ca-certificates dirmngr
# 在 /tmp 下創(chuàng)建臨時目錄
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
# 創(chuàng)建 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 文件結(jié)構(gòu)
- 配置文件 /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
服務(wù)管理
啟動服務(wù)
sudo systemctl start clickhouse-server
sudo systemctl status clickhouse-server
服務(wù)IP和端口
默認(rèn)只偵聽本地請求, 打開服務(wù)端口, 編輯 /etc/clickhouse-server/config.xml
sudo chmod 600 /etc/clickhouse-server/config.xml
sudo vi /etc/clickhouse-server/config.xml
取消注釋, 同時服務(wù)IPv6和IPv4
<listen_host>::</listen_host>
如果只需要提供IPv4, 可以取消這一行注釋
<listen_host>0.0.0.0</listen_host>
這兩行不能同時取消注釋, 啟動會報錯
用戶管理
ClickHouse 的用戶分兩種
- 直接配置在 /etc/clickhouse-server/user.xml 中的用戶, 例如 default
- 在SQL中創(chuàng)建的用戶
這兩種用戶的登錄方式是一樣的
配置用戶口令
打開 /etc/clickhouse-server/user.xml 能看到設(shè)置用戶口令相關(guān)的說明, 默認(rèn)用戶 default 的口令為空
簡單的說就是
- 明文口令直接用
<password>qwerty</password>
進(jìn)行設(shè)置 - 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>
相應(yīng)的口令生成命令
# SHA256
PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'
cY19OvVH <-- 口令
e17cd697e0845d75d2068ae1e1479d3fd10d76e5afa89724fbc6fe27554526e4 <-- SHA256結(jié)果# 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結(jié)果
如果 Centos7 下沒有 xxd 命令, 需要通過以下命令安裝
sudo yum install vim-common
如果需要增加位數(shù)
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 增加用戶
例如新增一個帶管理權(quán)限的用戶 dbowner, 可以在 /etc/clickhouse-server/user.d 下創(chuàng)建文件 dbowner.xml, 內(nèi)容為
<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
- 網(wǎng)絡(luò)來源: 所有IPv6, IPv4 地址
- 允許使用管理權(quán)限(通過
access_management = 1
)
clickhouse啟動時, 會將 user.d 下的配置文件與 user.xml 合并, 并覆蓋 user.xml 中重復(fù)的部分. 注意這個文件的權(quán)限, 需要將這個文件的owner設(shè)為 clickhouse, 否則 clickhouse 啟動后讀取會失敗.
sudo chown clickhouse:clickhouse dbowner.xml
通過 SQL 增加用戶, 并配置權(quán)限
具體的用戶權(quán)限配置, 參考 ClickHouse 官方說明
https://clickhouse.com/docs/en/operations/access-rights
上面添加的 dbowner 用戶只開啟了 access_management, 默認(rèn)情況下 SQL-driven access control 和 account management都是關(guān)閉的, 如果要啟用完整的 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 的機(jī)器上, 使用上面創(chuàng)建的 dbowner 登入 client, 并創(chuàng)建一個新用戶 dbroot, 授予全部權(quán)限
$ 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.
創(chuàng)建用戶成功, 但是授予權(quán)限時報錯了
:) 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增加以下權(quán)限
<named_collection_control>1</named_collection_control>
<show_named_collections>1</show_named_collections>
<show_named_collections_secrets>1</show_named_collections_secrets>
重啟 ClickHouse 后再執(zhí)行, 就能授權(quán)成功
:) 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 錯誤
填寫服務(wù)器地址, 默認(rèn)為 http://[server_ip]:8123, 用戶 default, 口令為空
使用 DBeaver
服務(wù)器地址, 默認(rèn)為 http://[server_ip]:8123, 用戶 default, 口令為空
常用管理命令
創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE my_db;
創(chuàng)建表
CREATE TABLE my_db.my_table (id UInt64, column1 String) ENGINE = MergeTree() ORDER BY id;
創(chuàng)建用戶
CREATE USER my_user IDENTIFIED BY 'password';
授予權(quán)限
# my_db下所有表的 ALTER 權(quán)限
GRANT ALTER ON my_db.* WITH GRANT OPTION;# my_db下my_table表的 ALTER 權(quán)限
GRANT ALTER ON my_db.my_table TO my_user;# 多個權(quán)限
GRANT SELECT, ALTER COLUMN ON my_db.my_table TO my_user WITH GRANT OPTION;
權(quán)限樹
├── 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
查看權(quán)限
SHOW GRANTS FOR my_user;
可以看下只開了access_management的 default 和完整權(quán)限的 dbroot 的權(quán)限差別
:) 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 │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
取消權(quán)限
REVOKE ALTER COLUMN ON my_db.my_table FROM my_user;
相關(guān)鏈接
- 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