docker-compose 快速部署clickhouse集群

在本教程中,我们将学习如何使用 Docker Compose 部署一个带有三节点的 ClickHouse 集群,并使用 ZooKeeper 作为分布式协调服务。

前提条件

注意事项:

  1. 镜像版本号注意保持一致 [zookeeper:3.7, clickhouse/clickhouse-server:22.5.4]
  2. config里面的参数有些是必须的,日志报错缺少参数去官方文档里找 config.xm参数官网

在开始之前,请确保您的系统已经安装了以下工具:

目录结构

首先,我们需要为 ClickHouse 集群创建目录结构来存放数据和配置文件。执行以下命令来创建目录:

bash 复制代码
mkdir -p clickhouse_cluster/{zkdata,zkdatalog,data/clickhouse01,data/clickhouse02,data/clickhouse03,config/clickhouse01,config/clickhouse02,config/clickhouse03}

第一步:编写 docker-compose.yml 文件

clickhouse_cluster 目录下创建 docker-compose.yml 文件,这个文件定义了 ZooKeeper 和三个 ClickHouse 节点。为了安全性,我们会替换敏感数据如密码。

yaml 复制代码
version: '3.8'

services:
  zookeeper:
    image: zookeeper:3.7
    container_name: zookeeper
    restart: always
    ports:
      - "2181:2181"
    environment:
      ZOO_MY_ID: 1
    volumes:
      - ./zkdata:/data
      - ./zkdatalog:/datalog      

  clickhouse01:
    image: clickhouse/clickhouse-server:22.5.4
    container_name: clickhouse01
    restart: always
    ports:
      - "8123:8123"   # HTTP 接口
      - "9000:9000"   # TCP 接口
      - "9009:9009"   # Internode 通信接口
    volumes:
      - ./data/clickhouse01:/var/lib/clickhouse
      - ./config/clickhouse01:/etc/clickhouse-server
    environment:
      CLICKHOUSE_DB: default
      CLICKHOUSE_PASSWORD: "your_secure_password"
    depends_on:
      - zookeeper

  clickhouse02:
    image: clickhouse/clickhouse-server:22.5.4
    container_name: clickhouse02
    restart: always
    ports:
      - "8124:8123"   # HTTP 接口
      - "9001:9000"   # TCP 接口
      - "9010:9009"   # Internode 通信接口
    volumes:
      - ./data/clickhouse02:/var/lib/clickhouse
      - ./config/clickhouse02:/etc/clickhouse-server
    environment:
      CLICKHOUSE_DB: default
      CLICKHOUSE_PASSWORD: "your_secure_password"
    depends_on:
      - zookeeper

  clickhouse03:
    image: clickhouse/clickhouse-server:22.5.4
    container_name: clickhouse03
    restart: always
    ports:
      - "8125:8123"   # HTTP 接口
      - "9002:9000"   # TCP 接口
      - "9011:9009"   # Internode 通信接口
    volumes:
      - ./data/clickhouse03:/var/lib/clickhouse
      - ./config/clickhouse03:/etc/clickhouse-server
    environment:
      CLICKHOUSE_DB: default
      CLICKHOUSE_PASSWORD: "your_secure_password"
    depends_on:
      - zookeeper

关键点说明:

  • Zookeeper:Zookeeper 用于协调 ClickHouse 集群中的分布式事务。
  • ClickHouse 节点 :我们设置了三个 ClickHouse 节点(clickhouse01clickhouse02clickhouse03),它们通过不同的端口进行通信。
  • 密码 :为了安全性,密码使用占位符 "your_secure_password",请确保使用强密码替换。

第二步:编写 ClickHouse 配置文件

接下来,创建每个 ClickHouse 节点的配置文件。以 config/clickhouse01/config.xml 为例,其他节点的配置类似。我们将替换原始文件中的敏感信息。

clickhouse_cluster/config/clickhouse01 目录下创建 config.xml 文件:

xml 复制代码
<yandex>
    <profiles>
        <default>
            <max_memory_usage>10000000000</max_memory_usage>
            <readonly>0</readonly>
        </default>
    </profiles>

    <path>/var/lib/clickhouse/</path>
    <tmp_path>/var/lib/clickhouse/tmp/</tmp_path>
    <user_files_path>/var/lib/clickhouse/user_files/</user_files_path> 
    <http_port>8123</http_port> 

    <logger>
        <log>/var/log/clickhouse-server/clickhouse.log</log>
        <errorlog>/var/log/clickhouse-server/clickhouse_error.log</errorlog>
    </logger>

    <format_schema_path>/var/lib/clickhouse/format_schemas/</format_schema_path>
    <default_profile>default</default_profile>
    <users_config>users.xml</users_config>
    <mark_cache_size>5368709120</mark_cache_size>

    <zookeeper>
        <node>
            <host>zookeeper</host>
            <port>2181</port>
        </node>
    </zookeeper>

    <tcp_port>9000</tcp_port>

    <remote_servers>
        <my_clickhouse_cluster>
            <shard>
                <replica>
                    <host>clickhouse01</host>
                    <port>9000</port>
                </replica>
                <replica>
                    <host>clickhouse02</host>
                    <port>9000</port>
                </replica>
            </shard>
            <shard>
                <replica>
                    <host>clickhouse03</host>
                    <port>9000</port>
                </replica>
            </shard>
        </my_clickhouse_cluster>
    </remote_servers>

    <listen_host>::</listen_host>
    <listen_host>0.0.0.0</listen_host>
</yandex>

关键配置说明:

  • ZooKeeper :配置了 ClickHouse 连接 Zookeeper,使用 zookeeper:2181 地址。
  • 集群配置remote_servers 配置了集群中的三个节点,分别对应 clickhouse01clickhouse02clickhouse03

第三步:编写 users.xml 文件

config/clickhouse01/ 目录下创建 users.xml 文件,用于定义用户及其权限。为了安全起见,密码将以占位符形式存在。

xml 复制代码
<?xml version="1.0"?>
<yandex>
    <profiles>
        <default>
            <max_memory_usage>10000000000</max_memory_usage>
            <use_uncompressed_cache>0</use_uncompressed_cache>
            <load_balancing>random</load_balancing>
        </default>
    </profiles>

    <users>
        <default>
            <password>your_secure_password</password>
            <!-- Password could be specified in plaintext or in SHA256 (in hex format).

                 If you want to specify password in plaintext (not recommended), place it in 'password' element.
                 Example: <password>qwerty</password>.
                 Password could be empty.

                 If you want to specify SHA256, place it in 'password_sha256_hex' element.
                 Example: <password_sha256_hex>65e84be33532fb784c48129675f9eff3a682b27168c0ea744b2cf58ee02337c5</password_sha256_hex>

                 How to generate decent password:
                 Execute: PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'
                 In first line will be password and in second - corresponding SHA256.
                 也可以使用加密的密码,用上面的shell命令就可以生成
            -->
            <!-- <password_double_sha1_hex></password_double_sha1_hex> -->
			
            <networks incl="networks" replace="replace">
                <ip>::1</ip>
                <ip>127.0.0.1</ip>
            </networks>
            <profile>default</profile>
            <quota>default</quota>
        </default>

        <readonly_user>
            <password>your_readonly_password</password>
            <networks incl="networks" replace="replace">
                <ip>::/0</ip>
            </networks>
            <profile>readonly</profile>
            <quota>default</quota>
        </readonly_user>
    </users>
</yandex>

用户权限说明:

  • default 用户具有默认的读写权限。
  • readonly_user 用户具有只读权限,并且可以从任意 IP 访问。

第四步:启动 ClickHouse 集群

clickhouse_cluster 目录下,运行以下命令来启动整个集群:

bash 复制代码
docker-compose up -d

docker-compose up -d 将启动所有服务,包括 ZooKeeper 和三个 ClickHouse 节点。

第五步:验证集群部署

  1. 1.运行以下命令查看容器状态:

    bash 复制代码
    docker-compose ps

    确保所有容器都处于 "Up" 状态。

  2. 2.通过 HTTP 接口访问任意 ClickHouse 节点,查看是否可以成功连接:

    bash 复制代码
    curl http://localhost:8123

    返回类似于 Ok. 的响应即表示成功。

  3. 3.从单节点查询集群状态

    bash 复制代码
    docker exec -it clickhouse01 bash 
    clickhouse-client
    
    select * from system.clusters;
    select * from system.zookeeper where path='/clickhouse';

六:文件夹结构

参考链接:

https://www.cnblogs.com/yoyo1216/p/13731225.html

https://www.cnblogs.com/syw20170419/p/16250500.html

https://clickhouse.com/docs/en/operations/server-configuration-parameters/settings

相关推荐
❀͜͡傀儡师18 分钟前
docker一键部署HFish蜜罐
运维·docker·容器
DO_Community31 分钟前
DigitalOcean容器注册表推出多注册表支持功能
服务器·数据库·docker·kubernetes
dnpao1 小时前
linux onlyoffice服务向docker容器中添加中文字体
linux·运维·docker
回忆是昨天里的海1 小时前
k8s暴露服务-Ingress环境部署
云原生·容器·kubernetes
tzhou644522 小时前
Kubernetes Pod 入门
云原生·容器·kubernetes
java_logo2 小时前
Dify 开源 LLM 应用开发平台企业级 Docker Compose 部署手册
docker·容器·开源·dify部署·dify部署文档·dify部署方案·dify部署教程
jarreyer3 小时前
【docker的gpu加速相关问题解决记录】
运维·docker·容器
韭菜钟3 小时前
制作自定义Docker镜像并部署使用
运维·docker·容器
椰汁菠萝3 小时前
docker部署gitlab
docker·容器·gitlab
知识分享小能手3 小时前
Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04 中安装 Docker 容器 —— 知识点详解(26)
学习·ubuntu·docker