ClickHouse筆記: Ubuntu/Centos下的安裝, 配置和用戶管理

来源:https://www.cnblogs.com/milton/archive/2023/05/15/17401812.html
-Advertisement-
Play Games

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>
  • 日誌路徑 /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;

相關鏈接


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 線程阻塞概述 在生活中,最常見的阻塞現象是公路上汽車的堵塞。汽車在公路上快速行駛,如果前方交通受阻,就只好停下來等待,等到公路順暢,才能恢復行駛。 線程在運行中也會因為某些原因而阻塞。所有處於阻塞狀態的線程的共同特征:放棄 CPU,暫停運行,只有等到導致阻塞的原因消除,才能恢復運行,或者被其他線程中 ...
  • 介紹線程 線程是系統調度的最小單元,一個進程可以包含多個線程,線程是負責執行二進位指令的。 每個線程有自己的程式計數器、棧(Stack)、寄存器(Register)、本地存儲(Thread Local)等,但是會和進程內其他線程共用文件描述符、虛擬地址空間等。 對於任何一個進程來講,即便我們沒有主動 ...
  • pandas進行數據整理的意義在於,它是數據分析、數據科學和機器學習的前置步驟。 通過數據整理可以提前瞭解數據的概要,缺失值、重覆值等情況,為後續的分析和建模提供更為可靠的數據基礎。 本篇主要介紹利用pandas進行數據整理的各種方法。 1. 數據概要 獲取數據概要信息可以幫助我們瞭解數據的基本情況 ...
  • 偶數分頻:無論是通過D觸發器還是計數器實現,這類分頻都是最容易得到的,並且占空比容易控制在50%。對於D觸發器實現偶數分頻來說,分頻數只能得2^n,其餘分頻數只能由計數器法等其他方法實現。除此以外,隨著分頻的數目不斷增大,通過D觸發器實現觸發器數目會增多,在電路設計的過程中應當考慮面積因素。對於計數... ...
  • EF命令行工具 migrate.exe 進行Code First更新資料庫,6.3+使用ef6.exe 使用EF的Code First遷移可以用於從Visual Studio內部更新資料庫,但也可通過命令行工具 migrate.exe 進行執行。 如果項目已經更新到伺服器,後面的更新資料庫分為兩種辦 ...
  • ABP框架 ABP是用於創建現代化Web應用程式的完整體繫結構和強大的基礎架構,以模塊化的方式進行開發,所有模塊以nuget包的方式提供,開箱即用,遵循最佳實踐和約定,提供SOLID開發經驗。 | 縮寫 | 英文 | 中文 | |--|--|--| | SRP | The Single Respon ...
  • 以沁恆的FreeRTOS示例項目為例, 說明如何在 CH32V208 評估上運行 FreeRTOS, 以及運行 FreeRTOS 涉及的庫文件改動. ...
  • 原創文檔編寫不易,未經許可請勿轉載。文檔中有疑問的可以郵件聯繫我。 郵箱:[email protected] 文章基於CentOS 7.8系統使用Containerdr作為容器運行時通過kubeadm指導搭建k8s單機master集群,使用calico作為k8s集群的網路插件。K8S官方在1.24版本 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...