这可能是搭建Zookeeper集群介绍最全的文章

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 这可能是搭建Zookeeper集群介绍最全的文章

点击上方“Java知音”,选择“置顶公众号”

技术文章第一时间送达!

作者:超级大丁丁
my.oschina.net/mHUMTSy9311/blog/2960544

my.oschina.net/mHUMTSy9311/blog/2960544

1.搭建

怎么搭建单机无安全校验的就不说了,百度一搜一大堆。这里我就说说怎么搭建一个生产环境可用的Zookeeper集群

Zookeeper 3.4.13下载地址

http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz

Docker方式不太建议,要考虑的东西比较多,如果要用Docker方式还是比较建议自建镜像,假如是Docker专家可以忽略本句。

以下介绍的都是Linux服务器下搭建(Winserver服务器的也是雷同)先操作单机,再copy到其他机器。下载完Zookeeper(下称zk)后,进入zk解压目录下的conf文件夹,zoo_sample.cfg是zk的配置文件实例,Copy一个出来命名为zoo.cfg zk默认会读这个配置。

配置详解:

  • tickTime :心跳发送的间隔时间,用于判定Client是否断开(默认2000ms)
  • dataDir :zk数据文件保存目录,zk是基于文件来存储配置的
  • clientPort :这个端口就是客户端连接 zk 服务器的端口,zk 会监听这个端口,接受客户端的访问请求。
  • initLimit:初始化Client时的重试次数(默认5次),判断Client是否连接成功就是发initLimit次心跳,每tickTime发一次,如果都失败了代表这个Client连接失败了 syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒

  • server.n = ip:port:electPort: n代表每个实例的序号,ip是实例的ip地址,port是实例间交互的端口,electPort是重新选举Leader时的端口 (集群方式才用到, 单机可以注释这个配置,之前问过大神,大神表示zk搭建至少3个实例比较稳当,这个与它自身的选举机制有关)
  • maxClientCnxns: 最大Client连接数,业务需求并发大,机器比较强劲的就设置大点咯(默认60)
  • autopurge.snapRetainCount:自动清理snapshot和事务日志时保留的文件数(默认3个)
  • autopurge.purgeInterval: 清理频率(单位小时, 默认是0代表不开启,大于0代表开启`)
  • 如需使用Hosts请在每个实例所在的机器设置Hosts(/etc/hosts) 如:zk1 127.0.0.1

    下面贴一下我的简单配置:

    
    # The number of milliseconds of each tick
    tickTime=2000
    # The number of ticks that the initial 
    # synchronization phase can take
    initLimit=10
    # The number of ticks that can pass between 
    # sending a request and getting an acknowledgement
    syncLimit=5
    # the directory where the snapshot is stored.
    # do not use /tmp for storage, /tmp here is just 
    # example sakes.
    dataDir=/data/zookeeper/data
    # the port at which the clients will connect
    clientPort=2181
    
    server.1=zk1:2888:3888
    server.2=zk2:2888:3888
    server.3=zk2:2888:3888
    

    2. 启动

    zk的脚本都放在zk/bin 目录下

    zkServer.sh 服务操作脚本(只介绍常用命令)

    
    # 后台启动
    ./zkServer.sh start
    
    # 前台启动
    ./zkServer.sh start-foreground
    
    # 停止
    ./zkServer.sh stop
    
    # 重启
    ./zkServer.sh restart
    
    # 查看状态 (其中 Mode代表是Leader节点还是Follow节点)
    ./zkServer.sh status
    

    zkCli.sh 是zk的客户端,默认连接本机实例,可以通过进入ZkCli后执行ZooKeeper -server host:port cmd args去操作其他远程实例

    
    # 进入zk客户端命令行操作
    ./zkCli.sh
    

    列举下一些常用命令(其他命令可以)

    
    # 查看根目录下节点
    ls /path
    get /path
    # 查看节点状态/属性
    stat /path
    # 删除节点
    rmr /path
    # 删除节点下数据
    delete /path [version]
    

    3. 权限验证

    zk的权限验证有3种方式,这里只介绍比较常用的两种方式(先搭建好集群,权限设置会同步到整个集群):

    第一步:新建节点 (如果给已有节点添加权限可忽略)

    
    create /path "test" #创建节点和别名
    

    1.通过IP限制

    
    #进入zkCli后的权限验证设置命令 后面会介绍permission参数
    setAcl /path ip:192.168.1.1:[permissions]
    #也可以是ip段
    setAcl /path ip:192.168.0.0/16:[permissions]
    #验证 本机校验是通过的。可以用另一个ip段的来验证
    ls /path
    

    2.通过用户+密码控制

    这种方式的密码是BASE64(SHA1(原文密码))出来的密文,怎样生成保证成功的密文呢

    
    #通过这个类计算出密文(对应的版本可以从zk/lib目录下看到)
    java -cp ./zookeeper-3.4.13.jar:./lib/log4j-1.2.17.jar:./lib/slf4j-log4j12-1.7.25.jar:./lib/slf4j-api-1.7.25.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider test:123456
    
    
    #test是用户名 password是密码BASE64(SHA1(原文密码))
    setAcl /path digest:test:password:[permission]
    
    
    # 校验是否成功,现在肯定是成功的,但是重新进入zkCli就会失败了
    ls /path
    
    #进入zkCli执行addAuth命令,这是类似登录的功能 test是用户名,123456是刚刚的原文
    addauth digest test:123456
    
    #然后再执行 ls命令 这时候就成功
    ls /path
    

    permission介绍

    permission是用cdrwa来表示 如:

    
    setAcl /path digest:test:password:cdw
    

    每个字母分别代表的是:

  • CREATE(c): 创建权限,可以在在当前node下创建child node
  • DELETE(d): 删除权限,可以删除当前的node
  • READ(r): 读权限,可以获取当前node的数据,可以list当前node所有的child nodes
  • WRITE(w): 写权限,可以向当前node写数据
  • ADMIN(a): 管理权限,可以设置当前node的permission
  • 4.总结

    网上很多类似的文章,不过我觉得太分散了,当要搭建一个zk集群时需要找几篇文章来看,现在就是将搭建+集群+校验放在一起介绍,一篇文章可以直接上生产了。

    加入Java知音技术交流,戳这里:

    更多Java技术文章,尽在【Java知音】网站。

    网址:www.javazhiyin.com  ,搜索Java知音可达!

    看完本文有收获?请转发分享给更多人

    这可能是搭建Zookeeper集群介绍最全的文章

    原文始发于微信公众号(Java知音):

    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    转载声明:转载请注明出处,本技术博客是本人原创文章

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> 这可能是搭建Zookeeper集群介绍最全的文章


     上一篇
    手把手教你实现一个基于Redis的分布式锁 手把手教你实现一个基于Redis的分布式锁
    作者:王天一链接:https://www.wangtianyi.top 链接:https://www.wangtianyi.top 简介分布式锁在分布式系统中非常常见,比如对公共资源进行操作,如卖车票,同一时刻只能有一个节点将某个特
    2021-04-05
    下一篇 
    为什么我们做分布式使用Redis? 为什么我们做分布式使用Redis?
    点击上方“Java知音”,选择“置顶公众号” 技术文章第一时间送达! 作者:姚登晏 www.cnblogs.com/yaodengyan/ www.cnblogs.com/yaodengyan/ 绝大部分写业务的程序员,在实际开发中使用
    2021-04-05