Zookeeper---动物管理员
特性:
1、数据一致性---从任意的节点获取到的数据是一致的
2、原子性---更新只能成功或者失败,没有中间状态
3、可靠性---简单,良好的性能。如果消息m被一台服务器接收,那么它会 被所有的服务器接收
4、顺序性---操作a先于b发生,那么在zookeeper中,a的事务一定咸鱼b
5、实时性---在网络较好的情况下,可以对子节点进行监控;zookeeper保证
客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器宕机信 息,但由于网络延迟等原因,zookeeper有时不能保证俩个客户端同时得到 更新的数据,如果需要最新数据,在读取数据之前调用sync()接口--同步接口
6、过半性---过半选举、过半执行、过半服务:集群中的节点数一般是奇数 个--防止脑裂(集群中产生2个以上的leader)
特点:
1、本身是一个树状结构 --- Znode树
2、每一个节点称之为znode节点
3、根节点是 /
4、Zookeeper的所有操作都必须以根节点为基准进行计算 /
5、每一个znode节点都必须存储数据
6、任意一个持久节点都可以有子节点
7、任意一个节点的路径都是唯一的
8、Znode树是维系在内存中 --- 目的是为了快速查询
9、Zookeeper不适合存储海量数据。
原因: 1)维系在内存中,如果存储大量数据会耗费内存
2) 不是一个存储框架而是一个服务协调框架
10、Zookeeper会为每一次事务(除了读取以外的所有操作都是事务)分配一个全局的事务id ---Zxid
Zookeeper投票协议:ZAB协议(2pc协议基础的延伸)-用于崩溃恢复和原子广播
将节点分为了协调者和参与者。当来一个请求的时候,协调者是将请求分发给每一个参与者,如果所有的参与者决定执行这个请求,那么协调者就真正提交操作,有参与者执行,参与者在执行完成之后返回Ack表示执行成功。如果协调者将请求分发给每一个参与者之后,有一个或者多个参与者不同意执行或者是没有返回消息,那么将这个操作回滚,不执行 --- 一票否决
原子广播:--先写到日志log文件
zookeeper接受请求
在Zookeeper中,接收一个请求之后,leader会将请求分发给每一个节点,由所有的节点投票确定是否执行这个请求 --- 如果有超过一半的节点同意执行这个请求,那么这个时候leader才会决定执行这个操作
(离线批处理--只存储),follower、leader、ObServer、looking(选举状态)
其中ObServer不参与投票,就算宕机也对整个集群没有影响--例如阿里的应用
如果超过一半的服务器宕机,那么此时Zookeeper不再对外提供服务 --- 过半性
Zookeeper的选举机制
1、所有的节点都会推荐自己当leader并且发送自己的选举信息(最大事务 id - pZxid,编号 - myid,逻辑时钟值)
2、选举原则:先比较最大事务id,谁的事务id大谁就胜出;如果最大事务 id一样,则比较myid,谁的myid大谁就胜出
3、选举出的leader的胜出要满足过半性:即要比至少一半的节点大
4、如果在集群中新加入一个节点,节点的事务id比leader的事务id大,新 的节点是否会成为leader? --- 不会。只要选定了一个leader,那么后续节点 的事务id和myid无论是多少,一律都是follower
5、如果leader宕机,集群中会自动选举一个新的leader
Zookeeper的单机版安装
Zookeeper可以安装在Linux下,也可以安装在Windows中,但是官网上声明在Windows中Zookeeper不保证稳定性
关闭Linux的防火墙
临时关闭:service iptables stop
永久关闭:chkconfig iptables off
下载并且安装jdk,要求jdk是1.6以上的版本
下载Zookeeper的安装包
解压安装包:tar -xvf zookeeper-3.4.8.tar.gz
进入Zookeeper的安装目录中的conf目录:cd zookeeper-3.4.8/conf
将zoo_sample.cfg复制为zoo.cfg:cp zoo_sample.cfg zoo.cfg
Zookeeper在启动的时候会自动加载zoo.cfg,从里面读取配置信息,需要修改zoo.cfg,将其中的dataDir进行修改:dataDir=/home/software/zookeeper-3.4.8/tmp
创建指定的数据存储目录:mkdir tmp
进入bin目录:cd bin
启动服务器端:sh zkServer.sh start
启动客户端:sh zkCli.sh
注意:
Zookeeper返回Started不代表启动成功,可以通过jps或者是sh zkServer.sh status来查看是否启动成功
如果使用的是jps,查看是否有QuorumPeerMain
如果使用的是sh zkServer.sh status, 查看是否有Mode:standalone
当Zookeeper启动之后,在bin目录下会出现zookeeper.out文件 --- 记录Zookeeper的启动过程的日志文件
Zookeeper的为伪布式集群安装
关闭防火墙
安装jdk
下载Zookeeper的安装包
解压Zookeeper的安装包
进入Zookeeper的安装目录中conf目录
将zoo_sample.cfg复制为zoo.cfg
编辑zoo.cfg,修改dataDir属性:
dataDir=/home/software/zookeeper-3.4.8/tmp
server.1=10.9.162.133:2888:3888 # 1是编号,要求每一个节点的编号是数字且不重复;
server.2=10.9.152.65:2888:3888 #2888,3888是端口号,只要不和已经占用的端口号冲突即可
server.3=10.9.130.83:2888:3888
创建存储数据的目录
进入数据存储目录
编辑文件myid, 将当前机器的编号写到myid中
将配置好的Zookeeper的安装目录拷到其他集群主机中:scp -r zookeeper-3.4.8 10.9.130.83:/home/software/
根据指定的编号修改对应的myid
其他:
在Zookeeper集群中,单独启动一台主机是不对外提供服务的
Zookeeper在使用过程中,会进行选举,选举出主节点-leader,其他的节点就会成为从节点-follower