# zookeeper **Repository Path**: dlr-sfs_admin/zookeeper ## Basic Information - **Project Name**: zookeeper - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-08-04 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #############################zookeeper学习 1.基于观察者模式的分布式服务管理框架,将变化通知观察者(watch事件处理器) 2.特点: 2.1 一个领导者,多个随从 2.2 只要有半数以上节点存活,zk集群财政正常工作 2.3 全局数据一致,每台服务器保存相同的副本 2.4 对于同一个客户端所有请求按顺序执行 2.5 保持原子性,一次操作要么成功 要么失败 2.6 实时性,同步副本快,因为数据量比较小 3.数据机构 3.1 树形结构,每个节点中默认能存储1MB的数据,节点及数据通过路径唯一标识 4.应用场景: 统一命名服务(注册中心) 统一配置管理 统一集群管理 软负载均衡 分布式锁 分布式通知(基于watch监听) 5.单机安装: cd /usr/ mkdir tools cd tools mkdir zk 解压移动: tar -zxvf zookeeper-3.4.14.tar.gz -C /usr/tools/zk/ 改名: mv zookeeper-3.4.14/ zookeeper cd /usr/tools/zk/zookeeper/conf/ 下的配置文件zoo_sample.cfg修改为zoo.cfg mv zoo_sample.cfg zoo.cfg 修改数据存放路径: vi zoo.cfg dataDir=/tmp/zookeeper 改为dataDir=/usr/tools/zk/zookeeper/zkData 并且必须新建zkData文件夹:mkdir zkData 服务启动: /usr/tools/zk/zookeeper/bin/zkServer.sh start 停止:/zkServer.sh stop 启用状态: /usr/tools/zk/zookeeper/bin/zkServer.sh status 客户端连接:/usr/tools/zk/zookeeper/bin/zkCli.sh 退出:quit 5.1集群部署:将上边部署好的单机复制到另外两台即可(chmod -R 755 /usr/tools/ 授权) 配置服务器编号:必须在zkData下创建myid文件 touch myid vi myid 分别为:20 30 40 编辑各个配置文件:server.20必须与myid对应 默认的2888时集群服务器信息交互的端口,默认3888是leader挂了集群选举通讯的端口 server.20=192.168.10.20:2888:3888 server.30=192.168.10.30:2888:3888 server.40=192.168.10.40:2888:3888 ########注意如果上边配置ip请关闭防火墙或暴漏端口或者以主机名称访问 systemctl stop firewalld 命令行操作: 创建持久无序节点: create key "value" 查看 ls key 获取:get key 创建持久有序节点: create -s key "value" 查看 ls key 获取:get key 临时节点: create -e key "value" 6.配置文件解读 tickTime=2000 #心跳数默认2s initLimit=10 #通信时限默认10 tickTime * initLimit 集群时主从通信的最大延迟时间 超出时间就连不上了 syncLimit=5 #同步时限默认5 tickTime * syncLimit 集群已启动主从通信的最大延迟时间 超出时间就连不上了 dataDir=/usr/tools/zk/zookeeper/zkData #数据存储地址 clientPort=2181 #服务端口号供第三方调用使用的端口 7.内部原理: zk集群遵守半数机制,也就是半数以上节点存货,集群可用,所以要配置奇数集群 选举机制:没有名准主从,通过选举临时节点为主,其余为从 8.节点类型: 持久节点:客户端与服务端断开时,创建的节点不会删除 临时节点:客户端与服务端断开时,创建的节点会删除 节点形式:持久无序/有序 临时无序/有序 有序的作用:在分布式系统中,有序可以按照顺序号进行排序,就可以推断服务器上事件发生的先后顺序 9.监听模式 watch事件处理器:开启对节点的监听,该节点的增删改都会产生事件通知 原理:客户端连接zk服务器时,客户端同时创建俩个线程,一个线程保证与zk正常的业务通讯,另一个负责监听节点,zk服务器会把 业务线程要监听的节点添加到监听列表中,当节点发生变化时,通过监听线程通知一下客户端 10.写数据的流程 ![输入图片说明](https://images.gitee.com/uploads/images/2019/0806/233359_bbde26c9_5105108.png "1565105406.png") 11.java操作: 1.//得到zk服务端对象 ZooKeeper zooKeeper = new ZooKeeper(连接地址, session 会话时间, new Watcher(){ @Override public void process(WatchedEvent event) { } }); 2.创建节点 zooKeeper.create("/first", "node-a".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); ANYONE_ID_UNSAFE:谁都可以读 READ_ACL_UNSAFE:只读 OPEN_ACL_UNSAFE:开放的 CREATOR_ALL_ACL:应答模式 PERSISTENT 持久化节点 PERSISTENT_SEQUENTIAL 顺序自动编号持久化节点 EPHEMERAL 临时节点 EPHEMERAL_SEQUENTIAL 临时自动编号节点 12.分布式锁的实现 :https://github.com/songfushaung/zookeeper