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



(主机名, 2888为leader和follower通信、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,数据结构的图


由此图知道zookeep里面的数据结构为一颗数,树的每一个节点上面有两个信息,分别为节点的编号,例如app1.还有此节点里面存储的数据

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为数据的改变时间


0 0
原创粉丝点击