程序员小董的专栏

其实,我是个写代码的

zookeeper学习总结

最近一两天,一直在看zookeeper,自己也感觉头昏脑涨的。
现记录一下,最近的所得:

安装与配置:

http://blog.csdn.net/morning99/article/details/40426133


几个知识点

集群与节点
我们知道,因为因为系统的不断扩张,我们一台物理机器已经满足不了需求,此时,我们用多台机器组成一个集群,他们上面运行的代码是一致的。
节点:在zookeeper中,数据的存储是以树状形式组织的。
加入我们有3个节点(a,b,c),4台机子(甲乙丙丁)组成集群。
那么一共有12个节点么?
不是的,这3个节点被4台机器所共用。
我再第甲机子上改了a节点,那么丙机子上的a节点也会实时同步。
上面的知识很简单,我自己却走了很大的弯路才认识到。


命令行

1. 显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容
2. 显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据
3. 创建文件,并设置初始内容: create /zk "test" 创建一个新的 znode节点“ zk ”以及与它关联的字符串
4. 获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串
5. 修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置
6. 删除文件: delete /zk 将刚才创建的 znode 删除
7. 退出客户端: quit
8. 帮助命令: help
ZooKeeper 常用四字命令:
ZooKeeper 支持某些特定的四字命令字母与其的交互。它们大多是查询命令,用来获取 ZooKeeper 服务的当前状态及相关信息。用户在客户端可以通过 telnet 或 nc 向 ZooKeeper 提交相应的命令
1. 可以通过命令:echo stat|nc 127.0.0.1 2181 来查看哪个节点被选择作为follower或者leader
2. 使用echo ruok|nc 127.0.0.1 2181 测试是否启动了该Server,若回复imok表示已经启动。
3. echo dump| nc 127.0.0.1 2181 ,列出未经处理的会话和临时节点。
4. echo kill | nc 127.0.0.1 2181 ,关掉server
5. echo conf | nc 127.0.0.1 2181 ,输出相关服务配置的详细信息。
6. echo cons | nc 127.0.0.1 2181 ,列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息。
7. echo envi |nc 127.0.0.1 2181 ,输出关于服务环境的详细信息(区别于 conf 命令)。
8. echo reqs | nc 127.0.0.1 2181 ,列出未经处理的请求。
9. echo wchs | nc 127.0.0.1 2181 ,列出服务器 watch 的详细信息。
10. echo wchc | nc 127.0.0.1 2181 ,通过 session 列出服务器 watch 的详细信息,它的输出是一个与 watch 相关的会话的列表。
11. echo wchp | nc 127.0.0.1 2181 ,通过路径列出服务器 watch 的详细信息。它输出一个与 session 相关的路径。
http://www.cnblogs.com/kunpengit/p/4045334.html
http://blog.csdn.net/gyflyx/article/details/18652913#t0
如果是windows下 启动的命令就是zkCli.cmd -server 10.1.39.43.4180


实验代码

我先说一下,如果我在实验的zookeeper集群里,增加了某个节点,代码正常运行完毕后,没有删除那个节点。那么即使你关闭zookeeper的服务,你下次启动的时候,那个节点的信息还在。
package com.hcr.web.controller;


import java.util.List;


import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;




/**
 * http://greemranqq.iteye.com/blog/2171449
 * @author Administrator
 *
 */
public class ZookeeperTest {

    // 根节点
    public static final String ROOT = "/root-ktv";




    public static void main(String[] args) throws Exception {
        // 创建一个与服务器的连接
        ZooKeeper zk = new ZooKeeper("localhost:2181", 30000, new Watcher() {
            // 监控所有被触发的事件
            public void process(WatchedEvent event) {
                System.out.println("状态:" + event.getState()+":"+event.getType()+":"+event.getWrapper()+":"+event.getPath());
            }
        });
        // 创建一个总的目录ktv,并不控制权限,这里需要用持久化节点,不然下面的节点创建容易出错
        zk.create(ROOT, "root-ktv".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);


        // 然后杭州开一个KTV ,       PERSISTENT_SEQUENTIAL 类型会自动加上 0000000000 自增的后缀
        zk.create(ROOT+"/杭州KTV", "杭州KTV".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);


        // 也可以在北京开一个,       EPHEMERAL session 过期了就会自动删除
        zk.create(ROOT+"/北京KTV", "北京KTV".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);


        // 同理,我可以在北京开多个,EPHEMERAL_SEQUENTIAL  session 过期自动删除,也会加数字的后缀
        zk.create(ROOT+"/北京KTV-分店", "北京KTV-分店".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);


        // 我们也可以 来看看 一共监视了多少家的ktv
        List<String> ktvs = zk.getChildren(ROOT, true);
        System.out.println("PPPP");
       
        for(String node : ktvs){
          System.out.println(node);
        }
        System.out.println("开始删除");
        for(String node : ktvs){
            // 删除节点
            zk.delete(ROOT+"/"+node,-1);
            Thread.sleep(3000);
            System.out.println("已经删除一个");
        }
        // 根目录得最后删除的 
        zk.delete(ROOT, -1);
        zk.close();
    }
}


以上摘自:
http://greemranqq.iteye.com/blog/2171449


这里还有一个包装了zookeeper增删改查的代码
http://www.oschina.net/code/snippet_1386372_46627


关于api
http://www.cnblogs.com/haippy/archive/2012/07/19/2600032.html


应用场景

在分布式应用中, 我们经常同时启动多个server, 调用方(client)选择其中之一发起请求.
分布式应用必须考虑高可用性和可扩展性: server的应用进程可能会崩溃, 或者server本身也可能会宕机. 当server不够时, 也有可能增加server的数量. 总而言之, server列表并非一成不变, 而是一直处于动态的增减中.
那么client如何才能实时的更新server列表呢? 解决的方案很多, 本文将讲述利用ZooKeeper的解决方案.
解决方案如下:
http://coolxing.iteye.com/blog/1871520/


其他应用场景

http://nileader.blog.51cto.com/1381108/1040007

其他参考资料

http://blog.csdn.net/xinguan1267/article/details/38422149


感谢glt
glt是谁?
我女朋友
她人很好的
我们关系也很好的
即使在我写博客的时候 我偶尔也会想她
我很喜欢她



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dlf123321/article/details/49925809
文章标签: zookeeper 分布式
个人分类: 分布式
上一篇转换xml格式的短信记录
下一篇tomcat那些事
想对作者说点什么? 我来说一句

zookeeper 系列整理总结

2013年03月08日 287KB 下载

zookeeper书籍

2014年03月07日 9.92MB 下载

Zookeeper中文教程(非扫描版)

2018年03月29日 871KB 下载

Zookeeper入门视频教程

2017年12月23日 51B 下载

zookeeper使用总结

2016年07月23日 71KB 下载

Zookeeper学习总结

2017年09月19日 736KB 下载

没有更多推荐了,返回首页

关闭
关闭