关注博客:https://blog.csdn.net/Xgx120413
学习Zookeeper相关的理论及实践。
目录
一、Zookeeper的相关介绍
二、为什么要用到Zookeeper
三、Zookeeper单机部署
四、Zookeeper相关特性
五、常用客户端及命令
六、Zookeeper关于Java客户端
七、Zookeeper一致性原理
八、Zookeeper集群解析
九、服务注册与发现
一、 Zookeeper的相关介绍
1. Zookeeper介绍
ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。 Zookeeper是hadoop的一个子项目。在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制不适合在 某些应用中使用,因此需要有一种可靠的、可扩展的、分布式的、可配置的协调机制来统一系统的状态。Zookeeper的目的就在于此。
2. 分布式系统由来与特点
分布式系统:一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。
分布性:分布式系统,最显著的特征就是分布性,从简单来看,如果我们做的是个电商项目,整个项目会分成不同的功能,专业点就不同的微服务,比如用户微服务,产品微服务,订单微服务,这些服务部署在不同的tomcat中,不同的服务器中,甚至不同的集群中,整个架构都是分布在不同的地方的,在空间上是随意的,而且随时会增加,删除服务器节点,这是第一个特性。
对等性:对等性是分布式设计的一个目标,还是以电商网站为例,要完成一个分布式的系统架构,肯定不是简单的把一个大的单一系统拆分成一个个微服务,然后部署在不同的服务器集群就够了,其中拆分完成的每一个微服务都有可能发现问题,而导致整个电商网站出现功能的丢失。
比如订单服务,为了防止订单服务出现问题,一般情况需要有一个备份,在订单服务出现问题的时候能顶替原来的订单服务。
这就要求这两个(或者2个以上)订单服务完全是对等的,功能完全是一致的,其实这就是一种服务副本的冗余。
还一种是数据副本的冗余,比如数据库,缓存等,都和上面说的订单服务一样,为了安全考虑需要有完全一样的备份存在,这就是对等性的意思。
并发性:接触的不是多线程的角度,而是更高一层,从多进程,多JVM的角度,例如在一个分布式系统中的多个节点,可能会并发地操作一些共享资源,如何准确并高效的协调分布式并发操作。
缺乏全局时钟:在分布式系统中,节点是可能反正任意位置的,而每个位置,每个节点都有自己的时间系统,因此在分布式系统中,很难定义两个事务纠结谁先谁后,原因就是因为缺乏一个全局的时钟序列进行控制,当然,现在这已经不是什么大问题了,已经有大把的时间服务器给系统调用。
故障随时会发生:任何一个节点都可能出现停电,死机等现象,服务器集群越多,出现故障的可能性就越大,随着集群数目的增加,出现故障甚至都会成为一种常态,怎么样保证在系统出现故障,而系统还是正常的访问者是作为系统架构师应该考虑的。
3. 大型网站分布图
整个架构分成很多个层:应用层,服务层,基础设施层与数据服务层,每一层都由若干节点组成,这是典型的分布式架构。
zookeeper在其中又是扮演什么角色呢,如果可以把zk扮演成交警的角色,而各个节点就是马路上的各种汽车(汽车,公交车),为了保证整个交通(系统)的可用性,zookeeper必须知道每一节点的健康状态(公交车是否出了问题,要派新的公交【服务注册与发现】),公路在上下班高峰是否拥堵,在某一条很窄的路上只允许单独一个方向的汽车通过【分布式锁】。如果交通警察是交通系统的指挥官,而zookeeper就是各个节点组成分布式系统的指挥官。
4. 分布式系统带来的问题
如果把分布式系统和平时的交通系统进行对比,哪怕再稳健的交通系统也会有交通事故,分布式系统也有很多需要攻克的问题,比如:通讯异常,网络分区,三态,节点故障等。
通讯异常:通讯异常其实就是网络异常,网络系统本身是不可靠的,由于分布式系统需要通过网络进行数据传输,网络光纤,路由器等硬件难免出现问题。只要网络出现问题,也就会影响消息的发送与接受过程,因此数据消息的丢失或者延长就会变得非常普遍。
网络分区:网络分区,其实就是脑裂现象,本来有一个交通警察,来管理整个片区的交通情况,一切井然有序,突然出现了停电,或者出现地震等自然灾难,某些道路接受不到交通警察的指令,可能在这种情况下,会出现一个零时工,片警零时来指挥交通。
但注意,原来的交通警察其实还在,只是通讯系统中断了,这时候就会出现问题了,在同一个片区的道路上有不同人在指挥,这样必然引擎交通的阻塞混乱。
这种由于种种问题导致同一个区域(分布式集群)有两个相互冲突的负责人的时候就会出现这种精神分裂的情况,在这里称为脑裂,也叫网络分区。
三态:三态是什么?三态其实就是成功,与失败以外的第三种状态:超时态。在一个jvm中,应用程序调用一个方法函数后会得到一个明确的相应,要么成功,要么失败,而在分布式系统中,虽然绝大多数情况下能够接受到成功或者失败的相应,但一旦网络出现异常,就非常有可能出现超时,当出现这样的超时现象,网络通讯的发起方,是无法确定请求是否成功处理的。
节点故障:节点故障在分布式系统下是比较常见的问题,指的是组成服务器集群的节点会出现的宕机或“僵死”的现象,这种现象经常会发生。
5. CAP理论
C(一致性):数据在分布式环境下的多个副本之间能否保持一致性,这里的一致性更多是指强一致性;
A(可用性):分布式系统一直处于可用状态,对于请求总是能在有限的时间内返回结果致性;
P(分区容错性):除非整个网络故障,分布式系统在任何网络或者单点故障时,仍能对外提供满足一致性和可用性的服务;
一个分布式系统中,不可能同时满足一致性、可用性、分区容错性这三个基本需求,最多只能同时满足其中的两项。
不可能把所有应用全部放到一个节点上,因此精力往往就花在怎么样根据业务场景在A和C直接寻求平衡。
二、 为什么要用到Zookeeper
1. Zookeeper设计目标
① 简单的数据结构:共享的树形结构,类似文件系统,存储于内存;
② 可以构建集群:避免单点故障,3-5台机器就可以组成集群,超过半数正常工作久能对外提供服务;
③ 顺序访问:对于每个读请求,zookeeper会分配一个全局唯一的递增编号,利用这个特性可以实现高级协调服务;
④ 高性能:基于内存操作,服务于非事务请求,适用于读操作为主的业务操作。3台zk集群能达到13W QPS
2. 哪些场景需要用到zk?
① 数据发布订阅 ② 负载均衡 ③ 命名服务 ④ Master选举 ⑤ 集群管理 ⑥ 配置管理 ⑦ 分布式队列 ⑧ 分布式锁
三、 Zookeeper单机部署
1. 环境要求:必须要有jdk环境,本次讲课使用jdk1.8
2. Windows部署Zookeeper流程
① 安装JDK1.8(自行查资料安装)
② 安装Zookeeper,在官网http://zookeeper.apache.org/下载zookeeper。(我下载的是zookeeper-3.4.12版本)解压zookeeper-3.4.6至D:\zookeeper-3.4.12。在D:\ 新建data及log目录
③ ZooKeeper的安装模式分为三种,分别为:单机模式(stand-alone)、集群模式和集群伪分布模式。ZooKeeper 单机模式的安装相对比较简单,如果第一次接触ZooKeeper的话,建议安装ZooKeeper单机模式或者集群伪分布模式。安装单击模式。 至D:\zookeeper-3.4.12\conf 复制 zoo_sample.cfg 并粘贴到当前目录下,命名zoo.cfg。
Zookeeper目录结构:
bin 存放系统脚本
conf 存放配置文件
contrib zk附加功能支持
dist-maven maven仓库文件
docs zk文档
lib 依赖的第三方库
recipes 经典场景样例代码
src zk源码
zk服务端启动流程:
zk客户端启动流程:
3. Linux系统部署Zookeeper流程(集群)
(ps:这里重点不在安装这些流程上,重点在于znode,watch,常用命令及后面的服务注册与发现等详细讲解。因此安装流程只是一带而过)
① 安装JDK1.8(安装流程请自行解决)
② 下载zookeeper安装包
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
③ 解压Zookeeper安装包
tar -zxvf zookeeper-3.4.10.tar.gz
④ 修改Zookeeper文件夹名称:
重命名: mv zookeeper-3.4.10 zookeeper
⑤ 修改zoo_sample.cfg文件
cd /usr/local/zookeeper/conf
mv zoo_sample.cfg zoo.cfg
修改conf: vi zoo.cfg 修改两处
(1) dataDir=/usr/local/zookeeper/data(注意同时在zookeeper创建data目录)
(2)最后面添加
server.0=192.168.212.154:2888:3888
server.1=192.168.212.156:2888:3888
server.2=192.168.212.157:2888:3888
⑥ 创建服务器标识(分别要建立三台服务器节点)
服务器标识配置:
创建文件夹: mkdir data
创建文件myid并填写内容为0: vi
myid (内容为服务器标识 : 0)
⑦ 复制zookeeper(将已经配置好的zookeeper复制到node1和node2中)
进行复制zookeeper目录到node1和node2
还有/etc/profile文件
把node1、 node2中的myid文件里的值修改为1和2
路径(vi /usr/local/zookeeper/data/myid)
⑧ 启动zookeeper
路径: /usr/local/zookeeper/bin
执行: zkServer.sh start
(注意这里3台机器都要进行启动)
状态: zkServer.sh
status(在三个节点上检验zk的mode,一个leader和俩个follower)
scp -r /soft root@zk2:/
scp -r /soft root@zk3:/
四、Zookeeper相关特性
zk的特性从会话、数据节点、版本、watcher、ACL权限控制、集群角色这部分了解,其中重点需要掌握数据节点与Watcher
1. 会话
客户端与服务端的一次会话连接,本质是TCP长连接,通过会话可以进行心跳检测和数据传输;
会话(session)是zookeeper非常重要的概念,客户端和服务端之间的任何交互操作斗鱼会话有关
会话状态
看上图,zk客户端和服务端成功连接后,就创建了一次会话,zk会话在整个运行期间的生命周期中,会在不同的会话状态之间切换,这些状态包括:
CONNECTING、CONNECTED、RECONNECTING、RECONNECTED、CLOSE
① 一旦客户端开始创建Zookeeper对象,那么客户端状态就会变成CONNECTING状态
② 同时客户端开始尝试连接服务器,连接成功后,客户端状态变为CONNECTED
③ 通常情况下,由于断网或其他原因,客户端与服务端之间会出现断开情况,一旦碰到这种情况,Zookeeper客户端会自动进行重连服务,同时客户端状态再次变成CONNECTING,直到重新连接上服务端后,状态又变为CONNECTED
④ 通常情况下,客户端的状态总是介于CONNECTING和CONNECTED之间。但是,如果出现诸如会话超时、权限检查或是客户端主动退出程序等情况,客户端的状态就会之间变更为CLOSE状态
2. ZK数据模型
Zookeeper的视图结构和标准的Unix文件系统类似,其中每个节点称为“数据节点”或ZNode,每个ZNode可以存储数据,还可以挂载子节点,因此可以称之为“树”。
第二点需要注意的是,每一个ZNode都必须有值,如果没有值,节点是不能创建成功的。
① 在Zookeeper中,ZNode是一个跟Unix文件系统路径相似的节点,可以往这个节点存储或获取数据
② 通过客户端可对ZNode进行增删改查操作,还可以注册watcher监控ZNode的变化
3. Zookeeper节点类型
① ZNode有两种类型:
短暂(ephemeral):(create -e /app1/test1 "test1" 客户端断开连接zk删除ephemeral类型节点)
持久(persistent):(create -s /app1/test2 "test2" 客户端断开连接zk不删除persistent类型节点)
② ZNode有四种形式的目录节点(默认是persistent)
PERSISTENT
PERSISTENT_SEQUENTIAL(持久序列/test0000000019)
EPHEMERAL
EPHEMERAL_SEQUENTAIl
③ 创建ZNode时设置顺序标识,ZNode名称后面会附加一个值,顺序号是一个单调递增的计数器,由父节点维护
④ 在分布式系统中,顺序号可以被用于为所有的时间进行全局排序,这样客户端可以通过顺序号推断事件的顺序
4. Zookeeper节点状态属性
5. ACL保障数据安全
ACL机制,表示scheme:id:permissions,第一个字段表示采用哪一种机制,第二个id表示用户,permissions表示相关权限(如只读,读写,管理等)。
Zookeeper提供了如下几种机制(scheme):
① world:它下面只有一个id,叫anyone, world:anyone 代表任何人,zookeeper中对所有人有权限的节点就是属于world:anyone的
② auth:它不需要id,只要是通过authentication的user都有权限(zookeeper支持通过kerberos来进行authentication,也支持username/password形式的authentication)
③ digest:它对应的id为username:BASE64(SHA1(password)),它需要先通过username:password形式的authentication
④ ip:它对应的id为客户机的IP地址,设置的时候可以设置一个ip段,比如ip:192.168.1.0/16,表示匹配前16个bit的IP段
五、命令行
1. 服务端常用命令
在准备好相应的配置后,可以直接通过zkServer.sh进行服务的相关操作:
① 启动zk服务:sh bin/zkServer.sh start
② 查看zk服务状态:sh bin/zkServer.sh status
③ 停止zk服务:sh bin/zkServer.sh stop
④ 重启zk服务:sh bin/zkServer.sh restart
2. 客户端常用命令
使用zkCli.sh -server 192.168.1.1:2181连接到服务端后,连接成功后,系统会输出Zookeeper相关环境及配置信息。命令行工具一些简单操作如下:
① 显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容
② 显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据
③ 创建文件,并设置初始内容: create /zk "test" 创建一个新的 znode节点“ zk ”以及与它关联的字符串 [-e] [-s] 【-e 零时节点】 【-s 顺序节点】
④ 获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串 [watch]【watch 监听】
⑤ 修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置 ·
⑥ 删除文件: delete /zk 将刚才创建的 znode 删除,如果存在子节点删除失败
⑦ 递归删除:rmr /zk将刚才创建的 znode 删除,子节点同时删除
⑧ 退出客户端: quit ·
⑨ 帮助命令: help
3. ACL常用命令
Zookeeper的ACL(Access Control List),分为三个维度:scheme、id、permission
通常表示为:scheme:id:permission
① schema:代表授权策略
② id:代表用户
③ permission:代表权限
关注博客:https://blog.csdn.net/Xgx120413
关注享学课堂