Like Share Discussion Bookmark Smile

J.J. Huang   2023-09-18   Docker Docker Compose   瀏覽次數:次   DMCA.com Protection Status

Docker Compose - ClickHouse (cluster - ZK)

前言

此篇主要是針對ClickHouse提供使用ZooKeeper建立集群Docker Compose的內容。
可以參考上一篇的介紹Docker Compose - ClickHouse (single)

為何使用ZooKeeper,主要是當前的其他集群服務都有在使用ZooKeeper,為了不浪費資源所以就共同使用。
但是官方是建議使用它的ClickHouse keeper,官方的詳細說明連結

Docker Image

此處直接使用Docker hub上的clickhouse/clickhouse-server:23.5.3.24confluentinc/cp-zookeeper:7.4.0
另外有在多掛Docker hub上的spoonest/clickhouse-tabix-web-client

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
    version: "3.3"
    services:
    clickhouse01:
    image: clickhouse/clickhouse-server:23.5.3.24
    container_name: clickhouse-01
    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:
    image: clickhouse/clickhouse-server:23.5.3.24
    container_name: clickhouse-02
    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:
    image: spoonest/clickhouse-tabix-web-client
    container_name: tabix-web-client
    depends_on:
    - clickhouse01
    - clickhouse02
    ports:
    - "8080:80"
    networks:
    - clickhouse-cluster

    networks:
    clickhouse-cluster:

    説明:

    • 版本定義為3.3
    • 定義services名稱為clickhouse01
    • 使用clickhouse/clickhouse-server:23.5.3.24映像。
    • 容器名稱定義clickhouse-01
    • 指定容器的限制值。
      • 指定最大處理程序 65535。
        • 打開文件數量。
          • 指定文件句柄數 262144(軟限制,應用可以隨時修改,不能超過硬限制)。
          • 指定文件句柄數 262144(系統硬限制,只能 root 用戶提高)。
    • 依賴服務(指定services名稱)。
    • 掛載主機路徑(格式為SOURCE:TARGET)。
    • 暴露端口81238123(格式為HOST:CONTAINER)。
    • 暴露端口90119011(格式為HOST:CONTAINER)。
    • 暴露端口90049004(格式為HOST:CONTAINER)。
    • 暴露端口90059005(格式為HOST:CONTAINER)。
    • 加入的網路(networks名稱)。
    • 定義services名稱為clickhouse02
    • 使用clickhouse/clickhouse-server:23.5.3.24映像。
    • 容器名稱定義clickhouse-02
    • 指定容器的限制值。
      • 指定最大處理程序 65535。
        • 打開文件數量。
          • 指定文件句柄數 262144(軟限制,應用可以隨時修改,不能超過硬限制)。
          • 指定文件句柄數 262144(系統硬限制,只能 root 用戶提高)。
    • 依賴服務(指定services名稱)。
    • 掛載主機路徑(格式為SOURCE:TARGET)。
    • 暴露端口82238223(格式為HOST:CONTAINER)。
    • 暴露端口92119211(格式為HOST:CONTAINER)。
    • 暴露端口92049204(格式為HOST:CONTAINER)。
    • 暴露端口92059205(格式為HOST:CONTAINER)。
    • 加入的網路(networks名稱)。
    • 定義services名稱為zookeeper
    • 使用confluentinc/cp-zookeeper:7.4.0映像。
    • 容器名稱定義zkserver
    • 部署。
      • 配置資源限制。
        • 使用不超過 512M 的記憶體。
    • 暴露端口21812181(格式為HOST:CONTAINER)。
    • 環境變數設定
      • ZOOKEEPER_SERVER_ID: 1
      • ZOOKEEPER_CLIENT_PORT: 2181
      • ZOOKEEPER_TICK_TIME: 5000
      • ZOOKEEPER_INIT_LIMIT: 5
      • ZOOKEEPER_SYNC_LIMIT: 2
    • 掛載主機路徑(格式為SOURCE:TARGET)。
    • 加入的網路(networks名稱)。
    • 定義services名稱為tabix-web-client
    • 使用spoonest/clickhouse-tabix-web-client映像。
    • 容器名稱定義tabix-web-client
    • 依賴服務(指定services名稱)。
    • 暴露端口808080(格式為HOST:CONTAINER)。
    • 加入的網路(networks名稱)。

    註:關於zookeeper環境變數可以參考

ClickHouse 重要的檔案/路徑位置

  • clickhouse-server 主要設定檔:
    • /etc/clickhouse-server/config.xml
  • clickhouse-server 用戶設定檔:
    • /etc/clickhouse-server/users.xml
  • clickhouse-server 資料儲存路徑:
    • /var/lib/clickhouse
  • clickhouse-server Log檔路徑:
    • /var/log/clickhouse-server/clickhouse-server.log
  • clickhouse-server ErrLog檔路徑:
    • /var/log/clickhouse-server/clickhouse-server.err.log

ClickHouse volumes 設定檔目錄結構

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
.
├── clickhouse-01 # clickhouse-01 儲存的資料目錄
├── clickhouse-02 # clickhouse-02 儲存的資料目錄
├── clickhouse-log-01 # clickhouse-01 Log檔目錄
│ ├── clickhouse-server.err.log # clickhouse-01 ErrLog檔
│ └── clickhouse-server.log # clickhouse-01 Log檔
├── clickhouse-log-02 # clickhouse-02 Log檔目錄
│ ├── clickhouse-server.err.log # clickhouse-02 ErrLog檔
│ └── clickhouse-server.log # clickhouse-02 Log檔
├── clickhouse-server-01 # clickhouse-01 設定檔目錄
│ ├── config.d # 單獨設定檔目錄
│ │ ├── database_atomic.xml # 資料庫原子相關設定
│ │ ├── docker_related_config.xml # docker相關設定
│ │ ├── macros.xml # 宏的相關設定
│ │ ├── metrika.xml # 分佈式表中使用的集群的相關設定
│ │ └── zookeeper.xml # zookeeper的相關設定
│ ├── config.xml # 主要設定檔
│ ├── users.d # 針對用户的單獨設定檔目錄
│ │ └── user-custom.xml # 單獨用戶設定檔
│ └── users.xml # 主要用戶設定檔
├── clickhouse-server-02 # clickhouse-02 設定檔目錄
│ ├── config.d # 單獨設定檔目錄
│ │ ├── database_atomic.xml # 資料庫原子相關設定
│ │ ├── docker_related_config.xml # docker相關設定
│ │ ├── macros.xml # 宏的相關設定
│ │ ├── metrika.xml # 分佈式表中使用的集群的相關設定
│ │ └── zookeeper.xml # zookeeper的相關設定
│ ├── config.xml # 主要設定檔
│ ├── users.d # 針對用户的單獨設定檔目錄
│ │ └── user-custom.xml # 單獨用戶設定檔
│ └── users.xml # 主要用戶設定檔
├── zookeeper_data # zookeeper 儲存的資料目錄
├── zookeeper_log # zookeeper Log檔目錄
├── zookeeper_secrets # zookeeper Secrets目錄
└── docker-compose.yml

ClickHouse 設定檔:

以下設定檔皆使用內置的默認文件進行修改,並使用volumes去掛載。

  • clickhouse-01
    • /etc/clickhouse-server-01/config.xml
      1
      <tcp_port>9011</tcp_port>
    • /etc/clickhouse-server-01/config.d/database_atomic.xml
      1
      2
      3
      4
      <?xml version="1.0"?>
      <clickhouse>
      <database_atomic_delay_before_drop_table_sec>10</database_atomic_delay_before_drop_table_sec>
      </clickhouse>
    • /etc/clickhouse-server-01/config.d/docker_related_config.xml
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      <?xml version="1.0"?>
      <clickhouse>
      <!-- Listen wildcard address to allow accepting connections from other containers and host network. -->
      <listen_host>::</listen_host>
      <listen_host>0.0.0.0</listen_host>
      <listen_try>1</listen_try>

      <!--
      <logger>
      <console>1</console>
      </logger>
      -->
      </clickhouse>
    • /etc/clickhouse-server-01/config.d/macros.xml
      1
      2
      3
      4
      5
      6
      <?xml version="1.0"?>
      <clickhouse>
      <macros>
      <replica>clickhouse-01</replica>
      </macros>
      </clickhouse>
    • /etc/clickhouse-server-01/config.d/metrika.xml
      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
      <?xml version="1.0"?>
      <clickhouse>
      <!-- Configuration of clusters that could be used in Distributed tables.
      https://clickhouse.com/docs/en/operations/table_engines/distributed/
      -->
      <remote_servers>
      <ck_cluster>
      <shard>
      <internal_replication>true</internal_replication>
      <replica>
      <host>clickhouse-01</host>
      <port>9011</port>
      <user>replicator</user>
      <password>replicator1234</password>
      </replica>
      <replica>
      <host>clickhouse-02</host>
      <port>9211</port>
      <user>replicator</user>
      <password>replicator1234</password>
      </replica>
      </shard>
      </ck_cluster>
      </remote_servers>
      </clickhouse>
    • /etc/clickhouse-server-01/config.d/zookeeper.xml
      1
      2
      3
      4
      5
      6
      7
      8
      9
      <?xml version="1.0"?>
      <clickhouse>
      <zookeeper>
      <node>
      <host>zkserver</host>
      <port>2181</port>
      </node>
      </zookeeper>
      </clickhouse>
    • /etc/clickhouse-server-01/users.xml
      1
      無異動
    • /etc/clickhouse-server-01/users.d/user-custom.xml
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      <?xml version="1.0"?>
      <clickhouse>
      <users>
      <default remove="remove">
      </default>
      <replicator>
      <password>replicator1234</password>
      <networks>
      <ip>::/0</ip>
      </networks>
      <profile>default</profile>
      <quota>default</quota>
      </replicator>
      <clickhouse>
      <password>clickhouse1234</password>
      <networks>
      <ip>::/0</ip>
      </networks>
      <profile>default</profile>
      <quota>default</quota>
      </clickhouse>
      </users>
      </clickhouse>
  • clickhouse-02
    • /etc/clickhouse-server-02/config.xml
      1
      2
      3
      4
      <http_port>8223</http_port>
      <tcp_port>9211</tcp_port>
      <mysql_port>9204</mysql_port>
      <postgresql_port>9205</postgresql_port>
    • /etc/clickhouse-server-02/config.d/database_atomic.xml
      1
      2
      3
      4
      <?xml version="1.0"?>
      <clickhouse>
      <database_atomic_delay_before_drop_table_sec>10</database_atomic_delay_before_drop_table_sec>
      </clickhouse>
    • /etc/clickhouse-server-02/config.d/docker_related_config.xml
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      <?xml version="1.0"?>
      <clickhouse>
      <!-- Listen wildcard address to allow accepting connections from other containers and host network. -->
      <listen_host>::</listen_host>
      <listen_host>0.0.0.0</listen_host>
      <listen_try>1</listen_try>

      <!--
      <logger>
      <console>1</console>
      </logger>
      -->
      </clickhouse>
    • /etc/clickhouse-server-02/config.d/macros.xml
      1
      2
      3
      4
      5
      6
      <?xml version="1.0"?>
      <clickhouse>
      <macros>
      <replica>clickhouse-02</replica>
      </macros>
      </clickhouse>
    • /etc/clickhouse-server-02/config.d/metrika.xml
      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
      <?xml version="1.0"?>
      <clickhouse>
      <!-- Configuration of clusters that could be used in Distributed tables.
      https://clickhouse.com/docs/en/operations/table_engines/distributed/
      -->
      <remote_servers>
      <ck_cluster>
      <shard>
      <internal_replication>true</internal_replication>
      <replica>
      <host>clickhouse-01</host>
      <port>9011</port>
      <user>replicator</user>
      <password>replicator1234</password>
      </replica>
      <replica>
      <host>clickhouse-02</host>
      <port>9211</port>
      <user>replicator</user>
      <password>replicator1234</password>
      </replica>
      </shard>
      </ck_cluster>
      </remote_servers>
      </clickhouse>
    • /etc/clickhouse-server-02/config.d/zookeeper.xml
      1
      2
      3
      4
      5
      6
      7
      8
      9
      <?xml version="1.0"?>
      <clickhouse>
      <zookeeper>
      <node>
      <host>zkserver</host>
      <port>2181</port>
      </node>
      </zookeeper>
      </clickhouse>
    • /etc/clickhouse-server-02/users.xml
      1
      無異動
    • /etc/clickhouse-server-02/users.d/user-custom.xml
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      <?xml version="1.0"?>
      <clickhouse>
      <users>
      <default remove="remove">
      </default>
      <replicator>
      <password>replicator1234</password>
      <networks>
      <ip>::/0</ip>
      </networks>
      <profile>default</profile>
      <quota>default</quota>
      </replicator>
      <clickhouse>
      <password>clickhouse1234</password>
      <networks>
      <ip>::/0</ip>
      </networks>
      <profile>default</profile>
      <quota>default</quota>
      </clickhouse>
      </users>
      </clickhouse>

注意:以上設定和配置「可能」不完全有作用或是正確,目前僅提供當前可運作的設定,建議還是根據官方文件進行調整,像是這邊就沒有使用分片的集群設定。
註:可參考官方文件Configuration FilesGlobal Server SettingsUser Settings

Run & Test

  • 此處是使用瀏覽器開啟web-client進行測試。

    1
    http://127.0.0.1:8080
  • 連線配置

    注意:[http://host:port *]這個要輸入位置,不要看畫面好像有輸入了就不輸入,那只是個placeholder
    注意:使用者為clickhouse密碼為clickhouse1234。可見user-custom.xml配置。
    注意:[HTTP Base auth],如果無法連入可以勾選或取消勾選試試看。

  • 相關的語法:

    注意:語法結束符號為;,當你要執行多行指令的時候會出錯,請使用;;,該問題應該是web-client的問題。

  • 首先於clickhouse-01clickhouse-02建立資料庫與分布式表。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    -- 建立資料庫
    CREATE DATABASE test;;

    -- 建立分布式表,具有 ReplicatedReplacingMergeTree 引擎
    CREATE TABLE IF NOT EXISTS test.sample_table
    (
    id UInt64,
    name String,
    age UInt32,
    update_at DateTime
    )
    ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/test/sample_table', '{replica}', update_at)
    ORDER BY id;;
  • clickhouse-01執行寫入示範資料,並查詢。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    -- 寫入示範資料
    INSERT INTO test.sample_table (id, name, age, update_at)
    VALUES
    (1, 'John', 30, now()),
    (2, 'Alice', 25, now()),
    (3, 'Bob', 35, now());;

    -- 查詢資料
    SELECT * FROM test.sample_table;;
  • clickhouse-02執行並查詢,可見資料已經同步。

    1
    2
    -- 查詢資料
    SELECT * FROM test.sample_table;;

ClickHouse GUI 工具

  • 【免費】dbeaver
    • 該工具還有支援其他資料庫,個人覺得滿推薦的。

Other Docker Compose List

如需要找尋其他的 Docker Compose ,可以參考Docker Compose - 簡介的分享目錄。


註:以上參考了
Docker
ClickHouse
dbeaver