1. zookeeper是Apache公司开源的产品。可以去官网下载
该软件无需安装,解压缩后目录里会包含.jar文件,这个jar包可以用来进行java开发,只需要在开发工程师将其build path进入便可!
2. zookeeper API 存在的不足之处:
(1)Zookeeper的Watcher是一次性的,每次触发之后都需要重新进行注册;
(2)Session超时之后没有实现重连机制;
(3)异常处理繁琐,Zookeeper提供了很多异常,对于开发人员来说可能根本不知道该如何处理这些异常信息;
(4)只提供了简单的byte[]数组的接口,没有提供针对对象级别的序列化;
(5)创建节点时如果节点存在抛出异常,需要自行检查节点是否存在;
(6)删除节点无法实现级联删除;
3. 使用第三方的客户端来使用zookeeper,第三方的客户端是对zookeeper API使用的再一次封装,是开发者忽略一些细节的开发工作,因为这
些工作已经被第三方的客户端进行的封装,开发者只需要添加 第三方客户端的maven依赖,或者自行导入jar包纪念性调用便可。
maven依赖的参数可以去maven中央仓库查询获得,添加到pom文件便可。
zookeeper AP: http://zookeeper.apache.org/doc/r3.5.1-alpha/api/index.html
zkclient API: http://helix.apache.org/apidocs/reference/org/apache/helix/manager/zk/ZkClient.html
http://javadox.com/com.101tec/zkclient/0.4/overview-summary.html
curator API: http://curator.apache.org/apidocs/overview-summary.html
I0Itec特性一览:
1) 提供了zookeeper断链重连的特性------这个特性似乎每个开发者都会设计,而且代码风格几乎"如出一辙"..在大部分zookeeper使用场景中,我们都要求它能够在断链的时候,重新建立连接,无论session失效与否.
2) 便捷的event监听器机制-------向ZNODE节点注册watch,每个开发者都使用过,尽管watch机制并不能确保数据变更的实时 性..watch-event属于"即发即失",因为我们需要得到event时候,再去注册一遍,这也是一个非常繁琐的事情,I0Itec- zkClient提供了event-listener的小技巧,可以帮助我们"解脱".
3) zookeeper异常处理-------zookeeper中繁多的Exception,以及每个Exception所需要关注的事情各有不同,你应该记得那一堆try-catch给你带来的烦恼;I0Itec简单的做了封装.
4) data序列化------简单的data序列化.(Serialzer/Deserialzer)
4. Znode节点存储数据的说明
ZooKeeper虽然提供了在节点存储数据的功能,但它并不将自己定位为一个通用的数据库,也就是说,你不应该在节点存储过多的数据。Zk规定节点的数据大小不能超过1M,但实际上我们在znode的数据量应该尽可能小,因为数据过大会导致zk的性能明显下降。如果确实需要存储大量的数据,一般解决方法是在另外的分布式数据库(例如redis)中保存这部分数据,然后在znode中我们只保留这个数据库中保存位置的索引即可。
5. zookeeper在集群模式下,为什么服务器的数量是 单数?
这个问题,在蹄片博文中得到了很好的解释。简单来世就是算法需要,在如下的博客中有简单的例子论证。
https://www.cnblogs.com/LeeScofiled/p/7390937.html
6. zoo.cfg文件中两个参数的说明
1)dataDir: 该参数五无默认值,必须配置,不支持系统属性方式配置。
该参数用于配置zookeeper服务器存储快照文件的目录。默认情况下,如果没有配置dataLogDir,那么事务日志也会存储在这个目录中。考虑到事务日志的写性能直接影响zookeeper整体的服务能力,因此建议同时通过参数dataLogDir来配置zookeeper事务日志的存储目录。
2)dataLogDir:该参数有默认参数值,默认参数就是dataDir的指,可以不配置,不支持系统属性方法配置。该参数用于配置zookeeepr服务器存储事务日志文件的目录。如果条件允许,可以将事务日志的存储配置在一个单独的磁盘上。事务日志对磁盘的性能要求非常高,为了保证数据的一致性,zookeeper在返回客户端事务请求响应之前,必须将本次请求对应的日志写入到磁盘中。因此事务日志的写入性能直接决定了zookeeper在处理事务请求时的吞吐。
7. 关于connectString的一些说明
无论是用zookeeper的原生API,还是第三方客户端zkclient,curator,都要建立与zookeeper服务器的连接,参数就是connectString,服务器地址列表。
通常是这样的一个字符串:
“127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183” (本地伪集群)或是其他。
从这个地址串中我们可以看出,ZooKeeper客户端允许我们将服务器的所有地址都配置在一个字符串上,于是一个问题就来了:ZooKeeper客户端在连接服务器的过程中,是如何从这个服务器列表中选择服务器机器的呢?是按序访问,还是随机访问呢?
参考博客:https://blog.csdn.net/wo541075754/article/details/68067872
https://blog.csdn.net/lihao21/article/details/51810395
https://blog.csdn.net/en_joker/article/details/79310801 (第7个问题参考博客)