ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk


ZooKeeper有三种安装模式:单机安装(standalone)、伪集群模式、集群模式:

  • standalone模式:只在一台机器上安装ZooKeeper,并只启动一个ZooKeeper实例。
  • 伪集群:在一台机器上开启多个ZooKeeper实例来模拟集群。通过加载不同配置文件,分配不同数据目录来实现这种模式。因为在同一机器上运行,所以机器宕机,整个ZooKeeper就挂了。基本上不会布置这样的ZooKeeper集群。
  • 集群模式:在至少3台机器上安装ZooKeeper构成集群,只要故障节点数量在一定范围内就能保证ZooKeeper服务的可用性。

真正布置的基本上都是集群模式,standalone偶尔用来做些测试,它有单点故障,伪集群模式也有单点故障。

集群模式并非一定至少3台机器,但用2台机器比1台机器更危险,因为随便故障一台都无法满足"大多数"的要求,都会阻塞整个ZooKeeper服务。而2台机器的故障几率是1台机器的2倍。所以,也建议采用奇数台机器来部署ZooKeeper。

ZooKeeper下载:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/stable/

我下载的是3.4.12版本。

1.安装jdk

ZooKeeper运行在java环境下,所以需要先安装jdk,且要求版本高于1.6。

jdk下载:http://www.oracle.com/technetwork/java/javase/downloads/index.html

以rpm包的为例。

yum localinstall -y jdk-8u131-linux-x64.rpm

rpm包的安装路径为/usr/java。

[root@s1 ~]# ls -l /usr/java/
total 4
lrwxrwxrwx 1 root root 16 Jun 26 22:53 default -> /usr/java/latest
drwxr-xr-x 9 root root 4096 Jun 26 22:53 jdk1.8.0_131
lrwxrwxrwx 1 root root 22 Jun 26 22:53 latest -> /usr/java/jdk1.8.0_131

通过这种软链接方式,以后有新版jdk要安装,直接改latest的链接对象即可。

然后再设置JAVA_HOME环境变量并导出java程序所在目录的PATH环境变量。

echo 'JAVA_HOME=/usr/java/latest' > /etc/profile.d/jdk.sh
echo 'PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile.d/jdk.sh
chmod +x /etc/profile.d/jdk.sh
source /etc/profile.d/jdk.sh

2.StandAlone模式

standalone模式是在单机上安装ZooKeeper。

先解压zookeeper-3.4.12.tar.gz。

tar xf zookeeper-3.4.12.tar.gz

再把它移到/usr/local/下方便管理。

mv zookeeper-3.4.12 /usr/local/zookeeper

在ZooKeeper的bin目录下提供了几个Windows和Linux下的脚本:

[root@s2 zookeeper]# cd /usr/local/zookeeper
[root@s2 zookeeper]# ls bin
README.txt zkCleanup.sh zkCli.cmd zkCli.sh zkEnv.cmd zkEnv.sh zkServer.cmd zkServer.sh
  • zkServer:用于启动、停止ZooKeeper,且能查看ZooKeeper状态。
zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
  • zkEnv:设置ZooKeeper启动、关闭时的环境变量。在其余的每个脚本中都引用了这个脚本。
  • zkCleanup:清除ZooKeeper的事务日志和快照。
  • zkCli:ZooKeeper的一个命令行客户端。

设置ZooKeeper的环境变量,这不是必须的,只是为了方便操作上面的几个脚本。

echo 'ZOOKEEPER_HOME=/usr/local/zookeeper' >/etc/profile.d/zk.sh
echo 'PATH=$ZOOKEEPER_HOME/bin:$PATH' >> /etc/profile.d/zk.sh
chmod +x /etc/profile.d/zk.sh
source /etc/profile.d/zk.sh

把windows下的脚本删除:

rm -rf /usr/local/zookeeper/bin/{*.cmd,README.txt}

为了启动ZooKeeper,先提供一个配置文件。默认配置文件的路径为$ZOOKEEPER_HOME下的conf目录。在这个目录下,有几个文件:

[root@s2 zookeeper]# ls conf
configuration.xsl log4j.properties zoo_sample.cfg
  • configuration.xsl:无视它。
  • log4f.properties:是ZooKeeper的日志配置文件。
  • zoo_sample.cfg:是ZooKeeper的示例配置文件。

zkServer.sh默认的配置文件名为zoo.cfg。所以,在conf目录下创建一个zoo.cfg。写入几个保证ZooKeeper能正常运行的配置项:

tickTime=2000
dataDir=/usr/local/zookeeper/data1
clientPort=2181

其中:

  • tickTime:ZooKeeper中很多配置项(如心跳时间、连接超时时间等)都要用到的时间单位,这里配置为2000毫秒,即2秒。
  • dataDir:ZooKeeper实例的数据目录。
  • clientPort:ZooKeeper向外提供服务的端口。

然后用zkServer.sh来启动ZooKeeper。

[root@s2 zk]# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

也可以手动指定启动时读取的配置文件:

[root@s2 zk]# zkServer.sh start /usr/local/zookeeper/conf/zoo.cfg

查看ZooKeeper的运行状态:

[root@s2 zk]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: standalone

可以看到运行模式是"standalone"。

ZooKeeper启动后,就可以向外提供ZooKeeper服务了。这里用ZooKeeper提供的命令行客户端去连接一下ZooKeeper做个简单的测试。

连接ZooKeeper实例:

zkCli.sh -server localhost:2181

连接过程中会输出一大堆信息。当连接成功后,将进入ZooKeeper的交互式模式:

WatchedEvent state:SyncConnected type:None path:null

[zk: localhost:2181(CONNECTED) 0]   # 在这里输入ZooKeeper允许的命令

例如,创建一个znode:

[zk: localhost:2181(CONNECTED) 0] create /zk_test mydata1
Created /zk_test
[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper, zk_test] [zk: localhost:2181(CONNECTED) 2] quit

3.配置伪集群模式

ZooKeeper的伪集群模式是在一个服务器上运行多个ZooKeeper实例来模拟ZooKeeper集群。伪集群模式下,每个实例的配置文件不同、数据目录不同、端口不同。一般来说,ZooKeeper集群至少需要3个服务器节点。

这里,我配置3个实例的ZooKeeper伪集群,它们的数据目录分别为$ZOOKEEPER_HOME下的data1、data2和data3。因为稍后要向这些目录中写myid文件,所以先创建这3个目录:

mkdir /usr/local/zookeeper/data{1,2,3}

先提供3个实例的配置文件,分别为$ZOOKEEPER_HOME/conf/{zoo1.cfg,zoo2.cfg,zoo3.cfg}

以下是zoo1.cfg内容,各配置项稍后解释。

tickTime=2000
dataDir=/usr/local/zookeeper/data1
clientPort=2181
initLimit=5
syncLimit=2
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889

以下是zoo2.cfg内容,各配置项稍后解释。

tickTime=2000
dataDir=/usr/local/zookeeper/data2
clientPort=2182
initLimit=5
syncLimit=2
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889

以下是zoo3.cfg内容,各配置项稍后解释。

tickTime=2000
dataDir=/usr/local/zookeeper/data3
clientPort=2183
initLimit=5
syncLimit=2
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889

上面的配置项中:

  • initLimit:当非leader节点(即follower和observer)启动时,需要先从leader那里复制数据,以保证所有ZooKeeper节点数据都是同步的。这个选项设置非leader节点从启动到完成同步的超时时长,它以tickTime为时间单位,所以上面的超时时长为5*2=10秒。

    一般来说,ZooKeeper保存的都是协调数据,数据量并不大,所以多数时候可以忽略这个参数,如果待同步数据真的很大,可以考虑增加这个超时时间。

  • syncLimit:follower和leader之间数据延迟的最大时间长度。例如,有个节点的更新操作缓慢,它的数据已经严重落后于leader,ZooKeeper就会将它从ZooKeeper集群中踢出去。ZooKeeper使用时间来度量follower和leader之间数据的延迟,这个选项的值依赖于tickTime,例如tickTime=2000,syncLimit=2表示follower比leader延迟了4秒。

  • server.X=[hostname]:port_A:port_B:该选项用来指定ZooKeeper集群中的服务器节点。其中:

    • X:整数。是ZooKeeper中服务器的一个简单标识。这个数值需要和dataDir下的myid文件内容一致。在启动ZooKeeper集群中的每个实例时,需要读取数据目录中的myid文件,并将该文件中的数值和配置文件中的server.X做匹配,匹配到哪个就表示是哪个ZooKeeper服务器节点。
    • hostname:ZooKeeper服务器节点的地址。
    • port_A:这是第一个端口,用于Follower和Leader之间的数据同步和其它通信。
    • port_B:这是第二个端口,用于Leader选举过程中投票通信。

所以,分别在每个实例的dataDir下创建对应的myid文件。

echo 1 >/usr/local/zookeeper/data1/myid
echo 2 >/usr/local/zookeeper/data2/myid
echo 3 >/usr/local/zookeeper/data3/myid

然后启动这3个ZooKeeper实例。

zkServer.sh start /usr/local/zookeeper/conf/zoo1.cfg
zkServer.sh start /usr/local/zookeeper/conf/zoo2.cfg
zkServer.sh start /usr/local/zookeeper/conf/zoo3.cfg

查看当前java进程列表:

[root@s1 zk]# jps -l
5473 org.apache.zookeeper.server.quorum.QuorumPeerMain
5395 org.apache.zookeeper.server.quorum.QuorumPeerMain
5427 org.apache.zookeeper.server.quorum.QuorumPeerMain
5524 sun.tools.jps.Jps

查看这3个实例之间的关系:zoo2.cfg被选为leader,其它是follower。

[root@s1 zk]# zkServer.sh status /usr/local/zookeeper/conf/zoo3.cfg
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/conf/zoo3.cfg
Mode: follower [root@s1 zk]# zkServer.sh status /usr/local/zookeeper/conf/zoo1.cfg
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/conf/zoo1.cfg
Mode: follower [root@s1 zk]# zkServer.sh status /usr/local/zookeeper/conf/zoo2.cfg
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/conf/zoo2.cfg
Mode: leader

可以用ZooKeeper提供的命令行客户端工具来测试,写入其中一个实例的数据,其它实例也能收到。

[root@s1 zk]# zkCli.sh -server localhost:2181 create /my_znode hello
......省略.........
WatchedEvent state:SyncConnected type:None path:null
Created /my_znode [root@s1 zk]# zkCli.sh -server localhost:2182 ls /
......省略........
WatchedEvent state:SyncConnected type:None path:null
[my_znode, zookeeper]

4.配置ZooKeeper集群

以3节点的集群为例:192.168.100.21、192.168.100.22、192.168.100.23。因为前面配置单机ZooKeeper和伪集群ZooKeeper已经解释过所有步骤和配置项的意义,所以这里就直接给步骤。

假设已经在3个节点上都安装好了jdk(这是前提),并下载好了ZooKeeper。

先解压zookeeper-3.4.12.tar.gz。

# 3个节点都执行
tar xf zookeeper-3.4.12.tar.gz
mv zookeeper-3.4.12 /usr/local/zookeeper

添加ZooKeeper环境变量,非必须过程,但建议。

# 在3节点上都执行
echo 'ZOOKEEPER_HOME=/usr/local/zookeeper' >/etc/profile.d/zk.sh
echo 'PATH=$ZOOKEEPER_HOME/bin:$PATH' >> /etc/profile.d/zk.sh
chmod +x /etc/profile.d/zk.sh
source /etc/profile.d/zk.sh

提供配置文件。以下是3个节点上的配置文件:

[root@s1 zk]# cat /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000
dataDir=/usr/local/zookeeper/data
clientPort=2181
initLimit=5
syncLimit=2
server.1=192.168.100.21:2888:3888
server.2=192.168.100.22:2888:3888
server.3=192.168.100.23:2888:3888

在三个节点上都创建好数据目录,并写入myid文件。

# 3个节点上都执行:
mkdir /usr/local/zookeeper/data # 192.168.100.21上执行
echo 1 >/usr/local/zookeeper/data/myid # 192.168.100.22上执行
echo 2 >/usr/local/zookeeper/data/myid # 192.168.100.23上执行
echo 3 >/usr/local/zookeeper/data/myid

启动这3个ZooKeeper实例。

# 3个节点都执行:
zkServer.sh start

然后在3个节点上都验证一下是否正确启动ZooKeeper。

# 节点1上执行:
[root@s1 zk]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower # 节点2上执行:
[root@s2 zk]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower # 节点3上执行:
[root@s3 zk]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader

如果某个服务器实例出现了错误,请zkServer.sh stop关闭ZooKeeper实例,然后jps命令查看下是否还有ZooKeeper实例在运行,如果有,kill掉。然后再启动ZooKeeper。另外,建议在第一次启动ZooKeeper之前,先将dataDir/version-2目录删除(如果已存在,因为可能是以前的实例因为各种原因而留下来的)。

最后测试下,某节点上创建一个znode,其它节点是否也同步了该节点。

# 在192.168.100.21上创建一个znode:
[root@s2 zk]# zkCli.sh -server 192.168.100.21:2181 create /test_znode "hello world"
Connecting to 192.168.100.21:2181
.........省略..........
Created /test_znode # 在192.168.100.22上获取这个znode
[root@s2 zk]# zkCli.sh -server 192.168.100.22:2181 get /test_znode
Connecting to 192.168.100.22:2181
.........省略..........
hello world
cZxid = 0x100000002
ctime = Wed Jun 27 08:14:38 CST 2018
mZxid = 0x100000002
mtime = Wed Jun 27 08:14:38 CST 2018
pZxid = 0x100000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 0 # 在192.168.100.23上获取这个znode
[root@s2 zk]# zkCli.sh -server 192.168.100.23:2181 ls /
Connecting to 192.168.100.23:2181
.........省略..........
[zookeeper, test_znode]

ZooKeeper系列(1):安装搭建ZooKeeper环境的更多相关文章

  1. Zookeeper 系列(三)Zookeeper API

    Zookeeper 系列(三)Zookeeper API 本节首先介绍 Zookeeper 的 Shell 命令,再对 Java 操作 Zookeeper 的三种方式进行讲解,本节先介绍 Zookee ...

  2. ZooKeeper 系列(二)—— Zookeeper单机环境和集群环境搭建

    一.单机环境搭建         1.1 下载         1.2 解压         1.3 配置环境变量         1.4 修改配置         1.5 启动         1. ...

  3. ZooKeeper系列(二)—— Zookeeper 单机环境和集群环境搭建

    一.单机环境搭建 1.1 下载 下载对应版本 Zookeeper,这里我下载的版本 3.4.14.官方下载地址:https://archive.apache.org/dist/zookeeper/ # ...

  4. CentOS安装搭建zookeeper

    原文连接:https://www.cnblogs.com/rwxwsblog/p/5806075.html zookeeper集群搭建(三台) 注意关闭机器防火墙! 配置ip别名:编辑文件  # /e ...

  5. ZooKeeper系列(5):管理分布式环境中的数据

    引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Zab协议.通信协议等相关知 识,理解起来比较抽象所以还需要借助一些应用场景,来帮我 ...

  6. win7下安装搭建PHP环境

    由于最近新找的工作要求php,所以在电脑上安装搭建了PHP环境.主要参考了这篇文章http://www.leapsoul.cn/?p=695(之前第一次搭建时由于版本问题没有弄好) 1.先装apach ...

  7. Docker 快速安装&搭建 Mysql 环境

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

  8. Docker 快速安装&搭建 MongDB 环境

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

  9. zookeeper系列(八)zookeeper客户端的底层详解

    作者:leesf    掌控之中,才会成功:掌控之外,注定失败.出处:http://www.cnblogs.com/leesf456/p/6098255.html 尊重原创,共同学习进步:  一.前言 ...

随机推荐

  1. 登陆页、注册页、会员中心页logo图的替换

                  关闭   PHP在线开发笔记       目录视图 摘要视图 订阅 异步赠书:9月重磅新书升级,本本经典           程序员9月书讯      每周荐书:ES6.虚 ...

  2. POJ1964-City Game

    给你N×M大的矩阵,里面分别有字符‘F'和’R',要找到一个最大的只有‘F'的矩阵,不能包含有’R‘.N,M<=1000. 一开始的思路是单调栈来求最大矩形面积,因为没看清题目不能包含’R'字符 ...

  3. 2018年2月19日我的java学习(——)

    在学完了类和对象的时候,开始对面向对象的思想有了一点认识,不过也不是完全的理解了. 就现在的学习状态来说,是非常的不错的,但是在学习的内容来说,我学的好像只是跟随这 站长的思路而已,也许是经验不足吧. ...

  4. HDFS基本架构及概念介绍

    简单介绍 l  设计思想 分而治之:将大文件.大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析: l  在大数据系统中作用: 为各类分布式运算框架(如:mapred ...

  5. spring 排除指定的类或者包扫描

    <!-- 排除Controller注解的扫描 --> <context:component-scan base-package="exampleBean"> ...

  6. 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法

    不知道你有没有遇到过这样的问题,网站访客多起来后,心里很是高兴,加上了Nginx反向代理,出问题了 原来是这么写的: Request.Url.ToString() 输出是这样的: http://www ...

  7. winform复制文件到指定目录

    执行步骤 弹出选择对话框:var openFileDialog = new OpenFileDialog(); 设置选择内容,如所有图片:openFileDialog.Filter="图像文 ...

  8. FFmpeg命令行工具学习(四):FFmpeg 采集设备

    在使用 FFmpeg 作为编码器时,可以使用FFmpeg采集本地的音视频采集设备的数据,然后进行编码.封装.传输等操作. 例如,我们可以采集摄像头的图像作为视频,采集麦克风的数据作为音频,然后对采集的 ...

  9. Maven 项目打包出现错误 Failed to execute goal org.apache.maven.plugins:maven-resources-plugin

    今天碰到一个奇怪的问题,就是我在eclipse中使用maven命令:clean package 命令打完包之后,通过FlashFXP将jar包上传到Linux服务器后,由于其他原因,我想要修改下程序重 ...

  10. 排除Transformation Errors

    当运行session时,会产生大量的Transformation Errors,这些Error会导致性能变慢 1 Transformation Errors导致性能降低的原因 当有大量记录有Trans ...