zookeeper提供的通用服务
- 命名服务:确定一个集群中的节点名字
- 集群管理:加入节点的集群和加点状态实时离开
- 配置管理:系统最近加入节点的向上最新配置信息
- 节点领导者选举:选举一个节点作为镰刀这协调的目的
- 锁定和同步服务:锁定数据同时修改它,这种机制可以版主自动故障恢复,同时连接其他的分布式应用程序
- 高可靠到数据注册表:一个或几个几点的可用性的数据向下
zookeeper下载完成后,复制config目录下的zoo_simple.cfg重命名为 zoo.cfg
zoo.cfg
//服务器之间或客户端与服务器之间维持心跳的时间间隔
tickTime=2000
//超出 10*2000=20 秒,没有收到返回信息,表示连接失败
initLimit=10
//标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,不能超出 5*2000=10 秒
syncLimit=5
//日志文件保存的位置
dataDir=/tmp/zookeeper
//客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求
clientPort=2181
//server.A=B:C:D:
//A 是一个数字,表示这个是第几号服务器;
//B 是这个服务器的 ip 地址;
//C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;
//D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
server.1=10.2.143.5:2887:3887
server.2=10.2.143.36:2888:3888
server.3=10.2.143.37:2889:3889
//此处声明表示作为一个观察者角色存在
peerType=observer
//注意观察者角色的末尾,需要拼接上observer
server.4=10.2.143.38:2886:3886:observe
zookeeper的一些基本操作
操作 | 描述 |
---|---|
String create(final String path, byte data[], List acl, CreateMode createMode) | 参数: 路径、 znode内容,ACL(访问控制列表)、 znode创建类型;用途:创建znode节点 |
void delete(final String path, int version) | 参数: 路径、版本号;如果版本号与znode的版本号不一致,将无法删除,是一种乐观加锁机制;如果将版本号设置为-1,不会去检测版本,直接删除;用途:删除节点 |
Stat exists(final String path, Watcher watcher) | 参数: 路径、Watcher(监视器);当这个znode节点被改变时,将会触发当前Watcher用途:判断znode节点是否存在 |
Stat exists(String path, boolean watch) | 参数: 路径、并设置是否监控这个目录节点,这里的 watcher 是在创建 ZooKeeper 实例时指定的 watcher;判断znode节点是否存在 |
Stat setData(final String path, byte data[], int version) | 参数: 路径、数据、版本号;如果为-1,跳过版本检查用途:设置znode上的数据 |
byte[] getData(final String path, Watcher watcher, Stat stat) | 参数: 路径、监视器、数据版本等信息用途:获取znode上的数据 |
List getChildren(final String path, Watcher watcher) | 参数: 路径、监视器;该方法有多个重载用途:获取节点下的所有子节点 |
Zookeeper中的更新操作是有条件的。在使用delete或者setData操作时必须提供被更新znode的版本号,如果版本号不匹配,则更新操作失败。一般情况下设置-1即可
/*创建zookeeper连接
ZooKeeper(java.lang.String connectString, int sessionTimeout, org.apache.zookeeper.Watcher watcher)
connectString:zookeeper服务地址,例如“192.168.117.128:2181”
sessionTimeout :超时时间,单位为毫秒
watcher:实现org.apache.zookeeper.Watcher接口的实现类,需实现process(WatchedEvent watchedEvent) 方法*/
ZooKeeper zooKeeper = new ZooKeeper("192.168.117.128:2181",5000, new MyWatcher());
同步创建
create(java.lang.String path, byte[] data, java.util.List<org.apache.zookeeper.data.ACL> acl, org.apache.zookeeper.CreateMode createMode)
path:创建节点路径,需保证父节点已存在
data:节点数据
acl:权限列表
1.提供默认的权限OPEN_ACL_UNSAFE、CREATOR_ALL_ACL、READ_ACL_UNSAFE
OPEN_ACL_UNSAFE:完全开放
CREATOR_ALL_ACL:创建该znode的连接拥有所有权限
READ_ACL_UNSAFE:所有的客户端都可读
2.自定义权限
ACL aclIp = new ACL(ZooDefs.Perms.READ,new Id("ip","127.0.0.1"));
ACL aclDigest = new ACL(ZooDefs.Perms.READ| ZooDefs.Perms.WRITE,
new Id("digest", DigestAuthenticationProvider.generateDigest("id:pass")));
3.session设置权限
zk.addAuthInfo("digest", "id:pass".getBytes());
4.createMode:节点类型
PERSISTENT:持久化节点
PERSISTENT_SEQUENTIAL:持久化有序节点
EPHEMERAL:临时节点(连接断开自动删除)
EPHEMERAL_SEQUENTIAL:临时有序节点(连接断开自动删除)
异步创建
create(java.lang.String path,
byte[] data,
java.util.List<org.apache.zookeeper.data.ACL> acl,
org.apache.zookeeper.CreateMode createMode,
org.apache.zookeeper.AsyncCallback.StringCallback cb,
java.lang.Object ctx)
StringCallback cb:回调接口,执行创建操作后,结果以及数据发送到此接口的实现类中
Object ctx:自定义回调数据,在回调实现类可以获取此数据
观察触发器
可以设置观察的操作:exists,getChildren,getData
可以触发观察的操作:create,delete,setData
EventType:
NodeCreated:节点创建事件
NodeDeleted:节点被删除事件
NodeDataChanged:节点数据改变事件
NodeChildrenChanged:节点的子节点改变事件
ACL(zookeeper的访问控制列表)
ACL权限 | 允许的操作 |
---|---|
CREATE | 创建节点create(“name”) |
READ | getChildren() getData() |
WRITE | setData |
DELETE | delete(“name”)删除节点 |
ADMIN | setACL()设置权限 |
ACL都是身份验证模式、符合该模式的一个身份和一组权限的组合。
身份验证模式有三种:
-
digest:用户名,密码
-
host:通过客户端的主机名来识别客户端
-
ip: 通过客户端的ip来识别客户端