python zookeeeper 学习和操作

时间:2023-03-09 09:28:28
python zookeeeper 学习和操作

1.zookeeeper介绍

  ZooKeeper是一个为分布式应用所设计的分布的、开源的协调服务,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。ZooKeeper本身可以以Standalone模式安装运行,不过它的长处在于通过分布式ZooKeeper集群(一个Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。ZooKeeper是作为分布式协调服务,是不需要依赖于Hadoop的环境,也可以为其他的分布式环境提供服务。

2.安装伪集群 zookeeeper

  所谓 “伪分布式集群” 就是在,在一台PC中,启动多个ZooKeeper的实例。“完全分布式集群” 是每台PC,启动一个ZooKeeper实例。

(1)下载zookeeeper 并解压

  在官网http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz下载zookeeeper,解压三次,并更名目录。

python zookeeeper 学习和操作

python zookeeeper 学习和操作

python zookeeeper 学习和操作

python zookeeeper 学习和操作

(2)修改配置文件conf/zoo.cfg

  在每个zookeeeper-x 中conf 下更名文件(mv和cp都可以),cp conf/zoo_sample.cfg conf/zoo.cfg

修改:dataDir,clientPort
   增加:集群的实例,server.X,”X”表示每个目录中的myid的值

  vim /usr/local/zookeeper/zookeeper-1/conf/zoo.cfg

python zookeeeper 学习和操作

vim /usr/local/zookeeper/zookeeper-2/conf/zoo.cfg

python zookeeeper 学习和操作

vim /usr/local/zookeeper/zookeeper-3/conf/zoo.cfg

python zookeeeper 学习和操作

注意:因为是在同一台机器上面,所以clientport不能相同

3.启动zookeeeper 服务

分别在 /usr/local/zookeeper/zookeeper-x/bin/ 下,./zkServer start

python zookeeeper 学习和操作

要是QuorumPeerMain,才是成功启动的

查看节点状态,在/usr/local/zookeeper/zookeeper-x/bin/ 下,./zkServer status

python zookeeeper 学习和操作

python zookeeeper 学习和操作

由于zookeeeper集群的稳定性,必须要启动两个以上的服务,zookeeeper才能成功启动

4.安装 zkpython

在官网下载,解压安装即可

https://pypi.python.org/packages/14/38/a761465ab0a154405c11f7e5d6e81edf6e84584e114e152fddd340f7d6d3/zkpython-0.4.2.tar.gz

若import zookeeeper无错误,就表示成功安装

5.zookeeeper命令行操作  

我们通过客户端连接ZooKeeper的集群,我们可以任意的zookeeper是进行连接。

python zookeeeper 学习和操作

集群已连接,下面我们要使用一下,ZooKeeper的命令行操作。

命令行操作(通过help打印命令行帮助)

python zookeeeper 学习和操作

ZooKeeper的结构,很像是目录结构,我们看到了像ls这样熟悉的命令。

python zookeeeper 学习和操作

python zookeeeper 学习和操作

python zookeeeper 学习和操作

python zookeeeper 学习和操作

python zookeeeper 学习和操作

6.python连接和操作zookeeeper

python zookeeeper 学习和操作

python zookeeeper 学习和操作

这时可以新开一个shell页面,在python中再初始化一个连接,可以获取前面set的数据“hello"

python zookeeeper 学习和操作

  创建节点说明:

 zookeeper.create(self.handle, path, data, [acl2], flags) zk创建节点的api,flags可以为EPHEMERAL SEQUENCE 或0,如果设置为EPHEMERAL ,这个节点只会短暂存在,即过期就好被删除,过期的时间为session的时间,SEQUENCE a unique monotonically increasing sequence number is appended to the path name ,可能是排序的意思。

zookeeper.create(handler,"/zkpython_create_node","mydata1",[{"perms":0x1f,"scheme":"world","id":"anyone"}]),0);

第一个参数就是我们刚才建立的链接,第二个参数是创建的节点的路径,第三个是创建的节点的数据,第四个是acl(zookeeper中的访问控制列表),第五个是创建的节点的类型(0表示持久化的,1表示持久化+序号,2表示瞬时的,3表示瞬时加序号型的)

acl的描述为什么是这样的,首先第一个参数是perms,这个代表了控制这个节点的权限,具体值参考如下:

int READ = 1 << 0;
int WRITE = 1 << 1;
int CREATE = 1 << 2;
int DELETE = 1 << 3;
int ADMIN = 1 << 4;

也就是说,这是一个数字,而我们例子中为什么是1f呢?实际上就是 READ | WRITE | CREATE | DELETE | ADMIN的结果。后面还有两个参数,实际上现在java和c的api中定义的值只有两种,除了例子中的还有一种是 "scheme":"auth","id":""组合的,但是实际上,官方的文档中是有四种的。

  监听器说明:

我们先要定义一个watch方法,比如这里的myWatch方法,之后在调用get方法的时候,把这个watch传递进去就可以了。

各个参数的意思:

handler:就是我们创建连接之后的返回值,我试了下,发现好像指的是连接的一个索引值,以0开始

type:事件类型,-1表示没有事件发生,1表示创建节点,2表示节点删除,3表示节点数据被改变,4表示子节点发生变化

state:客户端的状态,0:断开连接状态,3:正常连接的状态,4认证失败,-112:过期啦

path:这个状态就不用解释了,znode的路径