1.zookeeper 是一个分布式数据一致性解决方案
1.维护配置信息 (通过watcher 监听数据变化,然后实时跟新配置信息)
2.分布式锁服务
思路:1.每一个客户端往/locks下创建有序节点/locks/lock_,创建成功后/locks下面会有每个客户端对应的节点 如:/locks/lock_0000000001
2.客户端获取到/locks下子节点,并进行排序,判断排在最前面的是否是自己,如果自己的节点在第一位,代表获取锁成功,
3.如果自己的锁节点不在第一位,则监听自己前一位的锁节点,如:自己的锁节点lock_0000000002,那么则监听lock_0000000001
4.当前一位锁节点(lock_0000000001)对应的客户端执行完毕,释放了锁(删除掉),将会触发监听客户端的逻辑
5.监听客户端重新执行步骤 2 的逻辑,判断自己是否获得了锁
3.集群管理
4.生成分布式的唯一ID(通过创建有序节点生成全局唯一ID)
2.zookeeper的特点
1.高性能:将数据存储在内存中
2.高可用:一般以集群的形势提供服务
3.严格顺序访问:
3.zookeeper的数据模型
数据节点可视为树状结构(类似linux的目录)
1.新增节点:create -s -e path data #-s 有序节点 -e 临时节点
有序几点特点:zk会在节点后面追加数字序号 例如: createa -s /h "123" 实际得到的节点名称是 /h0000000001 (这个可以在分布式环境生成唯一的ID)
临时节点特点:会话结束,数据消失
(临时、有序节点,一般用来生成分布式锁)
2.修改节点:set -v /path data #-v是指定版本号,可选参数
3.删除节点:delete /path 当节点下有子节点时,delete不能生效,需要用rmr命令
4.查看节点:get命名 get -s -w /path # -s 显示节点属性 - 对节点进行监听
5.查看节点属性:stat /path
6.查看子节点列表 : ls -w /path # -w 对子节点进行监听
7.ACL 针对节点的权限控制
授权模式:
world: 只有一个用户 anyone,代表登陆zookeeper所有人(默认)
ip : 对客户端使用IP地址认证
auth: 使用已添加认证的用户认证
digest: 使用“用户名:密码”方式认证
生成密文:echo -n username:password | openssl dgst -binary -sha1 | openssl base64
c(create):创建
d(delete):删除
r(reda) :读取、显示
w(write):设置节点数据
a(admin):设置节点访问控制权限
例如:setAcl /test ip:192.168.2.222:wdrwa
setAcl /test word:anyone:wdrwa
setAcl /test auth:user:wdrwa #user 是认证用户 通过addauth digest username:password 添加授权用户
相关命令:setAcl\ getAcl \ addauth
8.配置超级管理员 在zkServer.sh文件里面配置(百度)
4.集群配置
1.在配置文件中配置
dataDir=/data
server.1=192.168.2.204:2288:3388
server.2=192.168.2.205:2288:3388
server.A=B:C:D
A:一个数字,表示这太服务器的编号
B:服务器的编号
C:Zookeeper服务器之间的通信
D:Lerader选举的端口
2.在所配置的dataDir的目录下创建myid文件,文件内容为当前服务的编号
3.其他服务器做相应的配置
5.一致性协议:zab协议 (zookeeper atomic broadcast)
zookeeper通过zab协议来保证分布式事务的最终一致性
zab协议的工作原理:
写请求只能有leader执行,读请求都能执行,如果写请求到follow,follow会转发到leader
1.leader从客户端收到一个写请求
2.leader生成一个新的事务并为这个事务生成一个唯一的ZXID,
3.leader将这个事务提议(propose)发送给所有的follow节点
4.follow将收到的事务请求加入的历史队列(history queue)中,并发送ack给leader,
5.当leader收到半数以上的follow的ack消息,leader会发送commit请求。
6.当follow收到commit请求时,从历史队列中将事务请求commit
6.leader的选举
服务器状态:
looking:寻找leader状态,当服务器处于该状态时,他会认为集群是没有leader的,因此需要进入leader选举状态
leading:领导者状态,表明当前服务器是领导者
following:表明当前服务器为跟随着,
observing:观察者状态
服务器启动时的leader选举:
服务器运行是的leader的选举:
发起投票,传递投票数据(myid,zxid),先进行zxid比较,谁大就是谁,如果,相同,比较myid,谁大是谁(比较zxid是为了保证最后一次执行事务的机器的数据,)
7.配置观察者角色
观察者不参与集群leader的选举
不参与集群写数据的ack反馈
1.在配置文件中加入
peerType=observer
2.在集群中每一台机器中加入
server.2=192.168.2.205:2288:3388:observer
8.java API 连接 zookeeper的集群
ZooKeeper zk = new ZooKeeper("192.168.2.203:2181,192.168.2.204:2181", 5000, new Watcher() {}