zookeeper——小记

zookeeper的特性

一致性:数据一致性,数据按照顺序分批入库

原子性:事务要么成功,要么失败,不会局部变化

单一视图:客户端连接集群中的任一zk节点,数据都是一致的

可靠性:每次对zk的操作状态都会保存在服务端

实时性:客户端可以读取到zk服务端的最新数据

zookeeper配置(zoo.cfg配置)

tickTime:用于计算的时间单元(单位:毫秒)。比如session超时:N*tickTime

initLimit:用于集群,允许从节点连接并同步到master节点的初始化连接时间,以tickTime的倍数表示

syncLimit:用于集群,master主节点与从节点之间发送消息,请求和应答时间长度。(心跳机制)

dataDir:必须配置,zookeeper存储的先关数据,比如事务配置文件

dataLogDir:日志目录,如果不配置会和dataDir公用

clientport:连接服务器的端口,默认2181

 

zkServer.sh start:启动zk

 

zookeeper基本数据模型

是一个树形结构,类似于前端开发中的tree.js,也可理解为linux/unix的文件目录:/usr/local/...

每一个节点都称之为znode,它可以有子节点,也可以有数据

每个节点分为临时节点和永久节点,临时节点在客户端断开后消失

每个zk节点都有各自的版本号,可以通过命令来显示节点详情信息

每当节点数据发生变化时,那么该节点的版本号会累加(乐观锁)

删除/修改过时的节点,版本号不匹配则会报错(使用乐观锁的表现)

每个zk节点存储的数据不易过大,几k即可

节点可以设置权限acl,可以通过权限来限制用户的访问

 

zookeeper数据模型的基本操作

客户端连接

命令zkCli.sh进入zk,命令help查看zk有哪些操作命令

查看znode结构

ls path:查看某路径下节点信息

关闭客户端连接

按ctrl+c退出客户端

 

zk的作用体现

master节点选举,主节点挂了以后,从节点就会接受工作,并且保持这个节点是唯一的,这也是所谓首脑模式,从而保证我们的的集群是高可用的。

统一配置文件管理,即只需要部署一台服务器,则可以吧相同的配置文件同步更新到其他所有服务器,次操作在云计算中用的特别多(假设修改了redis统一配置)。

发布与订阅,类似消息队列MQ(amq,rmq...),dubbo发布者吧数据存在znode上,订阅者会读取这个数据。

提供分布式锁,分布式环境中不同进程之间争夺资源,类似于多线程中的锁。

集群管理,集群中保证数据的抢一致性。

 

zk常用命令行操作

通过./zkCli.sh打开zk的客户端进行命令行后台

ls path与ls2 path命令比较

ls path:查看节点(目录)

ls2 path:查看节点详细信息

get与stat命令

get:查看节点存储的数据以及节点详细信息,比stat多了一个节点数据

stat:ls2相当于ls加stat整合命令

 

zk特性——session的基本原理

客户端与服务端之间的连接存在会话

每个会话都可以设置一个超时时间

心跳结束,session则过期(一旦客户端不再向服务端发出请求)

session过期,则临时节点znode则会被抛弃

心跳机制:客户端想服务端的ping包请求

 

zk常用命令行操作2

create [-s] [-e] path data acl命令:创建节点

create /mypath mydata

get /mypath查看节点信息

[-s]创建顺序节点

[-e]创建临时节点

set path data [version]:设置节点值

delete path [version]:删除节点

 

zk特性——watcher机制一

针对每个节点的操作,都会有一个监督者->watcher(节点发生变化就会触发这个watcher,类似数据库里的触发器)

当监控的每个对象(znode)发生了变化,则触发watcher事件

zk中的watcher是一次性的,触发后立即销毁

zk特性——watcher机制二

父节点,子节点 增删改都能够触发其watcher

针对不同类型的操作,触发的watcher事件也不同:

1.(子)节点创建事件 NodeCreated

2.(子)节点删除事件NodeDeleted

3.(子)节点数据变化事件NodeDataChanged

 

watcher使用场景

统一资源配置

 

ACL(access control lists)权限控制

针对节点可以设置相关读写等权限,目的为了保障数据安全性

权限permissions可以指定不同的权限范围以及角色

 

ACL命令行

getAcl:获取某个节点的acl权限信息

setAcl:设置某个节点的acl权限信息

addauth:输入认证授权信息,注册时输入明文密码(登录),但是在zk的系统里,密码是以加密的形式存在的

 

zookeeper集群搭建

注意事项:

配置数据文件 myid 1/2/3 对应 server.1/2/3

通过./zkCli.sh -server [ip]:[port]检测集群是否配置成功

 

leader和follower节点

 

使用zookeeper原生java API进行客户端开发

建立客户端与zk服务端的连接

ZooKeeper zk = new ZooKeeper(zkServerPath, timeout, new Watcher(), sessionId, sessionPassword)

sessionId和sessionPassword是在第一次连接zkServer时获取的,一般会将其放到session缓存或者redis里,用来重连zk服务

 

创建zk节点

create(String path, byte[] data, List<ACL> acl, CreateMode createMode)——同步创建

create(String path, byte[] data, List<ACL> acl, CreateMode createMode,Callback cb,Object ctx)——异步创建

 

修改zk节点

setData(String path, byte[] data, int version)——同步修改

setData(String path, byte[] data, int version,StatCallback cb,Object ctx)——异步修改

 

 删除zk节点

delete(String path,int version)——同步删除

delete(String path,int version,VoidCallback cb,Object ctx)——异步删除

 

CountDownLatch的使用

他是一个计数器

用于多线程,可以暂停也可以继续

.await()    .countDown()

 

原生Java api节点查询

获取节点数据

先连接zk服务端zookeeper

zookeeper.getData(String path,boolean watch,Stat stat)

获取子节点数据

先连接zk服务端zookeeper

 

判断节点是否存在

 

 

常用的java客户端

1.zk原生api

缺点:超时重连,不支持自动,需要手动操作

Watch注册一次后会失效

不支持递归创建节点

2.zkclient

国外开源的,更新慢

3.Apache curator(推荐)

apache开源项目

解决watcher的注册一次就失败问题

api更加简单易用

提供更多解决方案并且实现简单:比如分布式锁

提供常用的zk工具类

编程风格更好

 

客户端apache curator使用

usingWatcher只会触发一次,监听完毕后就销毁

nodeCache监听数据节点变更,会触发事件

nodeCache.start(boolean buildInitial)——true为初始化的时候获取node值并且缓存

nodeCache.getListenable().addListener(new NodeCacheListener(){——添加事件监听器

   public void nodeChanged() throws Exception {

   }

})

 

 

基于zookeeper的应用

分布式协调服务dubbo

 

分布式锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值