ClickHouse 對 RabbitMQ:消費篇
原由
在現代商業環境中,資料是一個無價的資源,它能夠提供深入洞察並驅動重要的決策。對於我們的公司來說,這一點特別重要,因為我們致力於提供高效的資料處理和分析解決方案。然而,隨著業務的快速擴張和客戶基數的不斷增長,我們迫切需要一個強大且高效的資料存儲和分析系統,以應對不斷增長的資料量和復雜性。
應對日益增長的資料需求
我們的業務在資料方面的需求不斷增加,主要表現在以下幾個方面:
實時資料流:我們的應用程序需要能夠處理大量的實時資料流,以保持我們的業務競爭優勢。這包括來自各種源頭的資料,如應用程序日誌、用戶互動、交易記錄等。
複雜的資料分析需求:我們的分析團隊需要能夠執行高級資料分析,以識別趨勢、模式和關聯性,以改進產品和服務。這種分析需要大量的資料存儲和計算能力。
擴展性:我們需要一個系統,能夠無縫地擴展以應對未來的資料增長,而不會引起系統性能下降或故障。
可靠性:由於資料對我們的業務至關重要,我們需要一個高度可靠的系統,能夠確保資料的持久性和可恢復性,以應對突發情況。
ClickHouse 與 RabbitMQ 的結合
鑒於這些需求,我們決定採用ClickHouse與RabbitMQ的結合,以構建一個高效、擴展性強且可靠的資料處理和分析系統。這個結合允許我們實現以下目標:
實時資料處理:RabbitMQ作為我們的消息代理,能夠接受和分發大量的實時資料,而ClickHouse則能夠高效地將這些資料寫入並進行複雜的分析。
擴展性:ClickHouse的分佈式架構和RabbitMQ的佇列系統,使我們能夠輕鬆擴展系統,以處理更多資料和更多用戶。
可靠性:ClickHouse的可持久性和可恢復性特性,以及RabbitMQ的消息確保,確保我們的資料不會丟失,即使發生硬件故障或其他問題。
總之,我們選擇ClickHouse與RabbitMQ的結合是基於我們的業務需求,這個組合不僅滿足了我們的實時資料處理和分析需求,還為我們提供了一個堅固的資料基礎,以支持未來的增長和創新。
Docker Compose
- docker-compose.yml關於
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100version: "3.0"
services:
clickhouse01:
container_name: clickhouse-01
image: clickhouse/clickhouse-server:23.5.3.24
ulimits:
nproc: 65535
nofile:
soft: 262144
hard: 262144
depends_on:
- zookeeper
volumes:
- "./clickhouse-01:/var/lib/clickhouse"
- "./clickhouse-server-01:/etc/clickhouse-server"
- "./clickhouse-log-01:/var/log/clickhouse-server"
ports:
- "8123:8123"
- "9011:9011"
- "9004:9004" # mysql
- "9005:9005" # postgres
networks:
- clickhouse-cluster
clickhouse02:
container_name: clickhouse-02
image: clickhouse/clickhouse-server:23.5.3.24
ulimits:
nproc: 65535
nofile:
soft: 262144
hard: 262144
depends_on:
- zookeeper
volumes:
- "./clickhouse-02:/var/lib/clickhouse"
- "./clickhouse-server-02:/etc/clickhouse-server"
- "./clickhouse-log-02:/var/log/clickhouse-server"
ports:
- "8223:8223"
- "9211:9211"
- "9204:9204" # mysql
- "9205:9205" # postgres
networks:
- clickhouse-cluster
zookeeper:
image: confluentinc/cp-zookeeper:7.4.0
container_name: zkserver
deploy:
resources:
limits:
memory: 512M
ports:
- "2181:2181"
environment:
ZOOKEEPER_SERVER_ID: 1
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 5000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
volumes:
- ./zookeeper_data:/var/lib/zookeeper/data
- ./zookeeper_log:/var/lib/zookeeper/log
- ./zookeeper_secrets:/etc/zookeeper/secrets
networks:
- clickhouse-cluster
tabix-web-client:
container_name: tabix-web-client
image: spoonest/clickhouse-tabix-web-client
depends_on:
- clickhouse01
- clickhouse02
ports:
- "8080:80"
networks:
- clickhouse-cluster
rabbitmq:
image: rabbitmq:3.12-management
hostname: rabbitmq
container_name: rabbitmq
environment:
- RABBITMQ_DEFAULT_USER=guest
- RABBITMQ_DEFAULT_PASS=guest
volumes:
- ./rabbitmq/data:/var/lib/rabbitmq
- ./rabbitmq/log:/var/log/rabbitmq
ports:
- "5672:5672"
- "15672:15672"
depends_on:
- clickhouse01
- clickhouse02
networks:
- clickhouse-cluster
networks:
clickhouse-cluster:Docker compose
的詳細說明與相關的設定檔案配置,請參閱Docker Compose - ClickHouse (cluster - CK)與Docker Compose - RabbitMQ。
流程示意圖
Run & Test
- 此處是使用瀏覽器開啟
Clickhouse-Web-Client
+RabbitMQ-WebUI
進行測試。1
2
3
4
5# Clickhouse-Web-Client
http://127.0.0.1:8080
# RabbitMQ-WebUI
http://127.0.0.1:15672 - 首先於
clickhouse-01
和clickhouse-02
建立資料庫、分布式表、RabbitMQ Engine
和MATERIALIZED View
。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38-- 創建 test 資料庫,如果不存在
CREATE DATABASE IF NOT EXISTS test;;
-- 選擇使用 test 資料庫
USE test;;
-- 創建名為 'event' 的表格
CREATE TABLE IF NOT EXISTS test.event (
`id` UInt32, -- 事件 ID
`body` String, -- 事件內容
`update_at` DateTime -- 更新時間
) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/test/event', '{replica}', update_at)
ORDER BY update_at;;
-- 創建名為 'rabbitmq_entry' 的表格
CREATE TABLE IF NOT EXISTS test.rabbitmq_entry
(
`id` UInt32, -- 事件 ID
`body` String, -- 事件內容
`update_at` DateTime -- 更新時間
) ENGINE = RabbitMQ -- 使用 RabbitMQ 引擎
SETTINGS
rabbitmq_host_port = 'rabbitmq:5672', -- RabbitMQ 伺服器的主機和端口
rabbitmq_exchange_name = 'clickhouse-exchange', -- RabbitMQ 交換機名稱
rabbitmq_format = 'JSONEachRow', -- RabbitMQ 資料的格式為JSONEachRow
rabbitmq_queue_base = 'hello', -- RabbitMQ 佇列基礎名稱
rabbitmq_username = 'guest', -- RabbitMQ 用戶名
rabbitmq_password = 'guest' -- RabbitMQ 密碼
;;
-- 創建名為 'v_rabbitmq_to_event' 的物化視圖,將 RabbitMQ 資料映射到 'event' 表
CREATE MATERIALIZED VIEW IF NOT EXISTS test.v_rabbitmq_to_event
TO test.event AS
SELECT
id AS id, -- 事件 ID
body AS body, -- 事件內容
now() AS update_at -- 現在的時間作為更新時間
FROM test.rabbitmq_entry;註:關於 RabbitMQ ENGINE 的 SETTINGS 可以參考RabbitMQ Engine - Optional parameters
- 後續使用
RabbitMQ-WebUI
進行推送訊息。 - 即可於資料庫內的
event
表看到消費並寫入的資料。
註:以上參考了
Docker
ClickHouse
ClickHouse - RabbitMQ Engine
博客園 - 渐逝的星光 - clickhouse使用rabbitmq进行实时订阅消费
知乎 - 张琼芳 - 理解 RabbitMQ Exchange