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-keeper | zookeeper |
---|---|---|
集成度 | 与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-03 | 10.110.5.132 10.110.5.133 10.110.5.134 | apache-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运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**





**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上linux运维知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加vx:vip1024b (备注linux运维获取)**

r-1712826074807)]
[外链图片转存中...(img-q72pvkbb-1712826074807)]
[外链图片转存中...(img-qlef06w6-1712826074807)]
[外链图片转存中...(img-yfewax2p-1712826074808)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上linux运维知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加vx:vip1024b (备注linux运维获取)**
[外链图片转存中...(img-arkmjydv-1712826074808)]
发表评论