zookeeper 作用
起初zookeeper 作为分布式锁的实现去设计的, 但是可以实现注册中心的功能.
提供服务动态发现,服务治理, 维护配置信息,对在zookeeper上注册的信息提供监听服务.
使用者可以订阅监听到各个服务的变化,以及 注册信息的权限管理
zookeeper 使用
分布式锁/共享锁: 创建节点方式来向其他服务宣布锁定,当此节点上有值时说明被其他服务创建使用,使用完后销毁,
其他服务可以对次节点进行监控或者判断,进行锁操作
服务动态发现: 客户端启动后拉取所有节点信息并监听, (服务断开, 服务注册 )等.客户端自主实现负载均衡(因为每个客户端都有所有服务信息)
服务监听:watcher监听, zookeeper提供的客户端监听是一次性的(注意)
防止单点故障: master选举,集群中有一个管理者去调度各个节点,当管理者出现故障时,会启动 master选举 选出新的 master开始管理集群事务,子节点故障后, master会感知到然后剥离集群
集群/单机部署:通常 zookeeper 是由 2n+1 台 server 组成,每个 server 都知道彼此的存在。每个 server 都维护的内存状态镜像以及持久化存储的事务日志和快照。对于 2n+1 台 server,只要有 n+1台(大多数)server 可用,整个系统保持可用。
基于java访问客户端:zkclient、curator
curator 抽象层次较高 更容易方便使用 ,封装了一套fluent 风格的操作 api.
提供 共享锁,分布式锁,leader 选举 的抽象封装 易于使用
zookeeper 原理
zookeeper 内部维护一个内存数据库, 数据结构树状结构,node 中包含list
所有的服务,分布式锁 都属于一个node节点的数据.存放在zookeeper 上
master选举是模拟了Chubby ,进行资源抢占
节点状态信息: 包含 version,创建修改时间,子节点个数,事务ID等字段信息. 通过这些version 字段 可以进行写入校验,也就是乐观锁
Watcher :客户端向服务端注册Watcher监听, 发布/订阅功能
ACL权限: 用法给各个数据添加权限,
权限模式:
Digest:最常用的控制模式,类似于 username:password (需要对密码加盐);
World: 最开放的控制模式,这种权限控制几乎没有任何作用,数据的访问权限对所有用户 开放。 world:anyone
Super: 超级用户,可以对节点做任何操作