原文链接: http://gudaoyufu.com/?p=1395

zookeeper工作方式

ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现。 分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协 调/通知、集群管理、Master 选举、分布式锁和分布式队列 等功能。

在使用中,通常以集群的方式部署,Zookeeper节点部署越多,服务的可靠性越高,建议部署奇数个节点,因为zookeeper集群是以宕机个数过半才会让整个集群宕机的,集群节点数为奇数最佳。

zookeeper也可以以单实例或伪集群的方式运行,只不过这种方式不适用高并发的环境。下面记录一下部署zookeeper的过程,包括单实例和伪集群,分布式集群的部署。

安装JDK

zookeeper是由JAVA开发,运行需要有JAVA环境,安装前先安装JDK。

JDK下载:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

下载完成后直接yum安装即可

单机实例部署

  • 下载

各版本可以在官方网站下载 : https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/

这里下载的版本是 3.4.12

  • 解压至指定路径
  1. [root@zookeeper ~]# tar zxf zookeeper-3.4.12.tar.gz -C /data/
  • 修改解压目录名称,做伪集群或分布式集群最好将目录标明白,容易看清
  1. [root@zookeeper ~]# mv /data/zookeeper-3.4.12/ /data/zookeeper1
  • 修改配置文件
  1. [root@zookeeper ~]# cd /data/zookeeper1/conf/
  2. [root@zookeeper conf]# mv zoo_sample.cfg zoo.cfg
  • 单机实例部署配置如下
  1. [root@zookeeper conf]# vim zoo.cfg
  2. tickTime=2000 #2000毫秒=2秒
  3. initLimit=10
  4. syncLimit=5
  5. dataDir=/opt/zookeeper/datadir
  6. dataLogDir=/opt/zookeeper/logdir
  7. clientPort=2181
  • 创建数据目录
  1. [root@zookeeper conf]# mkdir -pv /opt/zookeeper/{datadir,logdata}
  2. mkdir: 已创建目录 "/opt/zookeeper"
  3. mkdir: 已创建目录 "/opt/zookeeper/datadir"
  4. mkdir: 已创建目录 "/opt/zookeeper/logdata"

配置参数说明

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

    initLimit : 配置项是用来配置zookeeper接受客户端(这里所说的客户端不是用户连接zookeeper服务器的客户端,而是zookeeper服务器集群中连接到leader的follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过10个心跳的时间(也就是tickTime)长度后 zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10
    2000=20秒。

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

    • dataDir :是zookeeper保存数据的目录,默认情况下如果不定义dataLogDir,zookeeper将写数据的日志文件也保存在这个目录里,最好分开定义
  • clientPort : 客户端连接Zookeeper服务器的端口,Zookeeper会监听这个端口接受客户端的访问请求;

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

  • 启动zookeeper

  1. [root@zookeeper ~]# /data/zookeeper1/bin/zkServer.sh start
  2. ZooKeeper JMX enabled by default
  3. Using config: /data/zookeeper1/bin/../conf/zoo.cfg
  4. Starting zookeeper ... STARTED
  • 查看状态
  1. [root@zookeeper ~]# /data/zookeeper1/bin/zkServer.sh status
  2. ZooKeeper JMX enabled by default
  3. Using config: /data/zookeeper1/bin/../conf/zoo.cfg
  4. Mode: standalone #单机模式
  • 查看端口 2181已经启动

zookeeper指令

zookeeper启动后,可以先连接测试是否正常

  1. [root@zookeeper ~]# cd /data/zookeeper1/bin/
  2. [root@zookeeper bin]# ./zkCli.sh -server 127.0.0.1
  3. WATCHER::
  4. WatchedEvent state:SyncConnected type:None path:null
  5. [zk: 127.0.0.1(CONNECTED) 0] #登录成功

zookeeper启动后会在当前用户的家目录生成状态日志zookeeper.out,平时服务状态出现问题可以从里面找到问题所在

连接上zk后,随意输入一个字符,通常是?号,会给出zookeeper的指令帮助

  1. [zk: 127.0.0.1(CONNECTED) 0] ?
  2. ZooKeeper -server host:port cmd args
  3. stat path [watch]
  4. set path data [version]
  5. ls path [watch] #查看节点
  6. delquota [-n|-b] path
  7. ls2 path [watch]
  8. setAcl path acl
  9. setquota -n|-b val path
  10. history
  11. redo cmdno
  12. printwatches on|off
  13. delete path [version]
  14. sync path
  15. listquota path
  16. rmr path
  17. get path [watch]
  18. create [-s] [-e] path data acl #创建节点
  19. addauth scheme auth
  20. quit
  21. getAcl path
  22. close
  23. connect host:port #连接指令
  • 创建节点
  1. [zk: 127.0.0.1(CONNECTED) 1] create /test "test"
  2. Created /test
  3. [zk: 127.0.0.1(CONNECTED) 2] ls /
  4. [zookeeper, test]
  • 获取节点内容
  1. [zk: 127.0.0.1(CONNECTED) 3] get /test
  2. test
  3. cZxid = 0x8 :该节点是由哪个事务ID产生
  4. ctime = Sat Sep 01 21:41:06 CST 2018
  5. mZxid = 0x8 :最近更新了该节点的事务ID
  6. mtime = Sat Sep 01 21:41:06 CST 2018
  7. pZxid = 0x8 :该节点的子节点列表被修改的事务ID
  8. cversion = 0 :子节点版本号
  9. dataVersion = 0 数据版本号
  10. aclVersion = 0 ACL版本号
  11. ephemeralOwner = 0x0
  12. dataLength = 4 数据长度
  13. numChildren = 0 子节点个数

乐观并发访问控制和悲观并发访问控制 —延伸

  • 更新节点
  1. [zk: 127.0.0.1(CONNECTED) 4] set /test "test path"
  • 删除节点
  1. [zk: 127.0.0.1(CONNECTED) 6] delete /test
  2. [zk: 127.0.0.1(CONNECTED) 7] ls /test
  3. Node does not exist: /test
  4. #如果删除有子目录的节点,使用rmr指令

临时节点不能有子节点

ookeeper四字命令

使用telnet可以连接zookeeper发送4个字符的命令。

  1. [root@zookeeper bin]# telnet 127.0.0.1 2181
  2. Trying 127.0.0.1...
  3. Connected to 127.0.0.1.
  4. Escape character is '^]'.
  5. ruok #探测是否存活
  6. imokConnection closed by foreign host.
  1. [root@zookeeper bin]# telnet 127.0.0.1 2181
  2. Trying 127.0.0.1...
  3. Connected to 127.0.0.1.
  4. Escape character is '^]'.
  5. stat #查看zk版本信息
  6. Zookeeper version: 3.4.12-e5259e437540f349646870ea94dc2658c4e44b3b, built on 03/27/2018 03:55 GMT
  7. Clients:
  8. /127.0.0.1:52636[0](queued=0,recved=1,sent=0)
  9. Latency min/avg/max: 0/2/308
  10. Received: 248
  11. Sent: 247
  12. Connections: 1
  13. Outstanding: 0
  14. Zxid: 0xc
  15. Mode: standalone
  16. Node count: 5
  17. Connection closed by foreign host.
  1. [root@zookeeper bin]# telnet 127.0.0.1 2181
  2. Trying 127.0.0.1...
  3. Connected to 127.0.0.1.
  4. Escape character is '^]'.
  5. conf #查看节点配置信息
  6. clientPort=2181
  7. dataDir=/opt/zookeeper/datadir/version-2
  8. dataLogDir=/opt/zookeeper/logdir/version-2
  9. tickTime=2000
  10. maxClientCnxns=60
  11. minSessionTimeout=4000
  12. maxSessionTimeout=40000
  13. serverId=0
  14. Connection closed by foreign host.

zookeeper伪集群部署

zookeeper伪集群是部署在一台服务器上,通过创建多个工作目录配置项等,实现多实例的运行

在上面的基础上,再添加两个实例

  • 将原来/data/zookeeper1目录复制
  1. [root@zookeeper ~]# cp -ar /data/zookeeper1/ /data/zookeeper2
  2. [root@zookeeper ~]# cp -ar /data/zookeeper1/ /data/zookeeper3
  3. [root@zookeeper ~]# ls /data/
  4. zookeeper1 zookeeper2 zookeeper3
  • 修改zookeeper1配置文件
  1. [root@zookeeper ~]# vim /data/zookeeper1/conf/zoo.cfg
  2. dataDir=/opt/zookeeper/datadir #各伪节点目录不能相同
  3. dataLogDir=/opt/zookeeper/logdir
  4. clientPort=2181 #各伪节点端口不能相同
  5. #下面的节点定义各伪节点要相同
  6. server.1=192.168.214.171:2888:3888
  7. server.2=192.168.214.171:2889:3889
  8. server.3=192.168.214.171:2890:3890
  • 修改zookeeper2配置文件
  1. [root@zookeeper ~]# vim /data/zookeeper2/conf/zoo.cfg
  2. dataDir=/opt/zookeeper2/datadir
  3. dataLogDir=/opt/zookeeper2/logdir
  4. clientPort=2182
  5. server.1=192.168.214.171:2888:3888
  6. server.2=192.168.214.171:2889:3889
  7. server.3=192.168.214.171:2890:3890
  • 修改zookeeper3配置文件
  1. dataDir=/opt/zookeeper3/datadir
  2. dataLogDir=/opt/zookeeper3/logdir
  3. clientPort=2183
  4. server.1=192.168.214.171:2888:3888
  5. server.2=192.168.214.171:2889:3889
  6. server.3=192.168.214.171:2890:3890
  • 创建数据存放目录
  1. [root@zookeeper ~]# mkdir -pv /opt/zookeeper{2,3}/{datadir,logdir}
  2. mkdir: 已创建目录 "/opt/zookeeper2"
  3. mkdir: 已创建目录 "/opt/zookeeper2/datadir"
  4. mkdir: 已创建目录 "/opt/zookeeper2/logdir"
  5. mkdir: 已创建目录 "/opt/zookeeper3"
  6. mkdir: 已创建目录 "/opt/zookeeper3/datadir"
  7. mkdir: 已创建目录 "/opt/zookeeper3/logdir"
  • 为每个节点设置节点ID号
  1. [root@zookeeper ~]# echo 1 > /opt/zookeeper/datadir/myid
  2. [root@zookeeper ~]# echo 2 > /opt/zookeeper2/datadir/myid
  3. [root@zookeeper ~]# echo 3 > /opt/zookeeper3/datadir/myid
  4. [root@zookeeper ~]# cat /opt/zookeeper/datadir/
  5. myid version-2/
  6. [root@zookeeper ~]# cat /opt/zookeeper/datadir/myid
  7. 1
  8. [root@zookeeper ~]# cat /opt/zookeeper2/datadir/myid
  9. 2
  10. [root@zookeeper ~]# cat /opt/zookeeper3/datadir/myid
  11. 3
  • 启动集群
  1. [root@zookeeper ~]# /data/zookeeper1/bin/zkServer.sh start
  2. ZooKeeper JMX enabled by default
  3. Using config: /data/zookeeper1/bin/../conf/zoo.cfg
  4. Starting zookeeper ... STARTED
  5. [root@zookeeper ~]# /data/zookeeper2/bin/zkServer.sh start
  6. ZooKeeper JMX enabled by default
  7. Using config: /data/zookeeper2/bin/../conf/zoo.cfg
  8. Starting zookeeper ... STARTED
  9. [root@zookeeper ~]# /data/zookeeper3/bin/zkServer.sh start
  10. ZooKeeper JMX enabled by default
  11. Using config: /data/zookeeper3/bin/../conf/zoo.cfg
  12. Starting zookeeper ... STARTED
  • 查看状态
  1. [root@zookeeper ~]# /data/zookeeper1/bin/zkServer.sh status
  2. ZooKeeper JMX enabled by default
  3. Using config: /data/zookeeper1/bin/../conf/zoo.cfg
  4. Mode: leader
  5. [root@zookeeper ~]# /data/zookeeper2/bin/zkServer.sh status
  6. ZooKeeper JMX enabled by default
  7. Using config: /data/zookeeper2/bin/../conf/zoo.cfg
  8. Mode: follower
  9. [root@zookeeper ~]# /data/zookeeper3/bin/zkServer.sh status
  10. ZooKeeper JMX enabled by default
  11. Using config: /data/zookeeper3/bin/../conf/zoo.cfg
  12. Mode: follower
  • 测试master切换

关闭leader节点

  1. [root@zookeeper ~]# /data/zookeeper1/bin/zkServer.sh stop
  2. ZooKeeper JMX enabled by default
  3. Using config: /data/zookeeper1/bin/../conf/zoo.cfg
  4. Stopping zookeeper ... STOPPED
  5. #zookeeper2节点立即变成了leader
  6. [root@zookeeper ~]# /data/zookeeper2/bin/zkServer.sh status
  7. ZooKeeper JMX enabled by default
  8. Using config: /data/zookeeper2/bin/../conf/zoo.cfg
  9. Mode: leader
  • 再启动zookeeper1节点,会以follower角色工作
  1. [root@zookeeper ~]# /data/zookeeper1/bin/zkServer.sh start
  2. ZooKeeper JMX enabled by default
  3. Using config: /data/zookeeper1/bin/../conf/zoo.cfg
  4. Starting zookeeper ... STARTED
  5. [root@zookeeper ~]# /data/zookeeper1/bin/zkServer.sh status
  6. ZooKeeper JMX enabled by default
  7. Using config: /data/zookeeper1/bin/../conf/zoo.cfg
  8. Mode: follower

关于zookeeper的单机模式和伪集群就写到这,分布式集群部署点击阅读

zookeeper的单实例和伪集群部署的更多相关文章

  1. zookeeper在windows下的伪集群模式

    参考:zookeeper在windows下的伪集群模式 踩到的坑: 注意windows下路径需要使用\ dataDir=D:\Program Files\Java\zookeeper-3.4.10-c ...

  2. nacos配置本地多个实例(伪集群)

    在本地配置多个nacos实例(伪集群),一般就是配置多个nacos端口,并启动多个startup.sh脚本.网上一些博客通过修改startup.sh脚本来指定不同nacos端口,比如:./startu ...

  3. Dubbo入门实例 本地伪集群测试Demo

    1.   概述 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案 Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提 ...

  4. zookeeper安装和配置(单机+伪集群+集群)

    #单机模式 解压到合适目录. 进入zookeeper目录下的conf子目录, 复制zoo_sample.cfg-->zoo.cfg(如果没有data和logs就新建):tickTime=2000 ...

  5. zookeeper同一台服务器创建伪集群

    下载zk wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7 ...

  6. Kafka入门初探+伪集群部署

    Kafka是目前非常流行的消息队列中间件,常用于做普通的消息队列.网站的活性数据分析(PV.流量.点击量等).日志的搜集(对接大数据存储引擎做离线分析). 全部内容来自网络,可信度有待考证!如有问题, ...

  7. ActiveMQ伪集群部署

    本文借鉴http://www.cnblogs.com/guozhen/p/5984915.html,在此基础上进行了完善,使之成为一个完整版的伪分布式部署说明,在此记录一下! 一.本文目的 介绍如何在 ...

  8. zk伪集群部署

    jdk 配置 # tar xf jdk-8u161-linux-x64.tar.gz -C /usr/local/ # vim /etc/profile.d/jdk.sh export JAVA_HO ...

  9. 【实验级】Docker-Compose搭建单服务器ELK伪集群

    本文说明 由于最近在搭ELK的日志系统,为了演示方案搭了个单台服务器的日志系统,就是前一篇文章中所记,其实这些笔记已经整理好久了,一直在解决各种问题就没有发出来.在演示过程中我提到了两个方案,其中之一 ...

随机推荐

  1. sqlserver 学习之分离与附加数据库

    在学习sqlserver数据库的过程中,我们会学习到有关一些听起来比较陌生的专用名词,比如说分离与附加这两个专有名词,对于我来说就是比较陌生的.好的,下面我们一起来学习一下吧.为了讲的通俗一点,下面以 ...

  2. SpringBoot+Maven多模块项目(创建、依赖、打包可执行jar包部署测试)完整流程

    一,创建Maven多模块项目先建立外层父工程         File →new →project  选择Spring Initializr          Next下一步到以下页面 工程结构如下 ...

  3. macos 远程 windows 10

    使用的工具:Parallels Client 免费,可以从windows store 免费下载: 只有这个最好用,希望能帮到你.和原生的windows 远程桌面功能很像:

  4. Cs231n-assignment 2作业笔记

    assignment 2 assignment2讲解参见: https://blog.csdn.net/BigDataDigest/article/details/79286510 http://ww ...

  5. 《生命》第五集:Birds (鸟类)

    看了前四集之后意犹未尽,今天终于有时间来看第五集了. 本集讲的是鸟类,一个在恐龙开始繁荣的时代才开始有的物种. 鸟类和其他动物最不同的地方,就是羽毛,能隔热,保暖,最重要的是:能帮助他们飞行. 在秘鲁 ...

  6. Springboot整合Ehcache缓存

    Pom.xml导包 <!-- ehcache --> <dependency> <groupId>org.springframework.boot</grou ...

  7. Redis操作hash

    来自:http://www.cnblogs.com/alex3714/articles/6217453.html Hash操作 hash表现形式上有些像pyhton中的dict,可以存储一组关联性较强 ...

  8. Koa 框架介绍

    Node.js 是一个异步的世界,官方 API 支持的都是 callback 形式的异步编程模型,这 会带来许多问题,例如:callback 嵌套问题 ,异步函数中可能同步调用 callback 返回 ...

  9. 001_python多进程实例

    一.工作中需要执行zk数据对比,需要按照机器进行并发,举例以下的例子 # coding:utf8 # !/usr/bin/python import time from multiprocessing ...

  10. Arduino 串口测试 电脑发数据接收后立马返回

    String comdata = ""; void setup() { Serial.begin(9600); while(Serial.read()>= 0){} //cl ...