Like Share Discussion Bookmark Smile

J.J. Huang   2023-10-17   Clickhouse RabbitMQ   瀏覽次數:次   DMCA.com Protection Status

ClickHouse 對 RabbitMQ:消費篇

原由

在現代商業環境中,資料是一個無價的資源,它能夠提供深入洞察並驅動重要的決策。對於我們的公司來說,這一點特別重要,因為我們致力於提供高效的資料處理和分析解決方案。然而,隨著業務的快速擴張和客戶基數的不斷增長,我們迫切需要一個強大且高效的資料存儲和分析系統,以應對不斷增長的資料量和復雜性。


應對日益增長的資料需求

我們的業務在資料方面的需求不斷增加,主要表現在以下幾個方面:

  1. 實時資料流:我們的應用程序需要能夠處理大量的實時資料流,以保持我們的業務競爭優勢。這包括來自各種源頭的資料,如應用程序日誌、用戶互動、交易記錄等。

  2. 複雜的資料分析需求:我們的分析團隊需要能夠執行高級資料分析,以識別趨勢、模式和關聯性,以改進產品和服務。這種分析需要大量的資料存儲和計算能力

  3. 擴展性:我們需要一個系統,能夠無縫地擴展以應對未來的資料增長,而不會引起系統性能下降或故障。

  4. 可靠性:由於資料對我們的業務至關重要,我們需要一個高度可靠的系統,能夠確保資料的持久性和可恢復性,以應對突發情況。


ClickHouse 與 RabbitMQ 的結合

鑒於這些需求,我們決定採用ClickHouseRabbitMQ的結合,以構建一個高效、擴展性強且可靠的資料處理和分析系統。這個結合允許我們實現以下目標:

  • 實時資料處理RabbitMQ作為我們的消息代理,能夠接受和分發大量的實時資料,而ClickHouse則能夠高效地將這些資料寫入並進行複雜的分析

  • 擴展性ClickHouse的分佈式架構和RabbitMQ的佇列系統,使我們能夠輕鬆擴展系統,以處理更多資料和更多用戶。

  • 可靠性ClickHouse可持久性可恢復性特性,以及RabbitMQ消息確保,確保我們的資料不會丟失,即使發生硬件故障或其他問題。

總之,我們選擇ClickHouseRabbitMQ的結合是基於我們的業務需求,這個組合不僅滿足了我們的實時資料處理和分析需求,還為我們提供了一個堅固的資料基礎,以支持未來的增長和創新。


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
    100
    version: "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-01clickhouse-02建立資料庫、分布式表、RabbitMQ EngineMATERIALIZED 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