1. 安装启动与单机测试
① 下载安装包
https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/
选择 apache-zookeeper-3.5.7-bin.tar.gz
② 在 Linux 服务器中解压
得到以下目录,然后新增 data 目录存放 zookeeper 数据(mkdir data)
bin conf docs lib LICENSE.txt logs NOTICE.txt README.md README_packaging.txt
③ 配置模板
进入 conf 目录,修改 zoo_sample.cfg
将模板中的 dataDir 模板路径改成上边新增的 data 目录(否则存放在 /tmp 下,数据会被定期清除)
④ 启动 zookeeper
进入 bin 目录,执行 ./zkServer.sh start 启动服务端
之后再执行 ./zkCli.sh 启动客户端
在启动完服务端后,可以通过 jps 命令查看服务端是否启动完毕
如果启动成功的话,将会看到 QuorumPeerMain 进程
[root@IceClean data]# jps
6173 QuorumPeerMain
也可以通过 ./zkServer.sh status 查看服务端状态
》》》问题排查
——(1) 服务端启动有带 start,而客户端没有
如果服务端忘记带 start,此时服务并没有真正启动,这是客户端连接就会报错
——(2) 服务端异常关闭
如果服务端异常关闭了,也会导致客户端连接报错
以上两种情况,客户端连接时,都会抛出以下错误:
[myid:localhost:2181] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1244] - Socket error occurred: localhost/127.0.0.1:2181: Connection refused
该怎么解决呢?
可以直接使用 ./zkServer.sh stop关闭服务
也可以进入 data 目录(也就是配置文件中 dataDir 所配置的那个目录),将 zookeeper_server.pid 删除,在用正确的方法启动服务就好了
——(3) 启动步骤正确了,却没有 QuorumPeerMain 进程
这时候可能是 zookeeper 3.5 特性所致,默认使用了 8080 端口,结果该端口被 tomcat 占用了,导致服务端启动失败,可以打开 logs/ 下的日志文件进行验证:
Caused by: java.io.IOException: Failed to bind to /0.0.0.0:8080
如果看到了这个异常,那多半就是这个问题了
解决方法是修改配置文件的服务端默认端口,在 zoo.cfg 下,加入以下内容:
(端口随意设置)
admin.serverPort=8888
再次以正确的方式启动,会发现服务端正常启动,客户端也正常连接啦~
》》》成功消灭
2. Zookeeper 集群操作
注意:以下操作均在集群中操作,与服务器主机无关
这里需要用到的集群,可以使用虚拟机搭
而如果使用的是云服务器,而又不想买多台服务器的(就像我,家里没矿)
就可以使用 Docker 来搭建集群了,可以看我这篇文章(挺长的,不过真的是保姆级哦)
【Docker x Hadoop】使用 Docker 搭建 Hadoop 集群(从零开始保姆级)
终于搭好集群啦,是不是很不容易?(本人搞了几天,也是跌跌碰碰摸索出来的)
那接下拉切入另一个正题叭
① 将 Zookeeper 安装到每个容器中
这个按照实际情况来,然后再每个容器中解压
scp apache-zookeeper-3.5.7-bin.tar.gz root@hadoop001:/home/hadoop
scp apache-zookeeper-3.5.7-bin.tar.gz root@hadoop002:/home/hadoop
scp apache-zookeeper-3.5.7-bin.tar.gz root@hadoop003:/home/hadoop
② 为每台 hadoop 定一个编号
在解压目录下,创建 data 文件夹(也就是自定义的那个),在里边创建 myid 文件,写入编号
即在 hadoop001 hadoop002 hadoop003 中,该文件的内容依次为 1 2 3
③ 在 zoo.cfg 文件末尾补充配置
server.1=hadoop001:2888:3888
server.2=hadoop002:2888:3888
server.3=hadoop003:2888:3888
格式可以总结为 server.A=B:C:D
- A 表示服务器的编号,即上边设置的
myid - B 表示服务器的地址
- C 表示服务器 Follower 与集群中 Leader 服务器交换信息的端口
- D 表示在 Leader 挂掉时,用来选举新 Leader 的端口
③ 启动 zookeeper 集群
在 3 个容器中,分别执行 ./zkServer.sh 启动 zookeeper
每次执行完毕可以使用 ./zkServer status 查看状态
然后我们就会发现,但第一行个容器启动时,状态为:

这是因为,我们一共配置了三台服务器,但现在只启动了一台
根据 zookeeper 的规则,必须有过半的服务器处于运行状态,集群才算正常运行
而现在只启动 1 台,没有过半,所以状态值为 ERROR
我们再以相同的方式,启动 hadoop002 和 hadoop003
再回过头看状态,就会发现 hadoop002 是 leader,而其他两台是 follower

④ Leader 选举机制
选举存在两个阶段:服务器启动时的选举、运行过程中 leader 服务器宕机重新选取
规则如下:
- 服务器 ID (myid):编号越大在选举算法中权重越大
- 事务 ID (zxid):值越大说明数据越新,权重越大
- 逻辑时钟 (epoch-logicalclock):同一轮投票过程中的逻辑时钟值是相同的,每投完一次值会增加
⑤ 集群启动与停止脚本
⑥ 写入流程
只有 Leader 有处理写请求的能力
所以有两种情况
① Leader 收到了写入请求:他将自己先写入一份,然后通知其他 follower 执行写入操作,follower 写入完毕后,将放回消息给 leader,一旦 leader 发现写入数量已经达到集群半数,便会放回给客户端写入成功的消息,然后一般继续通知其他服务器尽心感谢如操作
② 如果是 follower 收到了写入请求,由于没有执行写入操作的权限,它将会把请求交给 leader,leader 依旧先将数据写入自己的,再通知其他服务器写入,等到写入数量过半时,leader 会通知被请求的 follower 已经写入成功,再由该 follower 放回给客户端写入成功的消息
3. 命令行操作
通过 ./zkCli.sh 进入 zookeeper 后,可以进行以下操作
1) 查看指定路径的子节点__例:ls -R /
ls [选项] <结点路径>
-s 显示节点详情
-R 递归显示所有子节点
2) create <节点路径> <节点值>__例:create /xxx/node1 "node data"
-s 创建带序号的节点
不带序号的节点不允许重复创建,会报错
而带序号的节点被多次创建时,由于节点带序号可重复创建,只不过序号 +1
注意,该序号是相对与整个系统的,系统中有一个默认的计数器,决定所有带序号节点的序号
-e 创建临时节点
临时节点在客户端关闭后,将被清除
3) 查看节点数据
get -s <节点路径>
4) 修改节点值
set <节点路径> <新值>
5) 监控节点变化,但该节点值发生变化时,便会被监听到,但一次监听只能监听一次变化
get -w <节点路径>
6) 监听子节点变化,铜钴盐也是注册一次监听只能生效一次
ls -w <节点路径>
7) 删除节点
delete <节点路径>
这种只能删除最小节点(及空节点)
delete

最低0.47元/天 解锁文章
1259

被折叠的 条评论
为什么被折叠?



