当前位置: 首页 > news >正文

ZooKeeper 安装配置

前言

有时会需要安装开源的大数据集群进行测评或者验证问题,已经装过很多遍了,所以想系统的总结整理一下各个组件的安装部署,包括 Zookeeper、Hadoop、Hive、Spark 等。

版本

  • Zookeeper 3.5.6 3.8.4 3.9.3

初始化

包括主机名修改、SSH互信、JDK安装等

SSH互信

# 每个节点
ssh-keygen -t rsa# 从 1节点执行,传到2
# 从 2节点执行,传到3
# 从 n-1节点执行,传到n
# 从 n节点执行,传到1
# 将 1节点authorized_keys传到其他所有节点
cd ~/.ssh
cat id_rsa.pub>>authorized_keys
scp authorized_keys 192.168.1.2:~/.ssh/

下载Zookeeper

下载地址:https://archive.apache.org/dist/zookeeper/

解压

以 3.5.6 为例:

tar -zxvf apache-zookeeper-3.5.6-bin.tar.gz -C /usr/local/
ln -s /usr/local/apache-zookeeper-3.5.6-bin /usr/local/zookeeper

配置环境变量

vi /etc/profile.d/zookeeper.sh
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$PATH
source /etc/profile.d/zookeeper.sh

配置Zookeeper

zoo.cfg

cd /usr/local/zookeeper/conf/
vi zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/dataLog
# 事务日志文件数保留的蜀门,默认为3
autopurge.snapRetainCount=3
# 事务日志清理频率,单位是小时。需要填写一个1或更大的整数,默认是0,表示不开启自己清理功能。 
autopurge.purgeInterval=1 
clientPort=2181
# 这里IP可以改为对应的hostname
server.1=192.168.1.1:2888:3888
server.2=192.168.1.2:2888:3888
server.3=192.168.1.3:2888:3888

创建数据目录

mkdir -p /usr/local/zookeeper/data
mkdir -p /usr/local/zookeeper/dataLog
echo "1" > /usr/local/zookeeper/data/myid
dataDir
  • 核心作用:存储 ZooKeeper 的快照数据(snapshot) 和事务日志索引。
    • 快照数据:ZooKeeper 会定期将内存中的数据状态(如节点、权限等)持久化到快照文件中,用于快速恢复数据。快照文件通常以 snapshot.xxxx 命名(xxxx 为事务 ID)。
    • 其他元数据:包括集群成员信息、myid 文件(用于标识当前节点在集群中的 ID,仅在集群模式下存在)等。
  • 特点:
    • 快照数据是内存数据的周期性备份,并非实时更新,因此不能单独作为数据恢复的唯一依据,需要配合事务日志使用。
    • 该目录是 ZooKeeper 运行的必填目录,必须在配置文件(zoo.cfg)中指定。
dataLogDir
  • 核心作用:专门存储 ZooKeeper 的事务日志(transaction log)。
    • 事务日志记录了 ZooKeeper 处理的所有写操作(如创建节点、修改数据等),是实时追加的,每一次事务操作都会被立即写入日志,确保数据的一致性和可恢复性。
  • 特点:
    • 事务日志是 ZooKeeper 数据一致性的关键,恢复数据时需先通过事务日志重演所有操作,再结合快照数据补充最新状态。
    • 该目录是可选配置(若不指定,事务日志会默认存储在 dataDir 中),但强烈建议单独设置,原因是:
      • 事务日志的写入频率远高于快照,单独存储可减少磁盘 IO 竞争,提升性能。
      • 便于日志管理(如单独备份、清理过期日志)。

配置日志

主要是修改了默认的日志路径,也可以用默认的日志配置

修改 zkEnv.sh
vi /usr/local/zookeeper/bin/zkEnv.sh

if [ "x${ZOO_LOG_DIR}" = "x" ]
thenZOO_LOG_DIR="$ZOOKEEPER_PREFIX/logs"
fiif [ "x${ZOO_LOG4J_PROP}" = "x" ]
thenZOO_LOG4J_PROP="INFO,CONSOLE"
fi

修改为

if [ "x${ZOO_LOG_DIR}" = "x" ]
thenZOO_LOG_DIR="/var/log/zookeeper"
fiif [ "x${ZOO_LOG4J_PROP}" = "x" ]
thenZOO_LOG4J_PROP="INFO,CONSOLE,ROLLINGFILE"
fi
  • ZOO_LOG4J_PROP : 可以根据需要选择是否保留CONSOLE,设置日志级别等, 3.8 和 3.9 版本没有这个属性可以忽略
创建日志目录

每个节点都执行:

mkdir -p /var/log/zookeeper
log4j.properties

3.8 和 3.9 版本默认没有 log4j.properties ,可以根据需要选择是否添加:

# DEFAULT: console appender only
log4j.rootLogger=WARN, CONSOLE, ROLLINGFILE# Example with rolling log file and tracing
#log4j.rootLogger=TRACE, CONSOLE, ROLLINGFILE, TRACEFILE# Log INFO level and above messages to the console
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=WARN
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n# Add ROLLINGFILE to rootLogger to get log file output
# Log DEBUG level and above messages to a log file
log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLINGFILE.Threshold=DEBUG
log4j.appender.ROLLINGFILE.File=/var/log/zookeeper/zookeeper.log
# Max log file size of 10MB
log4j.appender.ROLLINGFILE.MaxFileSize=10MB
# uncomment the next line to limit number of backup files
#log4j.appender.ROLLINGFILE.MaxBackupIndex=10log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n# Add TRACEFILE to rootLogger to get log file output
# Log DEBUG level and above messages to a log file
log4j.appender.TRACEFILE=org.apache.log4j.FileAppender
log4j.appender.TRACEFILE.Threshold=TRACE
log4j.appender.TRACEFILE.File=zookeeper_trace.loglog4j.appender.TRACEFILE.layout=org.apache.log4j.PatternLayout
### Notice we are including log4j's NDC here (%x)
log4j.appender.TRACEFILE.layout.ConversionPattern=%d{ISO8601} - %-5p [%t:%C{1}@%L][%x] - %m%n

复制Zookeeper和系统环境变量到其他节点

scp -r /usr/local/apache-zookeeper-3.5.6-bin/ 192.168.1.2:/usr/local/
scp -r /usr/local/apache-zookeeper-3.5.6-bin/ 192.168.1.3:/usr/local/
scp /etc/profile.d/zookeeper.sh 192.168.1.2:/etc/profile.d/
scp /etc/profile.d/zookeeper.sh 192.168.1.3:/etc/profile.d/

创建软链接并使环境变量生效

在其他每个节点上都创建软链接

ln -s /usr/local/apache-zookeeper-3.5.6-bin /usr/local/zookeeper
source /etc/profile.d/zookeeper.sh

修改myid文件内容

将2节点上ZooKeeper的myid文件内容修改为数字2:

echo "2" > /usr/local/zookeeper/data/myid

将3节点上ZooKeeper的myid文件内容修改为数字3:

echo "3" > /usr/local/zookeeper/data/myid

启动ZooKeeper

在每个节点上执行如下操作启动ZooKeeper:

zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

在每个节点上执行如下命令查看ZooKeeper状态:

zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader

ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follow

验证ZooKeeper

当ZooKeeper服务启动成功之后,在任意一个节点上执行如下命令进行验证:

zkCli.shConnecting to localhost:2181
Welcome to ZooKeeper!
JLine support is enabledWATCHER::WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 1] create /hello world
Created /hello
[zk: localhost:2181(CONNECTED) 2] get /hello
world
[zk: localhost:2181(CONNECTED) 3] ls /
[hello, zookeeper]
[zk: localhost:2181(CONNECTED) 4] set /hello new-world
[zk: localhost:2181(CONNECTED) 5] get /hello
new-world
[zk: localhost:2181(CONNECTED) 6] delete /hello
[zk: localhost:2181(CONNECTED) 7] ls /
[zookeeper]

zkCli.sh 默认连接 localhost:2181 ,也可以连接指定的 server 如:

zkCli.sh -server 192.168.1.2:2181
Connecting to 192.168.1.2:2181
Welcome to ZooKeeper!
JLine support is enabledWATCHER::WatchedEvent state:SyncConnected type:None path:null
[zk: 192.168.1.2:2181(CONNECTED) 0]
http://www.xdnf.cn/news/1388827.html

相关文章:

  • C++基础(②VS2022创建项目)
  • 球型摄像机实现360°无死角
  • CLion 中配置运行 Qt 项目指南
  • 三一重工AI预测性维护破局:非计划停机减少60%,技师转型与数字孪生技术搅动制造业
  • 预制菜餐厅:工业化与温度餐平衡术
  • 【Rust】 5. Trait 与运算符重载
  • Python Imaging Library (PIL) 全面指南:PIL高级图像处理-分割与颜色空间转换
  • [Mysql数据库] 知识点总结6
  • 人工智能-python-深度学习-批量标准化与模型保存加载详解
  • 嵌入式-定时器的从模式控制器、PWM参数测量实验-Day24
  • 快手发布SeamlessFlow框架:完全解耦Trainer与Agent,时空复用实现无空泡的工业级RL训练!
  • OpenTenBase实战:从MySQL迁移到分布式HTAP的那些坑与收获
  • MySQL數據庫開發教學(三) 子查詢、基礎SQL注入
  • java开发连接websocket接口
  • system论文阅读--HPCA25
  • 基于SpringBoot和百度人脸识别API开发的保安门禁系统
  • LubanCat-RK3568 UART串口通信,以及遇到bug笔记
  • 实时音视频延迟优化指南:从原理到实践
  • Less运算
  • (一)Python语法基础(上)
  • C++中float与double的区别和联系
  • 基于STM32设计的智能宠物喂养系统(华为云IOT)_273
  • 迅为RK3588开发板安卓串口RS485App开发-硬件连接
  • 智慧工地源码
  • 如何将iPhone日历传输到电脑
  • Webrtc支持FFMPEG硬解码之Intel
  • 【React】登录(一)
  • 2025 年 8 月《DeepSeek-V3.1 SQL 能力评测报告》发布
  • OpenCV 图像预处理核心技术:阈值处理与滤波去噪
  • 强化学习的“GPT-3 时刻”即将到来