1、ck1机器上的docker-compose的yml文件:
version: '2.1'

services:
  clickhouse:
    image: yandex/clickhouse-server:${CLICKHOUSE_VERSION:-20.11}
    restart: always
    network_mode: host
    container_name: clickhouse-server
    privileged: true
    environment:
      - CLICKHOUSE_CONFIG=/etc/clickhouse-server/config.xml
      - CLICKHOUSE_USER_CONFIG=/etc/clickhouse-server/users.xml
    ports:
      - "8123:8123"
    ulimits:
      nofile:
        soft: 262144
        hard: 262144
    volumes:
      - /data/clickhouse/config/metrika.xml:/etc/metrika.xml
      - /data/clickhouse/config/config.xml:/etc/clickhouse-server/config.xml
      - /data/clickhouse/config/users.xml:/etc/clickhouse-server/users.xml
      - /data/clickhouse/data:/var/lib/clickhouse
      - /data/clickhouse/logs:/var/log/clickhouse-server
    deploy:
      resources:
        limits:
          cpus: '8'
          memory: 15360M
        reservations:
          cpus: '6'
          memory: 12240M
2、ck1机器上的metrika.xml文件
<yandex>
    <clickhouse_remote_servers>
        <!-- 集群名称-->
        <hex_cluster>
            <!--集群的第1个分片-->
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>ck01</host>
                    <port>9000</port>
                </replica>
                <replica>
                    <host>ck02</host>
                    <port>9000</port>
                </replica>
            </shard>
        </hex_cluster>
    </clickhouse_remote_servers>
    <zookeeper-servers>
        <node>
            <host>zk1</host>
            <port>2181</port>
        </node>
        <node>
            <host>zk2</host>
            <port>2181</port>
        </node>
        <node>
            <host>zk3</host>
            <port>2181</port>
        </node>
    </zookeeper-servers>
    <macros>
        <!-- 第1个分片 -->
        <shard>01</shard>
        <!-- 第1个分片,第1个副本 -->
        <replica>rep_1_1</replica>
    </macros>
</yandex>
3、ck2机器上的docker-compose的yml文件
version: '2.1'

services:
  clickhouse:
    image: yandex/clickhouse-server:${CLICKHOUSE_VERSION:-20.11}
    restart: always
    network_mode: host
    container_name: clickhouse-server
    environment:
      - CLICKHOUSE_CONFIG=/etc/clickhouse-server/config.xml
      - CLICKHOUSE_USER_CONFIG=/etc/clickhouse-server/users.xml
    ports:
      - "8123:8123"
    ulimits:
      nofile:
        soft: 262144
        hard: 262144
    volumes:
      - /data/clickhouse/config/metrika.xml:/etc/metrika.xml
      - /data/clickhouse/config/config.xml:/etc/clickhouse-server/config.xml
      - /data/clickhouse/config/users.xml:/etc/clickhouse-server/users.xml
      - /data/clickhouse/data:/var/lib/clickhouse
      - /data/clickhouse/logs:/var/log/clickhouse-server
    deploy:
      resources:
        limits:
          cpus: '4'
          memory: 10240M
        reservations:
          cpus: '2'
          memory: 5096M
4、ck2机器上的metrika.xml文件
<yandex>
    <clickhouse_remote_servers>
        <!-- 集群名称-->
        <hex_cluster>
            <!--集群的第1个分片-->
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>ck01</host>
                    <port>9000</port>
                </replica>
                <replica>
                    <host>ck02</host>
                    <port>9000</port>
                </replica>
            </shard>
        </hex_cluster>
    </clickhouse_remote_servers>
    <zookeeper-servers>
        <node>
            <host>zk1</host>
            <port>2181</port>
        </node>
        <node>
            <host>zk2</host>
            <port>2181</port>
        </node>
        <node>
            <host>zk3</host>
            <port>2181</port>
        </node>
    </zookeeper-servers>
    <macros>
        <!-- 第1个分片 -->
        <shard>01</shard>
        <!-- 第1个分片,第2个副本 -->
        <replica>rep_1_2</replica>
    </macros>
</yandex>
5、启动ck服务并验证可行性

1、上面的配置文件都弄好后,在docker-compose.yml的路径下执行docker-compose up -d即可启动一个后台ck容器服务

 2、通过docker ps 查看clickhouse容器是否启动成功,我这里也是成功运行

docker部署ClickHouse配置账号密码 clickhouse docker compose_数据库

3、通过docker exec -it clickhouse-server(这个是容器名字,也可以填容器id) bash进入到容器中

4、进入容器以后通过clickhouse-client -m命令进入到ck的客户端,进入之后show databases; 一下,如果出现数据库列表,那就是成功啦。

ps:如果你修改了users.xml中<users>标签下的用户信息,比如修改了用户名或者增加了密码验证,在使用clickhouse-client -m连接的时候记得添加--user xxx 和 --password xxx 改为你对应的用户和密码

5、因为是启动的集群,所以在建库建表的时候,只需要在其中一台节点创建库和表的时候指定一些参数就可以自动同步到另外的节点啦:

1、建库的时候需要指定ON CLUSTER xxx ENGINE = Atomic;语句,我这里集群叫hex_cluster,所以是 CREATE DATABASE test ON CLUSTER hex_cluster ENGINE = Atomic; 2、建表的时候需要指定ON CLUSTER hex_cluster语句,我这里集群叫hex_cluster,所以是 create table if not exists test.store ON CLUSTER hex_cluster( id Int64, code String, name_cn String, name_en String, store_type String, status String ) engine = ReplicatedMergeTree('/clickhouse/tables/{database}/{shard}/store','{replica}') ORDER BY id SETTINGS index_granularity = 8192; ps: 1、因为是集群模式,所以在使用表engine的时候一定要指定Replicated系列的引擎,这样集群节点之间才能够实现数据的同步 2、例如我上面指定的ReplicatedMergeTree,里面的内容含义其实就是zookeeper中的路径,被{}括号包裹起来的参数其实就是ck中所谓的宏变量,{database}这个就是ck内置的宏变量,{shard}和{replica}就是在你metrika.xml中定义的<macros></macros>标签中定义的变量,你在metrika.xml定义的是啥值,到时候建表成功后,在zookeeper中你就能看到对应的路径啦


6、!!!遇到的问题:因为我的机器配置比较低(8c16g),在使用过程中出现了一些问题,所以调整了几个参数,增加ck服务的稳定性
1、在users.xml中用户标签下添加了如下俩参数,当分组或者排序的时候内存达到8G就触发磁盘分组和排序,防止出现oom的情况
<max_bytes_before_external_group_by>8000000000</max_bytes_before_external_group_by>
<max_bytes_before_external_sort>8000000000</max_bytes_before_external_sort>
2、在将大数据量的csv文件导入到ck的过程中,一直报一个code241的错误,这个错误可能是版本的bug,解决办法就是在config.xml中修改了10。这个参数的默认值是0.9,表示ck只会使用到机器内存的百分之90,我把这个参数改为了10
<max_server_memory_usage_to_ram_ratio>10</max_server_memory_usage_to_ram_ratio>



额,文章写得不是特别好,如果有需要的话可以加我好友,让我们一起成长,加好友时备注下csdn哈