在本章節中,主要整理一些ClickHouse資料庫伺服器在建置的時候出現的錯誤與問題。
無法使用apt-get
指令執行ClickHouse資料庫相關套件的安裝,應該要檢查下列的事項:
檢查網路防火牆設定,是否連到網際網路或是連到與ClickHouse有關的連結網址有被阻擋。
如果仍然無法解決上述的問題,則可以手動下載DEB套件並使用sudo dpkg -i
指令進行手動的安裝,相關的連結網址如下:
需要有這三個套件:
可能的問題如下:
可以使用下列的指令進行ClickHouse資料庫服務目前的狀態:
sudo service clickhouse-server status
# 或是
sudo systemctl status clickhouse-server.service
如果使用上述的狀態發現ClickHouse資料庫服務沒有啟動的話,則可以使用下列指令進行啟動:
sudo service clickhouse-server start
# 或是
sudo systemctl start clickhouse-server.service
同時我們也可以檢查記錄,預設資料庫的記錄會放在/var/log/clickhouse-server/clickhouse-server.log
之路徑檔案中。
如果伺服器啟動成功的話, 我們應該會看到下列的設定:
<Information> Application: starting up.
— 代表資料庫伺服器已經成功啟動了。<Information> Application: Ready for connections.
— 表示資料庫伺服器已經正在運行並準備好處理客戶端的連線了。如果找到記錄中有錯誤,則是以<Error>
為開頭的,相關的錯誤記錄訊息如下:
2019.01.11 15:23:25.549505 [ 45 ] {} <Error> ExternalDictionaries: Failed reloading 'event2id' external dictionary: Poco::Exception. Code: 1000, e.code() = 111, e.displayText() = Connection refused, e.what() = Connection refused
同時我們也可以透過下列指令來查看system.d
的記錄:
sudo journalctl -u clickhouse-server
如果是以Docker映像檔啟動ClickHouse資料庫並啟動IPv6網路的話,則需要確認是否有設定network=host
。
若是存取端點設定問題,則需要檢查伺服器端的設定中的listen_host
與tcp_port
之設定是否正確。
要注意的是,預設ClickHouse伺服器只允許本地端主機進行連線。
若是有關於HTTP協定的設定,則需要檢查伺服器端有關於HTTP API等相關的設定是否正確。
若是有關於安全連線的設定,則需要檢查伺服器端有關於tcp_port_secure
、SSL憑證以及其他關於使用客戶端指令進行安全連線設定的參數設定。
舉例來說,在使用clickhouse-client
指令並搭配--secure
或是適當的設定檔進行SSL憑證驗證的安全連線。
若是有關於使用者的設定,我們可能使用了錯誤的使用者名稱、密碼或是在設定SSL安全連線時設定錯誤的憑證與私鑰檔案路徑。
若連上資料庫後無法執行SQL查詢,像是下面使用了curl
指令透過HTTP介面連線進行查詢所輸出的錯誤訊息:
$ curl 'http://localhost:8123/' --data-binary "SELECT a"
Code: 47, e.displayText() = DB::Exception: Unknown identifier: a. Note that there are no tables (FROM clause) in your query, context: required_names: 'a' source_tables: table_aliases: private_aliases: column_aliases: public_columns: 'a' masked_columns: array_join_columns: source_columns: , e.what() = DB::Exception
我們可以改用clickhouse-client
並搭配--stacktrace
參數找出連線後無法執行的問題,相關執該指令所輸出的訊息如下:
peter@ubuntu-s-4vcpu-8gb-amd-sgp1-01:~$ clickhouse-client --stacktrace
ClickHouse client version 22.8.4.7 (official build).
Connecting to localhost:9000 as user default.
If you have installed ClickHouse and forgot password you can reset it in the configuration file.
The password for default user is typically located at /etc/clickhouse-server/users.d/default-password.xml
and deleting this file will reset the password.
See also /etc/clickhouse-server/users.xml on the server where ClickHouse is installed.
Code: 516. DB::Exception: Received from localhost:9000. DB::Exception: default: Authentication failed: password is incorrect or there is no user with such name. Stack trace:
0. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, bool) in /usr/bin/clickhouse
1. DB::AccessControl::authenticate(DB::Credentials const&, Poco::Net::IPAddress const&) const in /usr/bin/clickhouse
2. DB::Session::authenticate(DB::Credentials const&, Poco::Net::SocketAddress const&) in /usr/bin/clickhouse
3. DB::TCPHandler::receiveHello() in /usr/bin/clickhouse
4. DB::TCPHandler::runImpl() in /usr/bin/clickhouse
5. DB::TCPHandler::run() in /usr/bin/clickhouse
6. Poco::Net::TCPServerConnection::start() in /usr/bin/clickhouse
7. Poco::Net::TCPServerDispatcher::run() in /usr/bin/clickhouse
8. Poco::PooledThread::run() in /usr/bin/clickhouse
9. Poco::ThreadImpl::runnableEntry(void*) in /usr/bin/clickhouse
10. start_thread in /lib/x86_64-linux-gnu/libpthread-2.27.so
11. clone in /lib/x86_64-linux-gnu/libc-2.27.so
. (AUTHENTICATION_FAILED)
從上述的指令執行後所輸出的訊息可以知道,有關於密碼驗證有問題。
如果每次連線的時候都無法執行查詢,則我們需要檢查啟動伺服器的記錄找出錯誤的訊息。
如果我們發現ClickHouse資料庫在處理SQL語句很慢的時候,我們應該要檢查該伺服器是不是有其他資源占用的情況,如網路、CPU、記憶體等硬體資源。
我們也可以使用clickhouse-benchmark
工具來評估查詢語句,用這工具會顯示每秒處理了多少查詢語句、每秒處理多少資料筆數以及處理語句花了多久的時間。
下列是clickhouse-benchmark
指令的用法:
$ clickhouse-benchmark --query ["single query"] [keys]
或是也可以參考下列的用法:
$ echo "single query" | clickhouse-benchmark [keys]
或是使用下列的用法:
$ clickhouse-benchmark [keys] <<< "single query"
如果我們要一次執行多行的語句,則可以先建立一個SQL檔案,並使用下列的指令進行SQL語句的評估:
clickhouse-benchmark [keys] < queries_file;
上述的[keys]
則指的是參數,可以指定的參數如下:
--query=QUERY
— 指定要執行的查詢,如果這個參數沒有指定的話,則clickhouse-benchmark
將會從標準輸入(stdin)管線讀取查詢語句。-c N
或是長參數--concurrency=N
— 設定讓clickhouse-benchmark
模擬有多少個數量同時併發去執行指定的SQL語句,預設值為:1。-d N
或是長參數--delay=N
— 每次輸出執行報告的間隔時間,若關閉報告則設定0,預設值為:1。-h HOST
或是長參數--host=HOST
— 指定伺服器的主機,預設值為:localhost。-p N
或是長參數--port=N
— 指定伺服器的埠號,預設值為:9000。-i N
或是長參數--iterations=N
— 總共查詢的數量,預設值為:0,將為一直執行查詢。-r
或是長參數--randomize
— 如果指定多個查詢語句時,會以亂數的方式隨機順序執行設定的多個查詢語句。-s
或是長參數--secure
— 使用TLS方式進行資料庫的連線。-t N
或是長參數--timelimit=N
— 設定逾時時間,單位為秒,當逾時時間到了時候,clickhouse-benchmark
則會停止傳送查詢,預設值為:0;即於逾時時間設定為關閉的。--confidence=N
— T-test檢定,的等級可能設定的值為:0 (80%)、1 (90%)、2 (95%)、3 (98%)、4 (99%)與5 (99.5%)。預設值為:5
clickhouse-benchmark
工具執行了兩個樣本的學生T檢定來決定是否這兩個樣本在選擇的信賴區間中是否是不同的。--cumulative
— 輸出累積的資料,而不是一個間隔的資料。--database=DATABASE_NAME
— 指定ClickHouse資料庫名稱,預設值為:default。--json=FILEPATH
— 使用JSON
當作格式輸出,當此參數有設定時,clickhouse-benchmark
工具將會輸出以JSON為格式的指定檔案的報告。--user=USERNAM
E — ClickHouse資料庫使用者名稱,預設值為:default。--password=PASSWORD
— ClickHouse資料庫使用者名稱,預設值為:空字串。--stacktrace
— 輸出執行堆疊訊息,當這個參數設定時候,clickhouse-bencmark
工具將輸出堆疊與可追蹤的例外訊息。--stage=WORD
— 在伺服器上處理查詢的狀態,ClickHouse資料庫會在指定特殊的狀態時候停止處理語句並回應訊息出來。
--help
— 輸出該工具幫助的訊息。若要執行查詢語句時需要做設定(settings),則可以使用--<session setting name>= SETTING_VALUE
的參數設定達成。
帶入設定參數範例像是:--max_memory_usage=1048576
。
下列是執行clickhouse-benchmark
工具指令後的輸出訊息:
echo "SELECT 1" | clickhouse-benchmark --password password -i 10 --cumulative
Loaded 1 queries.
Queries executed: 10.
localhost:9000, queries 10, QPS: 1258.224, RPS: 1258.224, MiB/s: 0.001, result RPS: 1258.224, result MiB/s: 0.001.
0.000% 0.001 sec.
10.000% 0.001 sec.
20.000% 0.001 sec.
30.000% 0.001 sec.
40.000% 0.001 sec.
50.000% 0.001 sec.
60.000% 0.001 sec.
70.000% 0.001 sec.
80.000% 0.001 sec.
90.000% 0.001 sec.
95.000% 0.001 sec.
99.000% 0.001 sec.
99.900% 0.001 sec.
99.990% 0.001 sec.
在上述輸出的報告訊息中,我們可以知道幾件事情:
localhost:9000
。以下是一個使用clickhouse-benchmark
的指令範例:
echo "SELECT * FROM system.numbers LIMIT 10000000 OFFSET 10000000" | clickhouse-benchmark -i 10 --password password
執行上述指令所輸出的訊息如下:
peter@ubuntu-s-4vcpu-8gb-amd-sgp1-01:~$ echo "SELECT * FROM system.numbers LIMIT 10000000 OFFSET 10000000" | clickhouse-benchmark -i 10 --password password
Loaded 1 queries.
Queries executed: 5.
localhost:9000, queries 5, QPS: 4.917, RPS: 98556952.837, MiB/s: 751.930, result RPS: 49169001.636, result MiB/s: 375.130.
0.000% 0.182 sec.
10.000% 0.182 sec.
20.000% 0.190 sec.
30.000% 0.190 sec.
40.000% 0.194 sec.
50.000% 0.194 sec.
60.000% 0.194 sec.
70.000% 0.203 sec.
80.000% 0.203 sec.
90.000% 0.248 sec.
95.000% 0.248 sec.
99.000% 0.248 sec.
99.900% 0.248 sec.
99.990% 0.248 sec.
Queries executed: 10.
localhost:9000, queries 10, QPS: 4.883, RPS: 97870199.029, MiB/s: 746.690, result RPS: 48826387.563, result MiB/s: 372.516.
0.000% 0.182 sec.
10.000% 0.187 sec.
20.000% 0.190 sec.
30.000% 0.194 sec.
40.000% 0.200 sec.
50.000% 0.202 sec.
60.000% 0.202 sec.
70.000% 0.203 sec.
80.000% 0.207 sec.
90.000% 0.234 sec.
95.000% 0.248 sec.
99.000% 0.248 sec.
99.900% 0.248 sec.
99.990% 0.248 sec.
在章節中,我們展示了幾種常見的ClickHouse資料庫在安裝、設定與建置的時候常遇到的錯誤情形以及解決的方法,並示範了如何使用clickhouse-benchmark
進行查詢語句的執行時間評估。