ClickHouse03-小白如何快速搭建ClickHouse集群

普通测试通常使用ClickHouse单节点就可以了,但是生产环境不免需要考虑多活、负载等高可用问题,集群就成了基础需求

ClickHouse在集群的选择上,作者已知的有两种: 使用ZooKeeper作为节点协调的组件,使用ClickHouse-Keeper作为节点协调的组件:

  1. 在ZooKeeper中存储集群的元数据信息,如表结构、分片配置以及集群节点状态等,通过ZooKeeper,ClickHouse能够实现在分布式环境下的元数据管理和节点间通信的协调。ZooKeeper的部署和使用也是大家比较熟悉的了。
  2. 基于已知的ZooKeeper在部分场景下响应不佳的前提下,ClickHouse Keeper基于Raft一致性算法开发的一款专门为ClickHouse设计的分布式一致性解决方案,旨在替代ZooKeeper作为ClickHouse集群的元数据存储与管理工具。它提供了高可用性和强一致性保证,简化了ClickHouse集群的部署和维护,并且针对ClickHouse的工作负载进行了优化。这个组件的部署还分为独立集群和嵌入式的。

两种选择均可。

  • ZooKeeper方式搭建CK集群
    • 手动部署
      • 手动部署ZK
      • 手动部署CK
    • docker-compose部署
  • ClickHouse-Keeper方式搭建CK集群
    • ClickHouse-Keeper嵌入式
    • ClickHouse-Keeper独立集群
      • 手动部署模式
      • 容器化部署模式
      • Keeper自身服务监控

在这里插入图片描述

ZooKeeper方式搭建CK集群

手动部署

手动部署ZK

使用官方指导快速部署一个单节点

正常单节点部署流程:

  1. 根据自身环境,下载一个安装包
  2. 解压安装包,并进入根目录
  3. 修改conf/zoo.cfg配置文件
tickTime=2000               #描述票据的时间,用来处理心跳或者session过期,毫秒
dataDir=/var/lib/zookeeper  #本地用于存储内存数据快照的目录
clientPort=2181             #通信端口
  1. 启动服务 bin/zkServer.sh start
  2. 查看日志,确认启动成功

集群模式需要至少3个服务节点,2个服务节点本质上是不如单节点稳定,并不推荐
多节点集群的部署流程:

  1. 在每个服务节点,下载安装包,如单节点
  2. 在每个服务节点,解压安装包,进入根目录
  3. 在每个服务节点,进行配置修改 conf/zoo.cfg
tickTime=2000               #描述票据的时间,用来处理心跳或者session过期,毫秒
dataDir=/var/lib/zookeeper  #本地用于存储内存数据快照的目录
clientPort=2181             #通信端口
initLimit=5                 #表示新节点必须连接到leader的时间限制 initLimit*tickTime=最终毫秒数
syncLimit=2                 #表示服务节点要leader间过期的时限 syncLimit*tickTime=最终毫秒数
server.1=zoo1:2888:3888     #服务节点1
server.2=zoo2:2888:3888     #服务节点2
server.3=zoo3:2888:3888     #服务节点3

如果3个服务节点位于一个服务器上,也就是端口无法相同,那么请区分开,比如 2888:3888, 2889:3889, 2890:3890
4. 分别启动那个服务,查看日志

手动部署CK

在多个服务器上分别部署ClickHouse,下载和基础安装步骤均可参考官方说明

单个服务节点都需要:

  1. 根据自身环境,下载安装包
  2. 解压安装服务节点
  3. 修改配置文件 /etc/clickhouse-server/config.xml(默认文件),如果你想调整文件的位置和名称,启动服务时需指定 clickhouse-server --config-file=/etc/clickhouse-server/config.xml
  4. 增加 metrika.xml 配置ZK的地址,修改config.xml 引入metrika的配置,此外需要根据自身情况定义好分片和副本的数量。

关于什么是分片?
通过定义Distributed表引擎或使用Replicated表引擎结合MergeTree系列引擎可以实现分片功能。分片有助于水平扩展数据存储能力,并且可以根据需要在不同的物理服务器上进行负载均衡

关于什么是副本?
通过Replicated表引擎(如ReplicatedMergeTree)可以在集群中的不同节点上创建相同结构表的副本,这样即使某个节点发生故障,其他拥有副本的节点仍然可以提供服务,从而保证了数据的高可用性

/etc/clickhouse-server/metrika.xml:

<yandex>
    <clickhouse_remote_servers>
        <cluster_2s_2r>
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>127.0.0.1</host>
                    <port>9000</port>
                    <user>default</user>
                    <password></password>
                </replica>
                <replica>
                    <host>127.0.0.1</host>
                    <port>9100</port>
                    <user>default</user>
                    <password></password>
                </replica>
            </shard>
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>127.0.0.1</host>
                    <port>9100</port>
                    <user>default</user>
                    <password></password>
                </replica>
                <replica>
                    <host>127.0.0.1</host>
                    <port>9000</port>
                    <user>default</user>
                    <password></password>
                </replica>
            </shard>
        </cluster_2s_2r>
    </clickhouse_remote_servers>

    <zookeeper-servers>
        <node index="1">
            <host>127.0.0.1</host>
            <port>2181</port>
        </node>
         <node index="2">
            <host>127.0.0.1</host>
            <port>2182</port>
        </node>
         <node index="3">
            <host>127.0.0.1</host>
            <port>2183</port>
        </node>
    </zookeeper-servers>

    <macros>
        <layer>01</layer>
        <shard>01</shard><!--分片的定义需要不同-->
        <replica>cluster01-01-1</replica> <!--副本的定义需要不同-->
    </macros>
    <networks>
        <ip>::/0</ip>
    </networks>

    <clickhouse_compression>
        <case>
            <min_part_size>10000000000</min_part_size>
            <min_part_size_ratio>0.01</min_part_size_ratio>
            <method>lz4</method>
        </case>
    </clickhouse_compression>
</yandex>

/etc/clickhouse-server/config.xml

<clickhouse>
 ...
 <!--引入配置-->
      <include_from>/etc/clickhouse-server/metrika.xml</include_from>
 ...
</clickhouse>
  1. 正常启动所有服务节点,systemctl start clickhouse-server(启动 clickhouse-server 新旧版有几种方式,此种为最新推荐的形式)

docker-compose部署

使用docker-compose编排部署

docker-compose.yml:

version: '3.8'
services: 
  zoo1:
    image: zookeeper:latest
    container_name: zoo1
    environment:
      - ZOO_MY_ID=1
      - ZOO_SERVERS=server.1=zoo1:2888:3888;server.2=zoo2:2888:3888;server.3=zoo3:2888:3888
    ports:
      - "2181:2181"
    volumes:
      - ./data/zoo1/data:/data
      - ./data/zoo1/datalog:/datalog
    networks:
      - ckcluster
  zoo2:
    image: zookeeper:latest
    container_name: zoo2
    environment:
      - ZOO_MY_ID=2
      - ZOO_SERVERS=server.1=zoo1:2888:3888;server.2=zoo2:2888:3888;server.3=zoo3:2888:3888
    ports:
      - "2182:2181"
    volumes:
      - ./data/zoo1/data:/data
      - ./data/zoo1/datalog:/datalog
    networks:
      - ckcluster 
  zoo3:
    image: zookeeper:latest
    container_name: zoo3
    environment:
      - ZOO_MY_ID=3
      - ZOO_SERVERS=server.1=zoo1:2888:3888;server.2=zoo2:2888:3888;server.3=zoo3:2888:3888
    ports:
      - "2183:2181"
    volumes:
      - ./data/zoo1/data:/data
      - ./data/zoo1/datalog:/datalog 
    networks:
      - ckcluster       
  cknode1:
    image: clickhouse/clickhouse-server
    container_name: cknode1
    hostname: cknode1
    volumes:
      - ./data/clickhousenode1/data:/var/lib/clickhouse
      - ./data/clickhousenode1/conf/clickhouse-server/:/etc/clickhouse-server/
    depends_on:
      - zoo1
      - zoo2
      - zoo3
    ports:
      - "9000:9000"
      - "8123:8123"
      - "9009:9009"
      - "9363:9363"
    networks:
      - ckcluster  
  cknode2:
    image: clickhouse/clickhouse-server
    container_name: cknode2
    hostname: cknode2
    volumes:
      - ./data/clickhousenode2/data:/var/lib/clickhouse
      - ./data/clickhousenode2/conf/clickhouse-server/:/etc/clickhouse-server/
    depends_on:
      - zoo1
      - zoo2
      - zoo3
    ports:
      - "9100:9100"
      - "8124:8124"
      - "9109:9109"
      - "9364:9364"    
    networks:
      - ckcluster
networks:
  ckcluster:
    external: true

在docker-compose.yml的根目录下,启动服务docker-compose up -d

查看日志 docker-compose logs -f 确认服务是否启动成功,如有问题就修复后重启

如需重启:

  • docker-compose restart 全部重启
  • docker-compose restart cknode1 仅重启cknode1服务
  • docker-compose down && docker-compose up -d 全部暂停再启动

ClickHouse-Keeper方式搭建CK集群

ClickHouse-Keeper嵌入式

嵌入式模式代表不需要额外部署和启动服务,在ClickHouse中配置启用,启动ClickHouse就可以启动嵌入式Keeper

修改 /etc/clickhouse-server/config.xml

<clickhouse>
 <logger>
        <!-- Possible levels [1]:

          - none (turns off logging)
          - fatal
          - critical
          - error
          - warning
          - notice
          - information
          - debug
          - trace

            [1]: https://github.com/pocoproject/poco/blob/poco-1.9.4-release/Foundation/include/Poco/Logger.h#L105-L114
        -->
        <level>trace</level>
        <log>/var/log/clickhouse-keeper/clickhouse-keeper.log</log>
        <errorlog>/var/log/clickhouse-keeper/clickhouse-keeper.err.log</errorlog>
        <!-- Rotation policy
             See https://github.com/pocoproject/poco/blob/poco-1.9.4-release/Foundation/include/Poco/FileChannel.h#L54-L85
          -->
        <size>500M</size>
        <count>10</count>
        <!-- <console>1</console> --> <!-- Default behavior is autodetection (log to console if not daemon mode and is tty) -->
    </logger>
...
    <keeper_server>
            <tcp_port>9181</tcp_port>

            <!-- Must be unique among all keeper serves -->
            <server_id>1</server_id>

            <log_storage_path>/var/lib/clickhouse/coordination/logs</log_storage_path>
            <snapshot_storage_path>/var/lib/clickhouse/coordination/snapshots</snapshot_storage_path>

            <coordination_settings>
                <operation_timeout_ms>10000</operation_timeout_ms>
                <min_session_timeout_ms>10000</min_session_timeout_ms>
                <session_timeout_ms>100000</session_timeout_ms>
                <raft_logs_level>information</raft_logs_level>
                <compress_logs>false</compress_logs>
                <!-- All settings listed in https://github.com/ClickHouse/ClickHouse/blob/master/src/Coordination/CoordinationSettings.h -->
            </coordination_settings>

            <!-- enable sanity hostname checks for cluster configuration (e.g. if localhost is used with remote endpoints) -->
            <hostname_checks_enabled>true</hostname_checks_enabled>
            <raft_configuration>
                <server>
                    <id>1</id>

                    <!-- Internal port and hostname -->
                    <hostname>localhost</hostname>
                    <port>9234</port>
                </server>

                <!-- Add more servers here -->

            </raft_configuration>
    </keeper_server>
...
   <zookeeper>
        <node>
            <host>localhost</host>
            <port>9181</port>
        </node>
     </zookeeper>
</clickhouse>

以上为手动部署模式,如果是 docker 或 K8S 模式,请将 host 替换为 container name.

启动直接是采用 clickhouse 的启动方式,systemctl start clickhouse-server(启动 clickhouse-server 新旧版有几种方式均可)

此外同样的部署多个服务节点,需调整 <zookeeper><macros> 下的地址配置,设置合理的分片和副本

ClickHouse-Keeper独立集群

独立集群模式,意思是独立于ClickHouse-server之外,可以有更多的灵活性,不需要与ClickHouse-server进行一一捆绑,会更像ZooKeeper集群,可以独立运作,支持单独的指标监控
官方部署说明文档参考

手动部署模式

手动部署模式下,ClickHouse-Keeper在ClickHouse-server部署完后就已经存在:

  • 配置位于 /etc/clickhouse-keeper/keeper_config.xml 就是其配置文件,内容类似于嵌入式的配置,但是需要额外放开IPV6访问和SSL配置 <listen_host>0.0.0.0</listen_host>
  • 启动可以通过 systemctl start clickhouse-keeper

这样你就开启了一个单独的ClickHouse-Keeper节点,如果要与ClickHouse-server绑定互动起来,就需要在 /etc/clickhouse-server/config.xml 中完善 <zookeeper/> 节点的配置

容器化部署模式

容器化部署模式下,选取ClickHouse-Keeper独立的镜像,对于它所需的配置文件进行挂载然后启动,需要与ClickHouse-server进行互动的话,配置同手动部署

对于ClickHouse集群,此外就是多部署几个ClickHouse服务节点,将Keeper的配置同步配置到 <zookeeper>的节点中

Keeper自身服务监控

对于独立集群运作的Keeper集群,可以独立校验它的状态和监控指标

$:echo ruok | nc localhost 9181
imok

$:echo mntr | nc localhost 9181
zk_version      v24.2.1.2248-testing-891689a41506d00aa169548f5b4a8774351242c4
zk_avg_latency  0
zk_max_latency  0
zk_min_latency  0
zk_packets_received     0
zk_packets_sent 0
zk_num_alive_connections        0
zk_outstanding_requests 0
zk_server_state standalone
zk_znode_count  10
zk_watch_count  0
zk_ephemerals_count     0
zk_approximate_data_size        1570
zk_key_arena_size       0
zk_latest_snapshot_size 0
zk_open_file_descriptor_count   34
zk_max_file_descriptor_count    500000
zk_followers    0
zk_synced_followers     0

$:echo stat | nc localhost 9181
ClickHouse Keeper version: v24.2.1.2248-testing-891689a41506d00aa169548f5b4a8774351242c4
Clients:
 [::1]:44734(recved=0,sent=0)

Latency min/avg/max: 0/0/0
Received: 0
Sent: 0
Connections: 0
Outstanding: 0
Zxid: 0x5be
Mode: standalone
Node count: 10

作为这个独立的组件,也有自己的 Prometheus 端点,可供监控使用


如果喜欢我的文章的话,可以去GitHub上给一个免费的关注吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/486155.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java实现JDBC编程

1 数据库编程的必备条件 编程语言&#xff0c;如Java&#xff0c;C、C、Python等 数据库&#xff0c;如Oracle&#xff0c;MySQL&#xff0c;SQL Server等 数据库驱动包&#xff1a;不同的数据库&#xff0c;对应不同的编程语言提供了不同的数据库驱动包&#xff0c;如&#x…

day44 动态规划part6

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…

vue3怎么读取本地json数据

在Vue 3中&#xff0c;可以使用fetch API或其他HTTP客户端来读取本地JSON数据。以下是一个使用fetch的示例&#xff1a; <template><div><h1>本地JSON数据</h1><div v-if"data">{{ data }}</div></div> </template>…

MP4如何把视频转MOV格式? MP4视频转MOV格式的技巧

在现代的数字媒体时代&#xff0c;视频格式转换成为了许多用户必须掌握的技能。特别是将MP4视频转换为MOV格式&#xff0c;这对于需要在Apple设备上播放或编辑视频的用户来说尤为重要。本文将详细介绍如何将MP4视频转换为MOV格式&#xff0c;帮助读者轻松应对不同设备和平台的需…

利用云手机高效运营多个海外社媒账户

随着全球化进程的不断推进&#xff0c;中国出海企业和B2B外贸企业日益重视海外社媒营销&#xff0c;将其视为抢占市场份额的关键策略。在海外社媒营销中&#xff0c;企业通常会在多个平台上批量开通账户&#xff0c;搭建自己的社媒内容矩阵。本文将会介绍如何用云手机高效运营多…

平价开放式耳机哪些品牌好用?五款高质量测评入手不后悔 !

现在耳机主要分为入耳式和开放式&#xff0c;而且入耳式耳机对外界声音隔绝太严重&#xff0c;走路的时候听不到脚步声喇叭声音也不利于安全&#xff0c;甚至戴耳机和别人说话沟通也很困难。所以现在的年轻人开始追求舒适、安全、健康的听歌产品&#xff0c;开放式耳机也逐渐成…

牛客网python练习题库记录

python格式化输出 python 读入整数数字并且换行输出 python规范输出小数点后几位 afloat(input()) format_a{.2f}.format(a) print(format_a) 小数化整数 afloat(input()) bint(a) print(b) 为整数增加小数点 input_integer int(input()) float_number float(input…

Spring中的IOC和AOP

Spring两大核心机制&#xff1a;IOC和AOP 一、IOC&#xff1a;控制反转 传统开发中&#xff0c;需要调用对象的时候&#xff0c;需要调用者手动来创建被调用者的实例&#xff0c;即对象是由调用者new出来的&#xff1b; 但在Spring框架中&#xff0c;创建对象的工作不再由调用…

基于springboot+vue的家政服务平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

代码随想录阅读笔记-栈与队列【逆波兰表达式求值】

题目 根据 逆波兰表示法&#xff0c;求表达式的值。 有效的运算符包括 , - , * , / 。每个运算对象可以是整数&#xff0c;也可以是另一个逆波兰表达式。 说明&#xff1a; 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说&#xff0c;表达式总会得出有…

力扣669 修剪二叉搜索树 Java版本

文章目录 题目描述代码 题目描述 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有被移除&#xff0…

Linux--动静态库的原理和使用详解

本文介绍了Linux系统中动态库与静态库的概念、原理以及使用方法。通过深入讲解动态库与静态库的区别和优劣势&#xff0c;帮助读者更好地理解并选择合适的库类型来进行软件开发。 动态库和静态库的概念 动态库&#xff08;Dynamic Link Library&#xff0c;简称DLL&#xff09…

加速新能源汽车产品迭代:融合前沿科技的重要性

新能源汽车新质生产力提升咨询方案 一、新能源汽车企业行业目前发展现状及特点&#xff1a; 1、快速增长 2、技术迭代快 3、竞争加剧 二、新能源汽车企业发展新质生产力面临的痛点&#xff1a; 1、技术创新压力巨大 2、市场竞争激烈 3、供应链稳定性欠缺 4、成本控制压…

【Linux】网络编程套接字一

网络编程套接字一 1.预备知识1.1理解源IP地址和目的IP地址1.2认识端口号1.3认识TCP协议1.4认识UDP协议1.5网络字节序 2.socket编程接口3.UDP网络程序3.1UDP Server服务器端3.2UDP Client客户端 4.根据UDP客户端服务端做的设计4.1字典热加载4.2shell命令行4.3聊天室 5.windows客…

疲劳检测YOLOV8

疲劳检测YOLOV8&#xff0c;只需要OPENCV&#xff0c;采用YOLOV8训练得到PT模型&#xff0c;然后转换成ONNX&#xff0c;OPENCV调用&#xff0c;支持C/PYTHON/ANDROID开发疲劳检测YOLOV8

HCIP —— 生成树 (下)

目录 STP&#xff08;生成树&#xff09;的角色选举 根网桥 根端口 选举规则&#xff1a; 指定端口 生成树的端口状态 STP的接口状态&#xff1a;禁用、阻塞、侦听、学习、转发 五种状态 禁用状态 阻塞状态 侦听状态 学习状态 转发状态 当生成树拓扑结构发生变化 …

Http中Host,Referer,Origin和Access-Control-Allow-Origin

Http中Host&#xff0c;Referer&#xff0c;Origin和Access-Control-Allow-Origin 文章目录 Http中Host&#xff0c;Referer&#xff0c;Origin和Access-Control-Allow-OriginHost定义特性作用 Referer定义特性作用 Origin定义特性作用 Access-Control-Allow-Origin定义特性作用…

003- AutoCoder 使用Web版大模型,性感的Human As Model 模式

这是下面这篇文章的继续。 002- 用 AutoCoder 添加和修改代码 前面我们提到&#xff0c;如何解决你没有API版大模型&#xff0c;或者你的API版大模型太弱&#xff0c;而你只有Web版本的诸如 Kimi/GPT4 的情况下&#xff0c;改如何让AutoCoder帮助你完成编程&#xff1f; 我们有…

2024,淘天六大升级,电商人都准备好了吗?|淘天商品API数据采集接口

电商进入存量时代&#xff0c; 淘天仍是电商重心和基本盘 我们说现在的电商仍有红利&#xff0c;只是竞争愈发激烈&#xff0c;从增量时代发展到存量时代。 进入存量竞争时代&#xff0c;全平台布局已成行业共识。 电商淘天官方订单及商品详情API数据采集接口 但无论如何&…

删除数组中的指定元素(了解如何删除数组中的指定元素,并返回一个新的数组,看这一篇就足够了!)

前言&#xff1a;有时候我们会遇到要在数组中删除指定元素&#xff0c;但是不能创建新的数组&#xff0c;那么这个时候应该如何操作呢&#xff1f; ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 废话不多讲&#xff0c;让我们…