折腾了一周多终于跑起来了,贵在实践。


参考地址:

指南地址
http://zookeeper.apache.org/doc/r3.3.3/zookeeperAdmin.html
入门
http://www.tuicool.com/articles/JN73YrM
集群和伪集群
http://coolxing.iteye.com/blog/1871009

关于zookeeper的一些介绍


引子

云计算越来越流行的今天,单一机器处理能力已经不能满足我们的需求,不得不采用大量的服务集群。服务集群对外提供服务的过程中,有很多的配置需要随时更新,服务间需要协调工作,这些信息如何推送到各个节点?并且保证信息的一致性和可靠性?

众所周知,分布式协调服务很难正确无误的实现,它们很容易在竞争条件和死锁上犯错误。如何在这方面节省力气?Zookeeper是一个不错的选择。 Zookeeper背后的动机就是解除分布式应用在实现协调服务上的痛苦。本文在介绍Zookeeper的基本理论基础上,用Zookeeper实现了一 个配置管理中心,利用Zookeeper将配置信息分发到各个服务节点上,并保证信息的正确性和一致性。
Zookeeper是什么?

引用官方的说法:“Zookeeper是一个高性能,分布式的,开源分布式应用协调服务。它提供了简单原始的功能,分布式应用可以基于它实现更高级 的服务,比如同步,配置管理,集群管理,名空间。它被设计为易于编程,使用文件系统目录树作为数据模型。服务端跑在java上,提供java和C的客户端 API”。
Zookeeper总体结构

Zookeeper服务自身组成一个集群(2n+1个服务允许n个失效)。Zookeeper服务有两个角色,一个是leader,负责写服务和数据同步,剩下的是follower,提供读服务,leader失效后会在follower中重新选举新的leader。

Zookeeper逻辑图如下,

    客户端可以连接到每个server,每个server的数据完全相同。
    每个follower都和leader有连接,接受leader的数据更新操作。
    Server记录事务日志和快照到持久存储。
    大多数server可用,整体服务就可用。

Zookeeper数据模型

Zookeeper表现为一个分层的文件系统目录树结构(不同于文件系统的是,节点可以有自己的数据,而文件系统中的目录节点只有子节点)。

数据模型结构图如下,

圆形节点可以含有子节点,多边形节点不能含有子节点。一个节点对应一个应用,节点存储的数据就是应用需要的配置信息。
Zookeeper 特点

    顺序一致性:按照客户端发送请求的顺序更新数据。
    原子性:更新要么成功,要么失败,不会出现部分更新。
    单一性 :无论客户端连接哪个server,都会看到同一个视图。
    可靠性:一旦数据更新成功,将一直保持,直到新的更新。
    及时性:客户端会在一个确定的时间内得到最新的数据。

Zookeeper运用场景

    数据发布与订阅 (我的业务用到这个特性,后面会有详细介绍)

应用配置集中到节点上,应用启动时主动获取,并在节点上注册一个watcher,每次配置更新都会通知到应用。

    名空间服务

分布式命名服务,创建一个节点后,节点的路径就是全局唯一的,可以作为全局名称使用。

    分布式通知/协调

不同的系统都监听同一个节点,一旦有了更新,另一个系统能够收到通知。

    分布式锁

Zookeeper能保证数据的强一致性,用户任何时候都可以相信集群中每个节点的数据都是相同的。一个用户创建一个节点作为锁,另一个用户检测该节点,如果存在,代表别的用户已经锁住,如果不存在,则可以创建一个节点,代表拥有一个锁。

    集群管理

每个加入集群的机器都创建一个节点,写入自己的状态。监控父节点的用户会受到通知,进行相应的处理。离开时删除节点,监控父节点的用户同样会收到通知。


常用命令的解释

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 相关的路径。



1. 启动ZK服务:       sh bin/zkServer.sh start
 2. 查看ZK服务状态: sh bin/zkServer.sh status
 3. 停止ZK服务:       sh bin/zkServer.sh stop
 4. 重启ZK服务:       sh bin/zkServer.sh restart



############################################################

集群启动shell脚本 

#!/bin/sh

 # crate file
 touch /opt/redis/zoo1/data/myid
 #write myid
 echo "1" >> /opt/redis/zoo1/data/myid

 echo "myid=" && cat /opt/redis/zoo1/data/myid
 #start zoo1
 cd /opt/redis/zoo1/zookeeper-3.4.8 && bin/zkServer.sh start
 # crate file
 touch /opt/redis/zoo2/data/myid
 #write myid
 echo "2" >> /opt/redis/zoo2/data/myid
 #start zoo2
 cd /opt/redis/zoo2/zookeeper-3.4.8 && bin/zkServer.sh start
 # crate file
 touch /opt/redis/zoo3/data/myid
 #write myid
 echo "3" >> /opt/redis/zoo3/data/myid
 #start zoo3
 cd /opt/redis/zoo2/zookeeper-3.4.8 && bin/zkServer.sh start


 echo "启动完毕,查看启动状态" 
 cd /opt/redis/zoo1/zookeeper-3.4.8 && bin/zkServer.sh status


集群停止的脚本


#!/bin/sh

 rm -rf /opt/redis/zoo1/data/myid
 #stop zoo1 
 cd /opt/redis/zoo1/zookeeper-3.4.8 && ./bin/zkServer.sh stop

 rm -rf /opt/redis/zoo2/data/myid
 #stop zoo2
 cd /opt/redis/zoo2/zookeeper-3.4.8 && ./bin/zkServer.sh stop

 rm -rf /opt/redis/zoo3/data/myid
 #stop zoo3
 cd /opt/redis/zoo2/zookeeper-3.4.8 && ./bin/zkServer.sh stop