ClickHouse生产运维系列[部署篇]-02_Zookeeper介绍及集群安装部署_zookeeper clickhouse

ZooKeeper保证了一系列强一致性的特性,包括顺序一致性、原子性、单一视图、可靠性和实时性(或最终一致性)。这些保证使得ZooKeeper成为构建可靠分布式系统的坚实基础。

开发和运行要求

ZooKeeper用Java编写,因此它需要Java运行时环境。根据ZooKeeper的不同版本,对Java版本有不同的要求,通常推荐使用Java 8或更高版本以确保最佳兼容性和性能。

二、ZooKeeper与ClickHouse-Keeper对比

ClickHouse-Keeper是ClickHouse从21.8版本开始引入的一个组件,旨在作为ZooKeeper的替代品,用于管理ClickHouse集群的元数据和一些协调任务。下面是基于集成度、性能、配置和维护、兼容性、功能、社区和支持、稳定性和成熟度、开发语言、快照和日志处理等几个维度,对ClickHouse-Keeper和原生ZooKeeper进行的对比。

集成度

  • ClickHouse-Keeper:与ClickHouse紧密集成,为ClickHouse设计,提供了更为直接和高效的集成方式,减少了第三方依赖。
  • ZooKeeper:作为一个独立的服务运行,需要额外的部署和配置步骤来与ClickHouse或其他应用集成。

性能

  • ClickHouse-Keeper:由于是为ClickHouse量身定制,性能上有针对性的优化,特别是在处理大量并发请求和高负载情况下,表现可能更优。
  • ZooKeeper:虽然性能稳定且在分布式系统中表现良好,但在极端负载或特定场景下可能不如ClickHouse-Keeper优化得更为精细。

配置和维护

  • ClickHouse-Keeper:配置和维护更为简化,尤其是在ClickHouse环境中,因为可以共享一些配置和监控工具。
  • ZooKeeper:需要独立配置和维护,对于不熟悉ZooKeeper的用户来说,学习曲线可能更陡峭。

兼容性

  • ClickHouse-Keeper:设计时考虑到与ZooKeeper的兼容性,但主要集中在ClickHouse的使用场景。
  • ZooKeeper:广泛用于各种分布式系统,兼容性和适用范围更广。

功能

  • ClickHouse-Keeper:虽然提供了ZooKeeper的核心功能,但可能在某些高级功能上有所缺失或差异。
  • ZooKeeper:成熟、功能丰富,支持广泛的用例和场景。

社区和支持

  • ClickHouse-Keeper:作为ClickHouse生态的一部分,享有ClickHouse社区的支持,但社区相对较小。
  • ZooKeeper:有一个庞大且活跃的社区,得到了广泛的支持和贡献,包括官方文档和第三方资源。

稳定性和成熟度

  • ClickHouse-Keeper:虽然经过ClickHouse团队的精心设计和测试,但相对较新,可能在某些边缘情况下稳定性不如ZooKeeper。
  • ZooKeeper:历经多年发展,被广泛认为是分布式系统中的稳定和成熟解决方案。

开发语言

  • ClickHouse-Keeper:使用与ClickHouse相同的开发语言(主要是C++),有助于提高项目内部的协同效率。
  • ZooKeeper:主要使用Java开发,这对Java生态系统的用户更为友好。

快照和日志处理

  • ClickHouse-Keeper:优化了快照和日志的处理,特别是在与ClickHouse数据和操作相关的场景中。
  • ZooKeeper:提供了可靠的快照和日志处理机制,但可能没有针对特定场景(如ClickHouse使用场景)的优化。

针对上述内容,可以通过一个简单的图表来将二者做个对比,表格内容如下所示。

维度ClickHouse-KeeperZooKeeper
集成度与ClickHouse紧密集成,减少第三方依赖作为独立服务运行,需要额外设置
性能针对性能进行了优化,尤其是在高负载下在多种场景下表现稳定,但未针对性优化
配置和维护简化了配置和维护过程需要单独配置和维护,学习曲线较陡
兼容性专为ClickHouse设计,可能缺乏更广泛的生态系统兼容性广泛兼容分布式系统
功能覆盖核心功能,可能缺少一些高级功能成熟、功能丰富
社区和支持属于ClickHouse社区的一部分,相对较少大型、活跃的社区,支持广泛
稳定性和成熟度相对较新,稳定性可能有边缘情况经过时间考验的稳定性和成熟度
开发语言与ClickHouse相同(主要是C++)主要使用Java,对Java生态系统有利
快照和日志处理针对ClickHouse用例进行了优化可靠的机制,未针对ClickHouse特别优化

另外ClickHouse-Keeper在处理zxid Overflow[溢出]方面相对原生ZooKeeper做了优化,一定程度解决了zxid Overflow问题。

注:zxid是一个64位数字,分为两部分:高32位标识Leader周期,低32位标识事务序号。每个新事务使低32位加1。当低32位满(0xffffffff),触发选主,重置zxid:新周期开始,序号归零。

三、Zookeeper集群部署

为了更好模拟线上ZooKeeper集群环境,本次仍选用部署Apache ZooKeeper集群,未选择ClickHouse-Keeper,后期会对ClickHouse-Keeper进行调研测试,对比两者的性能差异。

3.1 环境规划

本次选择三台部署CentOS 7.9操作系统的虚拟机用来部署ZooKeeper三节点集群,ZooKeeper版本为3.8.3

主机名IP地址ZooKeeper版本
prod-ck-zk-01 prod-ck-zk-02 prod-ck-zk-0310.110.5.132 10.110.5.133 10.110.5.134apache-zookeeper-3.8.3

3.2 部署JDK

本次选择在三节点部署jdk1.8.0_321版本。

 -- root用户,三节点都需操作,此处以其中一节点为例
 [root@prod-ck-zk-01 ~]# cd /home/
 [root@prod-ck-zk-01 home]# tar -zxf jdk1.8.0_321.tar.gz 
 ​
 -- 编辑环境变量
 [root@prod-ck-zk-01 ~]# cat << EOF | sudo tee -a /etc/profile
 export JAVA_HOME=/home/jdk1.8.0_321
 export PATH=\$JAVA_HOME/bin:\$PATH
 export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar
 EOF
 ​
 -- 生效环境变量
 [root@prod-ck-zk-01 ~]# source /etc/profile
 ​
 -- 查看java版本
 [root@prod-ck-zk-01 ~]# java -version
 java version "1.8.0_321"
 Java(TM) SE Runtime Environment (build 1.8.0_321-b07)
 Java HotSpot(TM) 64-Bit Server VM (build 25.321-b07, mixed mode)

3.3 部署ZooKeeper

登录ZooKeeper官网下载地址 Index of /dist/zookeeper,下载对应的ZooKeeper版本,本次我选择下载zookeeper-3.8.3/ 这个版本,这个版本是 2023-10-09发布的。

将下载的apache-zookeeper-3.8.3-bin.tar.gz安装包分别上传到三台服务器某个目录下,比如/home目录,保持目录统一。接下来按照如下方式一步步采用二进制方式部署apache-zookeeper-3.8.3。

1)解压tar包

 -- root用户,三节点都需操作,此处以其中一节点为例
 [root@prod-ck-zk-01 ~]# cd /home
 [root@prod-ck-zk-01 home]# tar -zxf apache-zookeeper-3.8.3-bin.tar.gz 
 ​
 -- 创建目录
 [root@prod-ck-zk-01 home]# mkdir -p /data/zookeeper

2)修改配置文件

 -- root用户,三节点都需操作,此处以其中一节点为例
 [root@prod-ck-zk-01 home]# cd apache-zookeeper-3.8.3-bin/conf/
 [root@prod-ck-zk-01 conf]# cp -p zoo_sample.cfg zoo.cfg
 -- 编辑后的zoo.cfg文件内容如下
 tickTime=2000
 initLimit=10
 syncLimit=5
 dataDir=/data/zookeeper
 clientPort=2181
 ​
 metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
 metricsProvider.httpPort=7000
 metricsProvider.exportJvmInfo=true
 ​
 admin.enableServer=true
 admin.serverPort=8080
 ​
 server.1=10.110.5.132:2888:3888
 server.2=10.110.5.133:2888:3888
 server.3=10.110.5.134:2888:3888
 autopurge.purgeInterval=1
 autopurge.snapRetainCount=5
 ​
 -- 以上参数具体含义如下
 各个参数的含义如下:
 - `tickTime=2000`: ZooKeeper使用的基本时间单位,单位是毫秒。这个值用于心跳和超时等。
 ​
 - `initLimit=10`: 这是follower初始化与leader之间的连接时能容忍的最多心跳次数(tickTime的数量)。
 ​
 - `syncLimit=5`: 这是leader和follower之间发送消息,请求和应答时间长度,单位是tickTime。
 ​
 - `dataDir=/data/zookeeper`: ZooKeeper存储数据的目录。
 ​
 - `clientPort=2181`: 客户端连接ZooKeeper服务器的端口号。
 ​
 - `metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider`: ZooKeeper的度量提供者类名,这里配置的是PrometheusMetricsProvider,表示使用Prometheus进行监控。
 ​
 - `metricsProvider.httpPort=7000`: Prometheus的HTTP服务端口。
 ​
 - `metricsProvider.exportJvmInfo=true`: 是否导出JVM的相关信息给Prometheus。
 ​
 - `admin.enableServer=true`: 是否启用ZooKeeper的admin server。
 ​
 - `admin.serverPort=8080`: ZooKeeper admin server的端口号。
 ​
 - `server.X=ip:port:port`: ZooKeeper集群中的服务器配置,X代表服务器的编号,ip是服务器的IP地址,第一个端口是服务器之间通信的端口,第二个端口是leader选举使用的端口。
 ​
 - `autopurge.purgeInterval=1`: 自动清理的间隔(单位是小时),这里配置的是1小时清理一次。
 ​
 - `autopurge.snapRetainCount=5`: 保留的快照文件数量,超过这个数量的旧文件会被清理。

3)添加java.env配置文件

 -- root用户,三节点都需操作,此处以其中一节点为例
 -- 通过如下命令在/home/apache-zookeeper-3.8.3-bin/conf目录下新增 java.env 配置文件,命令及配置文件内容如下:
 cat << 'EOF' | tee -a /home/apache-zookeeper-3.8.3-bin/conf/java.env
 #!/bin/sh
 ​
 export JVMFLAGS="-Xms128m \
     -Xmx6g \
     -Xloggc:/var/log/zookeeper/zookeeper-gc.log \
     -XX:+UseGCLogFileRotation \
     -XX:NumberOfGCLogFiles=16 \
     -XX:GCLogFileSize=16M \
     -verbose:gc \
     -XX:+PrintGCTimeStamps \
     -XX:+PrintGCDateStamps \
     -XX:+PrintGCDetails \
     -XX:+PrintTenuringDistribution \
     -XX:+PrintGCApplicationStoppedTime \
     -XX:+PrintGCApplicationConcurrentTime \
     -XX:+PrintSafepointStatistics \
     -XX:+UseG1GC \
     -Djute.maxbuffer=8388608 \
     -XX:MaxGCPauseMillis=50 $JVMFLAGS"
 EOF
 ​
 -- 以上各参数解释如下
 这些是JVM启动参数,用于调整内存、垃圾收集和日志:
 ​
 - `-Xms128m`: 初始堆内存128MB。
 - `-Xmx6g`: 最大堆内存6GB。
 - `-Xloggc`: 垃圾收集日志路径。
 - `-XX:+UseGCLogFileRotation`: 启动日志轮转。
 - `-XX:NumberOfGCLogFiles=16`: 日志文件数16个。
 - `-XX:GCLogFileSize=16M`: 日志文件大小16MB。
 - `-verbose:gc`: 输出垃圾收集信息。
 - `-XX:+PrintGCTimeStamps`: 添加GC时间戳。
 - `-XX:+PrintGCDateStamps`: 添加GC日期戳。
 - `-XX:+PrintGCDetails`: 输出GC详细信息。
 - `-XX:+PrintTenuringDistribution`: 新生代年龄分布信息。
 - `-XX:+PrintGCApplicationStoppedTime`: 应用暂停时间。
 - `-XX:+PrintGCApplicationConcurrentTime`: 应用运行时间。
 - `-XX:+PrintSafepointStatistics`: 安全点统计信息。
 - `-XX:+UseG1GC`: 使用G1垃圾收集器。
 - `-Djute.maxbuffer=8388608`: ZooKeeper序列化缓冲区大小8MB。
 - `-XX:MaxGCPauseMillis=50`: 期望最大GC暂停时间50毫秒。
 `$JVMFLAGS`: 累加已有的JVMFLAGS参数。

4)增加myid文件

 -- root用户,三节点都需操作
 -- 在ZooKeeper集群各数据目录/data/zookeeper,增加myid文件,标识当前节点,用于ZooKeeper集群选举【注意,各节点myid值不同】
 ​
 -- 节点一 prod-ck-zk-01
 [root@prod-ck-zk-01 ~]#  echo 1 >> /data/zookeeper/myid 
 ​
 -- 节点二 prod-ck-zk-02
 [root@prod-ck-zk-02 ~]#  echo 2 >> /data/zookeeper/myid 
 ​
 -- 节点二 prod-ck-zk-03
 [root@prod-ck-zk-03 ~]#  echo 3 >> /data/zookeeper/myid 

5)启动Zookeeper集群

 -- root用户操作
 -- 在ZooKeeper节点一/home/目录创建start_zk_cluster.sh集群启动脚本,脚本内容如下所示:
 cat << 'EOF' | sudo tee /home/start_zk_cluster.sh > /dev/null
 #!/bin/bash
 ​
 # 定义服务器列表
 SERVERS=("10.110.5.132" "10.110.5.133" "10.110.5.134")
 ​
 # Zookeeper启动脚本的路径
 ZK_START_SCRIPT="/home/apache-zookeeper-3.8.3-bin/bin/zkServer.sh start"
 ​
 # root密码
 PASSWORD="root"
 ​
 # 遍历服务器列表并通过ssh启动Zookeeper
 for SERVER in "${SERVERS[@]}"; do
     echo "Starting Zookeeper on ${SERVER}..."
     sshpass -p $PASSWORD ssh -o StrictHostKeyChecking=no root@$SERVER $ZK_START_SCRIPT
 done
 ​
 echo "Zookeeper cluster startup initiated on all servers."
 EOF
 ​
 -- 然后执行start_zk_cluster.sh脚本
 [root@prod-ck-zk-01 home]# sh start_zk_cluster.sh 
 -- 输出结果如下
 Starting Zookeeper on 10.110.5.132...
 /usr/bin/java
 ZooKeeper JMX enabled by default
 Using config: /home/apache-zookeeper-3.8.3-bin/bin/../conf/zoo.cfg
 Starting zookeeper ... STARTED
 Starting Zookeeper on 10.110.5.133...
 /usr/bin/java
 ZooKeeper JMX enabled by default
 Using config: /home/apache-zookeeper-3.8.3-bin/bin/../conf/zoo.cfg
 Starting zookeeper ... STARTED
 Starting Zookeeper on 10.110.5.134...
 /usr/bin/java
 ZooKeeper JMX enabled by default
 Using config: /home/apache-zookeeper-3.8.3-bin/bin/../conf/zoo.cfg
 Starting zookeeper ... STARTED
 Zookeeper cluster startup initiated on all servers.
 ​
 -- 注意:若报 sshpass: command not found,需各服务器安装 sshpass,通过如下方式安装sshpass
 sudo yum install sshpass

3.4 查看Zookeeper集群状态

 -- 节点一查看ZK当前状态
 [root@prod-ck-zk-01 ~]# /home/apache-zookeeper-3.8.3-bin/bin/zkServer.sh status
 ZooKeeper JMX enabled by default
 Using config: /home/apache-zookeeper-3.8.3-bin/bin/../conf/zoo.cfg
 Client port found: 2181. Client address: localhost. Client SSL: false.
 Mode: follower   ## 显示当前状态为follower
 ​
 -- 节点二查看ZK当前状态
 [root@prod-ck-zk-02 ~]# /home/apache-zookeeper-3.8.3-bin/bin/zkServer.sh status


**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/19bbc5c2b1237db9303b70e49856fe5e.png)
![img](https://img-blog.csdnimg.cn/img_convert/e5fed60ccf0f76f303914846c43edb91.png)
![img](https://img-blog.csdnimg.cn/img_convert/84d96da2a1ea284526240cdd6d1acbf8.png)
![img](https://img-blog.csdnimg.cn/img_convert/b7b9729edbe4361a01107ad87dc540d7.png)
![img](https://img-blog.csdnimg.cn/img_convert/abc9c98e46f0e24787dbb4fdac55018c.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)**
![img](https://img-blog.csdnimg.cn/img_convert/30e36cc8d2d28d5a4482299275e5cdf6.jpeg)

r-1712826074807)]
[外链图片转存中...(img-q72PvKbB-1712826074807)]
[外链图片转存中...(img-QlEF06w6-1712826074807)]
[外链图片转存中...(img-YfewAX2p-1712826074808)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)**
[外链图片转存中...(img-ARKmjyDV-1712826074808)]

  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值