1. Zookeeper<br />1. zookeeper是如何解决分布式问题:作为分布式系统的协调工作者<br /> <br />2. 那么又是如何作为协调工作者实现协调工作的:让每个节点的信息同步和共享<br /> <br />3. 那么又是怎么实现同步和共享的:共享存储<br /> <br />4. zk是将数据保存在内存中<br /> <br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615078966-90607f36-23b5-47a1-8ca5-0d9c89fc472d.png#height=131&width=415)<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 />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615079177-308484aa-9e60-4d3d-b5c3-c720c317a16e.png#height=227&width=415)<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 />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615079407-346abf1b-fd27-458e-b599-50bf19df1d7c.png#height=134&width=415)<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 />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615079628-9e1070aa-06d7-4a44-a661-2ee4ecab36bf.png#height=88&width=415)<br /> <br />权限:<br /> create:可创子节点<br /> Delete:可删子节点<br /> Read:可访问当前节点数据以及子节点列表和数据<br /> Write:可更新当前节点数据<br /> Admin: 可设置当前节点的acl机制的设置 <br /> <br />8.watcher监听事件:使用一次之后就失效需要重新注册监听事件:实现数据的发布/订阅<br /> <br />Watcher监听流程:<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615079868-8eae8d5d-8f04-4107-b718-f081976093d9.png#height=208&width=414)<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 />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615080129-6f58b6af-044f-4ece-a300-bff7a6a5470d.png#height=169&width=414)<br />1. 创建节点:create -s -e path data acl<br /> -s:标识顺序节点<br /> -e:标识临时节点<br />注意:什么都不加则默认是持久节点<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615080376-362e38a5-7988-4a54-b9f6-0b21f7312de7.png#height=63&width=414) <br />2. 删除节点:delete path<br />3. 读取节点:ls2/get命令:ls2/get path<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615080646-fc72896d-acdd-45d1-916f-f4f628f4f54d.png#height=281&width=415)<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 />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615081043-d68f5f44-91ee-480a-b666-29ed0c0b6467.png#height=350&width=416) <br />5. 启动zk服务:进入到bin目录:./zkServer.sh start<br />6. 检测服务(bin目录下):./zkserver.sh status<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615081263-78c3660e-154d-442a-8960-4b1ea945b258.png#height=39&width=415)<br /> <br /> <br />Zk集群的搭建:<br />1. 在data文件夹下面创建一个文件:myid:作用就是记录服务器的id<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615081452-e7684840-b637-47ab-a46f-9c69d864c19b.png#height=44&width=92)<br />2. 在每个集群节点的zoo.cfg配置文件中配置集群服务器ip列表<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615081627-96d00157-a584-45a4-ada0-7f595de5a927.png#height=91&width=415)<br />规则:server.id=服务器ip地址:服务通信端口(2181是客户端端口,使用任意其他端口):服务器之间选举端口<br />3.检测:启动节点各个服务:./zkServer.sh start 然后使用命令查看状态:./zkServer.sh status<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615081870-bba08fa0-9185-4e40-8f9a-08cfd9f4ab8e.png#height=70&width=414)<br /> <br />注意:当我们启动成功后检查状态时,如果状态不是成功的,那么说明并没有成功启动<br />1. 进入bin目录下检查zookeeper.out日志文件<br /> <br /> <br />11. Zk在项目中的api的使用:<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615082061-33460c88-3149-40de-a657-1a43d18105d4.png#height=89&width=415)<br />创建连接的流程:<br />1. 客户端创建实例取得连接<br />2. 服务端为此次连接分配id<br />3. 客户端不断发送心跳机制保持会话<br /> <br />项目实战:<br />1. 导入依赖包:<br />2. 创建连接的类:连接过程是异步的,连接时直接返回,保持在connecting状态<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615082285-f8e22640-fdbe-4e90-a83d-9d56b1bc5689.png#height=172&width=415)<br />问题:什么时候才算真正意义上会话的连接成功:成功时服务端会向客户端发送一个事件通知(这个事件就是SyncConnected),并由watcher接口里面的process处理(如上图)<br />3.使用连接类进行节点的操作:节点的创建有同步和异步两种方式创建<br /> 1.同步方式创建节点:创建也需要时间<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615082449-8b78a79a-6352-4a78-b92f-a5a3c2659bf4.png#height=23&width=415)<br /> 2.获取节点数据<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615082591-44c7a5ff-9eb3-4f58-ac82-6458e49f07bb.png#height=34&width=414)<br /> 3.获取子节点列表<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615082797-253e9f8b-19d6-400c-aa88-34077884c42b.png#height=35&width=415)<br />注意:zookeeper类中常用api讲解:<br />1. zk.getState():获取连接的状态<br />2. zk.create(path,data,acl,createMode):创建节点<br />//data:byte类型<br />acl的值:常用第三个<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615083063-b1363ad7-479f-4862-be14-513e6376572a.png#height=56&width=415)<br />createMode的值:<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615083290-49975497-310e-4048-af7f-b0a95fd24e88.png#height=66&width=415)<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 />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615083460-7b3b94e8-884e-41f7-a335-4fbdbdac1b07.png#height=89&width=415)<br />解释:类似这样的一个配置,我们如何实现存储:<br />2. 客户端在该节点上注册一个watcher监听事件,当有变化则通知客户端切换数据源<br /> <br /> <br /> <br /> <br /> 2.命名服务:其实就是生成全局唯一id: 利用有序节点自动添加一串数字特性<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615083676-c7f7afa4-6257-4a88-8b6f-ed662bea55a1.png#height=286&width=380)<br /> <br /> <br />1. zookeeper提供了服务端和客户端,客户端对服务端节点有监听功能,每当节点数据变化会主动通知客户端有变换,重新读取。<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615083903-c7553494-3327-4b49-97c6-5830afdedd04.png#height=283&width=414)<br /> <br />2. 操作命令<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615084156-b1913315-e61a-4f84-93df-075b1c4537be.png#height=30&width=416)<br />Set /node xxx<br />Get /node xxx<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615084388-c7a14f97-715c-4529-bcce-0b5a47175b66.png#height=197&width=416)<br />Stat /node 只获取属性<br />Delete/node xxx<br />Rmr /node:删除当前节点及其子节点<br /> <br />查询节点列表:<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615084610-71073158-ae31-43a7-a0c0-47839cb5840b.png#height=55&width=414)<br /> <br />有序节点的作用:为分布式环境创建唯一的id<br />临时节点的作用:创建分布式锁id<br /> <br />监听器的讲解:一个监听只能捕获一次事件<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615084839-f7c936e2-35b5-424f-b003-5b79549155af.png#height=32&width=415)<br /> <br />Acl权限控制:<br /> <br />3. 代码讲解:实现分布式配置中心:多台机器的配置文件的统一管理与配置修改<br />1. 导入jar包;<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615085085-22f3e1d9-b72e-4736-b340-75d9cc6089fe.png#height=93&width=415)<br />2.<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615085386-e99a05ab-a529-4754-a4c4-43a9fc028151.png#height=205&width=414)<br />Zookeeper.getData(path,true,state):获取数据并实现一次性监听<br /> <br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615085612-b8929249-5a9c-4107-a246-85b1f5a0cf93.png#height=173&width=415)<br /> <br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615085866-01d0b941-7ea9-4dd5-815d-668decc108fb.png#height=95&width=415)<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615086061-837bb4b9-0902-4a1e-b2ca-90abcf8040bd.png#height=92&width=414)<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615086280-f0d6d67e-0ea6-4f25-9045-e9cf9d14f881.png#height=42&width=415)<br /> <br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615086472-b029d9fe-2a13-4d78-8775-571b7b4e4ba8.png#height=88&width=414)<br /> <br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615086722-4ff33fe9-79f2-4270-b373-c924f60359cc.png#height=92&width=414)<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615086981-c2f9a33d-c4a9-452f-9299-2788a413eb41.png#height=55&width=414)<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615087228-6da8eac0-c663-47d8-9a0f-786f01c153a7.png#height=104&width=415)<br /> <br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615087470-9e557882-808b-4195-9baf-44267d4a5d51.png#height=92&width=415)<br /> <br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615087693-3156119c-2df0-4aad-86fa-a0333a7c2976.png#height=48&width=414)<br /> <br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615087921-6ed57471-688e-4616-99bf-a5b44d3db7b4.png#height=44&width=414)<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615088109-db9a8b4f-aea3-4667-8a60-7d153f93e69b.png#height=51&width=415)<br /> <br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615088356-87d257f7-6832-40a2-95b0-92eaeb850076.png#height=140&width=414)<br /> <br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615088590-797d4768-0dc0-4c88-8208-98e6aaafd97c.png#height=153&width=415)<br /> <br /> <br />zookeeper的watchwer机制:事件监听机制:<br />1. 监听流程:<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615088853-255cf5ad-ff71-4589-81bc-82d10d0322de.png#height=199&width=415)<br />2.<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615089086-b1f5f1c8-ebe9-45da-bccd-1a9981f9c26f.png#height=146&width=415)<br /> <br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615089339-b49053ad-fe07-4d85-879c-ba797839f7d0.png#height=150&width=415)<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615089607-bfda95b0-11f1-42bb-938c-1e1a70afcacb.png#height=166&width=414)<br /> <br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615089905-16ed65d8-a8ae-4179-9cf0-1aa1933101cb.png#height=137&width=414)<br /> <br />2.生成全局唯一id:创建临时有序节点,使用这个序列号作为id。<br /> 1.在构造方法中初始化的时候创建连接:<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615090200-c1c8d757-9568-4c87-8bf7-2c29a7986da9.png#height=113&width=416)<br />2. 创建id:<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615090428-566d9408-f000-4164-af20-d61022308aaa.png#height=88&width=415)<br /> <br />3.<br /> <br />分布式锁的实现:<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615090709-157561ba-14ce-46c5-8afd-be277ff4656a.png#height=176&width=415)<br />1. 代码整体展现:<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615090942-585c591a-46b3-44e2-8db1-3328f9958bef.png#height=235&width=414)<br />2. 构造方法创建连接<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607615091239-3b83338d-37cc-4087-b6cc-925bd317c843.png#height=164&width=415)<br /> <br />4. Zookeeper实现集群管理的原理:是否有机器退出和加入,进行master的选举<br />5. <br />6. <br />