zookeeper安装以及遇到的一些坑(代码片段)

gxyandwmm gxyandwmm     2022-12-04     232

关键词:

最近项目中用到了storm,然后storm中用到了zookeeper,然后今天抽空整理一下zookeeper的安装使用,原来后期再慢慢学习。

本篇文档,操作部分是摘自其他博客,里边的问题分析是自己在实践过程中遇到然后特别记录的!

----------------------------- 开始:

技术图片

一、Zookeeper原理简介

ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。

Zookeeper设计目的
  • 最终一致性:client不论连接到那个Server,展示给它的都是同一个视图。
  • 可靠性:具有简单、健壮、良好的性能、如果消息m被到一台服务器接收,那么消息m将被所有服务器接收。
  • 实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。
  • 等待无关(wait-free):慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待。
  • 原子性:更新只能成功或者失败,没有中间状态。
  • 顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面。
Zookeeper工作原理

1、在zookeeper的集群中,各个节点共有下面3种角色和4种状态:

角色:leader,follower,observer
状态:leading,following,observing,looking

Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议(ZooKeeper Atomic Broadcast protocol)。Zab协议有两种模式,它们分别是恢复模式(Recovery选主)和广播模式(Broadcast同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。

为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。

每个Server在工作过程中有4种状态:

LOOKING:当前Server不知道leader是谁,正在搜寻。

LEADING:当前Server即为选举出来的leader。

FOLLOWING:leader已经选举出来,当前Server与之同步。

OBSERVING:observer的行为在大多数情况下与follower完全一致,但是他们不参加选举和投票,而仅仅接受(observing)选举和投票的结果。

Zookeeper集群节点
  • Zookeeper节点部署越多,服务的可靠性越高,建议部署奇数个节点,因为zookeeper集群是以宕机个数过半才会让整个集群宕机的。
  • 需要给每个zookeeper 1G左右的内存,如果可能的话,最好有独立的磁盘,因为独立磁盘可以确保zookeeper是高性能的。如果你的集群负载很重,不要把zookeeper和RegionServer运行在同一台机器上面,就像DataNodes和TaskTrackers一样。
实验环境
主机名 系统 IP地址
linux-node1 CentOS release 6.8 192.168.1.148
linux-node2 CentOS release 6.8 192.168.1.149
linux-node2 CentOS release 6.8 192.168.1.150
二、Zookeeper安装

Zookeeper运行需要java环境,需要安装jdk,注:每台服务器上面都需要安装zookeeper、jdk,建议本地下载好需要的安装包然后上传到服务器上面,服务器上面下载速度太慢。

2.1、JDK安装

JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html

rpm -ivh jdk-8u101-linux-x64.rpm

技术图片

2.2、Zookeeper安装

Zookeeper链接:http://zookeeper.apache.org/

wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz -P /usr/local/src/
tar zxvf zookeeper-3.4.8.tar.gz -C /opt
cd /opt && mv zookeeper-3.4.8 zookeeper
cd zookeeper
cp conf/zoo_sample.cfg conf/zoo.cfg

#把zookeeper加入到环境变量

echo -e "# append zk_env\\nexport PATH=$PATH:/opt/zookeeper/bin" >> /etc/profile
三、Zookeeper集群配置

注意:搭建zookeeper集群时,一定要先停止已经启动的zookeeper节点。

3.1、Zookeeper配置文件修改

#修改过后的配置文件zoo.cfg,如下:

egrep -v "^#|^$" zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataLogDir=/opt/zookeeper/logs
dataDir=/opt/zookeeper/data
clientPort=2181
autopurge.snapRetainCount=500
autopurge.purgeInterval=24
server.1= 192.168.1.148:2888:3888
server.2= 192.168.1.149:2888:3888
server.3= 192.168.1.150:2888:3888

#创建相关目录,三台节点都需要

mkdir -p /opt/zookeeper/logs,data

#其余zookeeper节点安装完成之后,同步配置文件zoo.cfg。

3.2、配置参数说明

tickTime这个时间是作为zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是说每个tickTime时间就会发送一个心跳。

initLimit这个配置项是用来配置zookeeper接受客户端(这里所说的客户端不是用户连接zookeeper服务器的客户端,而是zookeeper服务器集群中连接到leader的follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。

当已经超过10个心跳的时间(也就是tickTime)长度后 zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20秒。

syncLimit这个配置项标识leader与follower之间发送消息,请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是5*2000=10秒。

dataDir顾名思义就是zookeeper保存数据的目录,默认情况下zookeeper将写数据的日志文件也保存在这个目录里;

clientPort这个端口就是客户端连接Zookeeper服务器的端口,Zookeeper会监听这个端口接受客户端的访问请求;

server.A=B:C:D中的A是一个数字,表示这个是第几号服务器,B是这个服务器的IP地址,C第一个端口用来集群成员的信息交换,表示这个服务器与集群中的leader服务器交换信息的端口,D是在leader挂掉时专门用来进行选举leader所用的端口。

3.3、创建ServerID标识

除了修改zoo.cfg配置文件外,zookeeper集群模式下还要配置一个myid文件,这个文件需要放在dataDir目录下。

这个文件里面有一个数据就是A的值(该A就是zoo.cfg文件中server.A=B:C:D中的A),在zoo.cfg文件中配置的dataDir路径中创建myid文件。

#在192.168.1.148服务器上面创建myid文件,并设置值为1,同时与zoo.cfg文件里面的server.1保持一致,如下

echo "1" > /opt/zookeeper/data/myid

技术图片

#在192.168.1.149服务器上面创建myid文件,并设置值为2,同时与zoo.cfg文件里面的server.2保持一致,如下

echo "2" > /opt/zookeeper/data/myid

技术图片

#在192.168.1.150服务器上面创建myid文件,并设置值为1,同时与zoo.cfg文件里面的server.3保持一致,如下

echo "3" > /opt/zookeeper/data/myid

技术图片

到此,相关配置已完成

-------------------------------------------------------------------------------------------------------------------

四、Zookeeper集群启动与查看
1、启动每个服务器上面的zookeeper节点:

#linux-node1、linux-node2、linux-node3

/opt/zookeeper/bin/zkServer.sh start

注意:报错排查
技术图片

Zookeeper节点启动不了可能原因:zoo.cfg配置文件有误、iptables没关。

2、启动完成之后查看每个节点的状态

#linux-node1
技术图片
#linux-node2
技术图片
#linux-node3
技术图片
#从上面可以看出,linux-node1,linux-node3两台服务器zookeeper的状态是follow模式,linux-node2这台服务器zookeeper的状态是leader模式。

 

自己的机器使用status查询不成功,感觉像是版本问题,由于时间问题不过多的纠结,此处

查看文档的时候,很感谢以为网友的回答,解决了该问题;如下:

[email protected]:~# telnet localhost 2181
Trying 127.0.0.1...
Connected to myhost.
Escape character is ‘^]‘.
stats
Zookeeper version: 3.4.3-cdh4.0.1--1, built on 06/28/2012 23:59 GMT
Clients:

Latency min/avg/max: 0/0/677
Received: 4684478
Sent: 4687034
Outstanding: 0
Zxid: 0xb00187dd0
Mode: leader
Node count: 127182
Connection closed by foreign host.

 

本地未安装telnet,现在安装telnet,如下:

一、安装telnet

1、检测telnet-server的rpm包是否安装 

[[email protected] ~]# rpm -qa telnet-server 
若无输入内容,则表示没有安装。出于安全考虑telnet-server.rpm是默认没有安装的,而telnet的客户端是标配。即下面的软件是默认安装的。

2、若未安装,则安装telnet-server,否则忽略此步骤

[[email protected] ~]#yum install telnet-server  
 
 
3、检测telnet-server的rpm包是否安装 

[[email protected] ~]# rpm -qa telnet 
telnet-0.17-47.el6_3.1.x86_64

4、若未安装,则安装telnet,否则忽略此步骤

[[email protected] ~]# yum install telnet

 

结果如下:

linux1:

技术图片

linux2:

技术图片

linux3:

技术图片

 

-------------------------------------------------------------------------------------------------------------------

五、Zookeeper集群连接

Zookeeper集群搭建完毕之后,可以通过客户端脚本连接到zookeeper集群上面,对客户端来说,zookeeper集群是一个整体,连接到zookeeper集群实际上感觉在独享整个集群的服务。
#在linux-node1测试
技术图片
通过上图可以看出整个zookeeper集群已经搭建并测试完成。
#Zookeeper原理:
http://blog.csdn.net/wuliu_forever/article/details/52053557
http://www.cnblogs.com/luxiaoxun/p/4887452.html

unity打ab包中遇到的坑以及一些心得(代码片段)

unity打AB包中遇到的坑以及一些心得unity踩坑之旅提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录unity打AB包中遇到的坑以及一些心得前言一、AB包是什么,基础引入?二、AB包怎... 查看详情

cdh6.3.2开启kerberos遇到的坑(代码片段)

...ros遇到的坑标签(空格分隔):大数据平台构建一:关于安装系统的一些坑二:关于开启KerberosJava的一些坑三:关于hive一:关于安装系统的一些坑1)安装之前一定确认jdk的安装目录因为通过centos7这个系统默认会在装之前会自带... 查看详情

zookeeperzookeeper性能优化与配置详解一些踩坑建议(代码片段)

1.概述转载:https://www.cnblogs.com/EasonJim/p/7488834.htmlZooKeeper的功能特性通过ZooKeeper配置文件来进行控制管理(zoo.cfg配置文件)。ZooKeeper这样的设计其实是有它自身的原因的。通过前面对ZooKeeper的配置可以看出,对ZooKe... 查看详情

kafka安装和使用远程代码进行访问---附踩坑记录(代码片段)

...服务器进行消息的生成与消费首先要使用kafka,要有jdk和zookeeper的环境本文在阿里云的centos7环境上进行jdk版本选择的是1.8.0_181zookeeper的版本是3.4.12kafka的版本是2.12-1.1.1关于kafka命令的介绍本文不介绍了只介绍怎么搭建一个kafka单... 查看详情

kafka安装和使用远程代码进行访问---附踩坑记录(代码片段)

...服务器进行消息的生成与消费首先要使用kafka,要有jdk和zookeeper的环境本文在阿里云的centos7环境上进行jdk版本选择的是1.8.0_181zookeeper的版本是3.4.12kafka的版本是2.12-1.1.1关于kafka命令的介绍本文不介绍了只介绍怎么搭建一个kafka单... 查看详情

zookeeper避坑指南:zookeeper3.6.4版本bug导致的数据不一致问题(代码片段)

ZooKeeper作为分布式系统的元数据中心,对外服务的数据一致性需要得到很好的保证,但是一些老版本的ZooKeeper在一些情况下可能无法保证数据的一致性,导致依赖ZooKeeper的系统出现异常。作者:子葵背景ZooKeeper作为分布式系统的... 查看详情

kvmgt部署文档以及遇到的一些坑

参考文档https://github.com/intel/gvt-linux/wiki/GVTg_Setup_Guide#22-hardware-requirements环境描述  OS:centos7.3  kernel:4.15  qemu:2.12  cpu:3865U步骤一:编译内核  1安装编译环境rpm--importhttps://www.elrepo.org/RPM-GPG-KEY 查看详情

关于苹果内购(iap)的一些问题以及那些坑(代码片段)

最近在研究苹果内购功能,所以,在网上找了一些资料,进行学习。但是,内购功能在实现的过程中,有很多坑,笔者算是真的遇到了好多啊,下面也是自己对内购的一些心得与体会吧!我这里说... 查看详情

遇到的一些坑!(代码片段)

这次记录下安装tomcat9遇到的坑,今天我启动我的tomcat服务报错一大堆4、11-Feb-202018:34:32.223警告[main]org.apache.catalina.core.AprLifecycleListener.init基于APR的本地库加载失败.错误报告为[E:apache-tomcat-9.0.30-windows-x64apache-tomcat-9.0.30in cnative-1.dl... 查看详情

zookeeper避坑实践:zxid溢出导致选主(代码片段)

背景线上flink用户使用ZooKeeper做元数据中心以及集群选主,一些版本的flink在ZooKeeper选主时,会重启Job,导致一些非预期的业务损失。而ZooKeeper在zxid溢出时,会主动触发一次选主,就会导致flinkJob的非预期重启&... 查看详情

kafka安装使用和遇到的坑(代码片段)

下载安装参考:https://segmentfault.com/a/1190000012730949?https://kafka.apache.org/quickstart关闭服务关闭zookeeperbin/zookeeper-server-stop.sh关闭kafkabin/kafka-server-stop.sh遇到的坑问题1[2018-04-0811:20:32,999]WARNSessi 查看详情

zookeeper集群查看状态时报错errorcontactingservice.itisprobablynotrunning的一些坑以及解决办法

最近在搭建mq集群时候需要用到,zookeeper,可是启动的时候显示成功了,查看状态的时候却报错了:碰到这个问题也是研究好好半天才解决,这里就总结出一个快速解决办法!首先,必须看日志:报错信息一般是当前目录下这个文件中,打开... 查看详情

记一次开发过程中,iview遇到的一些坑以及解决办法(代码片段)

写在开头:本次项目采用的是vue2.0+iview3.0,最近公司没啥事,来总结一下开发过程中遇到的问题。 1、Modal关闭问题需求背景:modal框里面是个form表单,点击确定之后,先验证form表单,验证通过则关闭modal框,验证不成功则提... 查看详情

kotlin协程asyncawait的异常踩坑以及异常处理的正确姿势(代码片段)

使用Kotlin来做一些异步操作相信大家都非常熟悉了,特别是结合Jetpack的一些组件,使得我们在Android开发中写异步任务非常的方便。但是,关于在使用协程的时候,个人觉得异常处理这一块是相对来讲是需要花时... 查看详情

zookeeper-什么是zookeeper,以及zookeeper的安装(代码片段)

Zookeeper什么是Zookeeper?官网传送门ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维... 查看详情

配置hbase2.4版本高可用使用外部zookeeper时遇到的问题(代码片段)

最近在配置hbase高可用(使用外部zookeeper)时,发现网上并没有现成的资料。下面是踩坑过程:坑:起初在hbase-site.xml直接将hdfs的文件目录以及端口直接写死,如下图日志报错内容:java.net.ConnectException:... 查看详情

docker下安装zookeeper以及kafka(代码片段)

一、安装Zookeeper1.查看Zookeeper镜像以及版本访问Zookeeper镜像库地址也可以通过命令dockersearchzookpper在命令行搜索zookeeper镜像,但是通过该命令无法查看远程镜像版本信息。NAME:镜像名(镜像仓库源的名称)DESCRIPTION:对该... 查看详情

gethostbyname超时,与遇到的一些坑(代码片段)

现网有些DNS服务器质量不好,经常不返回,导致服务器在做DNS请求时经常被卡住,简单测试后发现如果服务器不返回结果,一般20+秒超时。但是如果使用alarm和signal,是不能中断系统函数的,参考了一些网络上的资料,可以设置s... 查看详情