zookeeper
来源:互联网 发布:杭州市行知小学校歌 编辑:程序博客网 时间:2024/05/26 12:56
第一:学习一个框架必须明确下面三点
1,应用的场景
2,工作的流程,工作的原理,知道怎么用
3,内部的组成。源码的分析
第二:zookeep内部的选举函数
当一台服务器知道另一台服务器存在的时候。并且另一台的ip地址比自己大。就把票投给ip地址大的。
加入zookeep控制折三台服务器(A,B,C),客户端和其中的一台服务器相关联。我们必须保证这三台服务器里面的数据都是一样的,即一台服务器里面的数据改变了,其他服务器里面的数据也要做出改变。
A,B,C都有配置文件,配置文件里面记录着这个网络里面一共有多少台服务器,及这些服务器的信息。比如A里面则记录了BC
刚开始打开A服务器,其他两台都关闭着,此时进行投票,A投给自己,也相当于投给系统里面的所有服务器,即投给配置文件里面的所有服务器。但是只有自己一个收到,因为其他两台都关着。此时A得到1票。由于是三个人投票,必须有两张票的时候,才能选举你为主服务器,即leader。所以A此时处于等待状态。等待下一次投票的开始。
B打开了。此时进行第二次投票。但是A这时不知道B打开了。所以A仍然把票投给自己,即想当于把票投给了所有的人。随意B也得到A的一张票。B也把票投给自己,所以此时A和B都为两张票。还没有选举出谁为leader。所以此时进行第三轮投票。但此时A知道系统有B的存在。并且B的ip地址比自己大。所以A此时把票投给B。B也把票投给B。投给自己相当于投给系统里面的所有人。所以此时A有1张票。B有2两张票。所以此时B当选为leader。A为follower。
c此时开了。一看系统中已经有leader。则不管自己的ip大小。就不再投票。成为follower。
加入客户端此时并不是和leader连接的所以此时,客户端把数据发给follower的时候。数据又会被直接转发给leader。然后leader告诉大家,把你们的数据都给我改过来。
由于zookeep有延迟,所以当集群特别大的时候,就不使用了。我现在用3台服务器,还是可以的。
第三zookeep的安装步骤
1,安装到3台虚拟机上,这三台虚拟机需要安装好安装好JDK。
2,用alt+p调出sftp上传页面。把zookeep的安装包拖进来,进行安装包的上传
3,tar -zxvf zookeeper-3.4.5.tar.gz -C apps(解压刚才上传的安装包到apps目录下面。对于java软件解压即为安装)
4,进入cd zookeeper/conf里面
cp zoo_sample.cfg zoo.cfg拷贝,因为zoo-sample.cfg是一个例子,是无效的文件。我们为了保留例子。所以我们把例子拷贝一份,进行修改
5.,vi zoo.cfg
把dirdata改为/root/zkdata他是用来存储服务器数据的目录。所以必须修改为自己准备存放的位置
添加下面的内容
dataDir=/root/zkdata #dataDir是存放数据的地方
dataLogDir=/home/hadoop/zookeeper/log#存放日记的地方
server.1=p0:2888:3888 (主机名, 2888为leader和follower通信、3888为投票的端口,p0,p1,p2为三台主机的名字)
server.2=p1:2888:3888
server.3=p2:2888:3888
即把系统里面的所有服务器都给配置进去。
6,由于刚才的dirdata改为了/root/zkdata。所以此时创建文件夹mkdir /root/zkdata
7,在zkdata文件夹下新建myid文件,myid的文件内容为1
命令为echo 1 > zkdata/myid
8,将集群下发到其他机器上
scp -r apps/ p2:/root
scp -r apps/ p3:/root
9,
到p2上:创建/root/zkdata/myid 修改myid为:2
到p3上:创建/root/zkdata/myid 修改myid为:3
10,启动(每台机器)
zkServer.sh start(此时需要打开view下面的command window并选择发送到全部对话)
第四zookeep·客户端的使用(必须先关闭防火墙)
1,客户端要进行连接,必须先打开服务端。所以第一步为打开服务端的命令bin/zkServer.sh start用于启动服务端
zkServer.sh status(查看集群状态,主从信息,当所有的服务器打开之后,就可以查看他们的主从信息了)
2,服务端进行连接,命令为bin/zkCli.sh 此时默认是连接到本机的.提示为[zk: localhost:2181(CONNECTED) 0] 0即为本台服务器。
此处可以这样理解。有一个客户端和第一台服务器p0连接着。客户端启动之后,默认的就是连接到和自己直接连接的服务器即p0.而不是leader。
注意连接的时候不可以用command命令,进行全部连接。因为我们模拟的是一个客户端和好几个服务端进行连接。所以只需要在一个服务器上面启动客户端的连接程序.对于这个问题目前也不确定。将来再看
我们输入heip。看如何连接到其他服务器。提示如下
所以我们得知用命令connect p1:2182连接到p1服务器
3,连接之上,下面来看如何使用。zookeep只有两个功能。一个为读写数据,一个为监听。所以我们只要围绕这两个命令来看如何使用
第一:客户端去服务端取数据,有上面的help图片得知。get+路径就可以取到这个路径下面的数据
再次先介绍一下zookeep中的数据结构
1、层次化的目录结构,命名符合常规文件系统规范(见下图)
2、每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识
3、节点Znode可以包含数据和子节点(但是EPHEMERAL类型的节点不能有子节点,下一页详细讲解)
4、客户端应用可以在节点上设置监视器(后续详细讲解)4,数据结构的图
5,ls /查看根节点里面都有那些子节点
我们刚安装zookeep则根节点下面只有一个初始化的子节点,名字为zookeeper
再又help得知。我们可以用create指令创建子节点
6, create [-s] [-e] path data acl对于这个命令的每个参数解释如下
-s 是一个父节点下面的每个节点带上序号。第一子节点序号为0.第二个父节点的序号为1如此循环
-e创建短暂的节点。客户端退出的时候自动删除。不加s则默认是创建永久的节点。
path创建的节点的路径,注意次数的/不是linux系统的根 而是zookeep的数据结构的根
data节点里面存储的数据
ac1节点的权限
6.1创建永久的节点,退出的时候也存在
create /app1 "data"这个命令解释为在根节点下面创建子节点app1 子节点中的数据为data。这个命令的最后一个参数ac1是权限的意思。客户端不需要权限。所以不需要写
我们还可以继续创建app1下面的子节点
create /app1/p_1 "data"
6.2 创建短暂的节点
节点中的数据类型分为两种
Znode有两种类型:
短暂( (断开连接自己删除)
持久(persistent)(断开连接不删除)
例子如下
在数据结构的根下面创建一个短暂的数据类型
create -e /app-ephemeral "8888"
查看创建的结果如下
[zk: p1:2181(CONNECTED) 6] ls /
[app1, app-ephemeal, zookeeper]
[zk: p1:2181(CONNECTED) 7] get /app-ephemeral
Node does not exist: /app-ephemeral
[zk: p1:2181(CONNECTED) 8] get /app-ephemeal
"8888"
下来我们用quit命令退出连接
当我们重新连接的时候。我们则发现,刚才创建的app-ephemeal节点被删除了。查看结果如下
[zk: localhost:2181(CONNECTED) 0] ls /
[app1, zookeeper]
6.3 对于-s的演示
[zk: localhost:2181(CONNECTED) 11] create /test 888
Created /test
[zk: localhost:2181(CONNECTED) 12] create -s /test/aa 99
Created /test/aa0000000000
[zk: localhost:2181(CONNECTED) 13] create -s /test/bb 99
Created /test/bb0000000001
[zk: localhost:2181(CONNECTED) 14]
[zk: localhost:2181(CONNECTED) 14] create -s /test/cc 99
Created /test/cc0000000002
由上面的结果得知。在根下面创建一个test。并在test里分别创建多个节点的时候。则这些节点带上了编号0,1,2
6.5更新节点的数据用set比如
set /app1 uuu
6.6获取数据的时候,加上监听参数watch
首先我在p0上面查看/app1里面的数据结果如下
然后我在p2上面修改了数据set /app1 hhhkkkhhooo
则此时的服务器为了给客户呈现出最新的消息,所以有了如下的提示,并且p0服务器的颜色变为蓝色,表示数据已经有了改变
此时我们又在p2服务器上面第二次修改数据。但此时修改的结果并没有传递给p1.因为watch命令只监听一次
6.7watch监听是分类型的get的时候。则监听的是数据的变换。所以此时如果在/aap1下面增加或者删除子节点,是不会有监听提示的。
如果要想再删除子节点的时候有提示,就必须用查看节点的命令 ls /test watch
7,上面的这些步骤让我们创建了一个数据结构图。所以下面我们就可以去这个图里面利用get命令去取数据
get /app1 则败哦是取得根目录下子节点app1中的数据。结果如下
图片上面的第一行2222为app1节点里面的数据。
其余的信息属对于此数据的描述。比如ctime为数据的创建时间。mtime为数据的改变时间
- zookeeper
- zookeeper
- zookeeper
- zookeeper
- zookeeper
- zookeeper
- zookeeper
- zookeeper
- ZooKeeper
- zookeeper
- zookeeper
- zookeeper
- zookeeper
- zookeeper
- ZooKeeper
- zookeeper
- zookeeper
- Zookeeper
- 内存泄漏简析
- retainAll()
- MappedByteBuffer
- 管理处理器的亲和性(affinity)
- UTC时间与北京时间相互转换
- zookeeper
- Spring Boot 菜鸟教程 3 MyBatis
- 文件读写:fwrite与fprintf的区别(即二进制方式和文本方式的区别)
- Codeforces285C Building Permutation
- 程序中的浪漫---爱心的代码
- C++中cout、cin和endl的用法
- ubuntu 中添加中文支持
- 【炉石传说】卡片模型的小分析
- 作业题8.23