Zookeeper<br />1. zookeeper是如何解决分布式问题:作为分布式系统的协调工作者<br /> <br />2. 那么又是如何作为协调工作者实现协调工作的:让每个节点的信息同步和共享<br /> <br />3. 那么又是怎么实现同步和共享的:共享存储<br /> <br />4. zk是将数据保存在内存中<br /> <br /><br />Zookeeper集群搭建成功之后数据就实现了同步功能。<br /> <br />5.zookeeper有三个角色:leader/follower/observer<br /> Leader:由所有机器共同选举出leader(observe节点除外):能够进行读写<br /> Follow:负责读和选举<br /> Observe:负责读,不参与写过半成功策略:好处就是不影响写的前提下提升集群的性能<br /> <br />注意:为什么要引入observe这个 角色:<br /> 1.集群中follower节点过多,在进行投票过半机制ack中,性能会被影响,所以引入observe角色<br /> <br />6.Zk集群流程讲解:<br /><br /> 写请求:<br />1. 客户端发送写请求:如果是follower或者observe节点,则转发给leader,如果直接是leader则直接转发给每个follower和observe节点,follower节点写成功之后会发送一条成功的消息,只要follower节点过半发送了成功消息则认为写请求成功。<br />2. 最后由第一次接收写请求的节点通知客户端写请求成功<br /> <br /> 读请求:随便一个节点都可以读<br /> <br />注意:这里的客户端和服务端的连接是长连接:<br />1. 该连接可接收服务端的watch通知<br />2. 服务端对客户端进行心跳检测,实现有效会话<br /> <br /> <br />7.zk的数据节点:<br />1. 临时节点<br />2. 临时有序节点<br />3. 永久节点<br />4. 永久有序节点<br /> <br />节点信息展示:<br /><br />注意:1.临时节点随着客户端会话的关闭二结束且不可创建子节点<br /> 2.顺序节点在创建的时候在末尾都会自动添加一个数字后缀<br />3.zk在每个节点都维护了一个stat的数据结构,<br />主要报含三点信息:1.当前节点的版本<br /> 2.当前子节点的版本<br /> 3.当前节点的acl版本<br /> <br /> <br />ACL权限的控制:保证数据的安全<br /> ACL机制组成:权限模式,授权对象(id),权限<br />理解:大白话就是采用什么权限的模式给谁授予什么权限<br /> <br />权限模式:主要是校验用户的角色,只有对应角色才做操纵节点数据<br />1. ip:对ip进行控制<br />2. 用户名密码:zk会对我们的用户名密码先进行sha-1加密再进行base64编码<br />3. World:对所有用户开放权限<br />4. Super:超级管理员,对节点做任意操作<br /> <br />授权对象id:不同的权限模式对应的授权对象不同<br /><br /> <br />权限:<br /> create:可创子节点<br /> Delete:可删子节点<br /> Read:可访问当前节点数据以及子节点列表和数据<br /> Write:可更新当前节点数据<br /> Admin: 可设置当前节点的acl机制的设置 <br /> <br />8.watcher监听事件:使用一次之后就失效需要重新注册监听事件:实现数据的发布/订阅<br /> <br />Watcher监听流程:<br /><br />1.客户端向服务端注册(操作数据保存/更新),将watcher对象存储在客户端的watcherManager中,当zk服务器数据发生变化,则通知客户端,客户端会从watchermanager中提取对应的watcher对象来实现回调逻辑<br /> <br />9. Zk的事务:指更新操作(增删改):使用64位数字标识:zxid //数字有大小表示执行顺序<br /> <br />10. Zk的命令行操作:首先需要使用到bin目录下连接服务:<br />1. 连接本地服务:./zkCli.sh<br />2. 连接远程服务:./zkCli.sh -server ip:port<br /><br />1. 创建节点:create -s -e path data acl<br /> -s:标识顺序节点<br /> -e:标识临时节点<br />注意:什么都不加则默认是持久节点<br /> <br />2. 删除节点:delete path<br />3. 读取节点:ls2/get命令:ls2/get path<br /><br />4.更新节点数据:set path data<br /> <br /> <br />zookeeper单机安装步骤:<br /> 1.在线下载安装包:wget [http://archive.apache.org/dist/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz](http://archive.apache.org/dist/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz)<br />2.解压安装包:tar -zxf zookeeper-3.4.12.tar.gz (如果想解压到指定目录:-C 目录)<br />3.进入zk的解压目录,创建data和datalog目录:mkdir data/datalog:用来存放快照文件以及日志信息<br />4.配置zk(进入到conf目录下):zk默认读取的配置文件名:zoo.cfg<br /> 1.将配置文件zoo_example.cfg复制并命名为zoo.cfg:cp -i zoo_example.cfg zoo.cfg<br /> 2.修改快照及日志信息存放的路径:<br /> <br />5. 启动zk服务:进入到bin目录:./zkServer.sh start<br />6. 检测服务(bin目录下):./zkserver.sh status<br /><br /> <br /> <br />Zk集群的搭建:<br />1. 在data文件夹下面创建一个文件:myid:作用就是记录服务器的id<br /><br />2. 在每个集群节点的zoo.cfg配置文件中配置集群服务器ip列表<br /><br />规则:server.id=服务器ip地址:服务通信端口(2181是客户端端口,使用任意其他端口):服务器之间选举端口<br />3.检测:启动节点各个服务:./zkServer.sh start 然后使用命令查看状态:./zkServer.sh status<br /><br /> <br />注意:当我们启动成功后检查状态时,如果状态不是成功的,那么说明并没有成功启动<br />1. 进入bin目录下检查zookeeper.out日志文件<br /> <br /> <br />11. Zk在项目中的api的使用:<br /><br />创建连接的流程:<br />1. 客户端创建实例取得连接<br />2. 服务端为此次连接分配id<br />3. 客户端不断发送心跳机制保持会话<br /> <br />项目实战:<br />1. 导入依赖包:<br />2. 创建连接的类:连接过程是异步的,连接时直接返回,保持在connecting状态<br /><br />问题:什么时候才算真正意义上会话的连接成功:成功时服务端会向客户端发送一个事件通知(这个事件就是SyncConnected),并由watcher接口里面的process处理(如上图)<br />3.使用连接类进行节点的操作:节点的创建有同步和异步两种方式创建<br /> 1.同步方式创建节点:创建也需要时间<br /><br /> 2.获取节点数据<br /> <br /> 3.获取子节点列表<br /><br />注意:zookeeper类中常用api讲解:<br />1. zk.getState():获取连接的状态<br />2. zk.create(path,data,acl,createMode):创建节点<br />//data:byte类型<br />acl的值:常用第三个<br /><br />createMode的值:<br /><br />3. zk.getData(path,watch,stat):获取节点数据<br />4. <br /> <br />**zookeeper的使用场景:**<br />1. 数据的发布/订阅:采用推(push)和拉(pull)相结合实现配置信息的动态管理:作为配置中心使用<br />解释:发布/订阅系统一般分为两种模式:push和pull<br /> push:服务端主动<br /> pull:客户端主动:一般采用定时轮询<br /> <br />Zk的推拉结合流程:<br />1. 客户端注册关注节点<br />2. 服务端数据一旦发生变化,就向客户端发送watcher事件通知<br />3. 客户端主动到服务端拉取最新数据<br /> <br />案例:动态切换数据源<br />1. 选择一个节点存储数据源信息的配置文件:<br /><br />解释:类似这样的一个配置,我们如何实现存储:<br />2. 客户端在该节点上注册一个watcher监听事件,当有变化则通知客户端切换数据源<br /> <br /> <br /> <br /> <br /> 2.命名服务:其实就是生成全局唯一id: 利用有序节点自动添加一串数字特性<br /><br /> <br /> <br />1. zookeeper提供了服务端和客户端,客户端对服务端节点有监听功能,每当节点数据变化会主动通知客户端有变换,重新读取。<br /><br /> <br />2. 操作命令<br /><br />Set /node xxx<br />Get /node xxx<br /><br />Stat /node 只获取属性<br />Delete/node xxx<br />Rmr /node:删除当前节点及其子节点<br /> <br />查询节点列表:<br /><br /> <br />有序节点的作用:为分布式环境创建唯一的id<br />临时节点的作用:创建分布式锁id<br /> <br />监听器的讲解:一个监听只能捕获一次事件<br /><br /> <br />Acl权限控制:<br /> <br />3. 代码讲解:实现分布式配置中心:多台机器的配置文件的统一管理与配置修改<br />1. 导入jar包;<br /><br />2.<br /><br />Zookeeper.getData(path,true,state):获取数据并实现一次性监听<br /> <br /><br /> <br /><br /><br /><br /> <br /><br /> <br /><br /><br /><br /> <br /><br /> <br /><br /> <br /><br /><br /> <br /><br /> <br /><br /> <br /> <br />zookeeper的watchwer机制:事件监听机制:<br />1. 监听流程:<br /><br />2.<br /><br /> <br /><br /><br /> <br /><br /> <br />2.生成全局唯一id:创建临时有序节点,使用这个序列号作为id。<br /> 1.在构造方法中初始化的时候创建连接:<br /><br />2. 创建id:<br /><br /> <br />3.<br /> <br />分布式锁的实现:<br /> <br />1. 代码整体展现:<br /><br />2. 构造方法创建连接<br /><br /> <br />4. Zookeeper实现集群管理的原理:是否有机器退出和加入,进行master的选举<br />5. <br />6. <br />
