Zookeeper 简介 搭建

0 maven中使用zk 3.4.6的依赖信息如下

http://www.mvnrepository.com/artifact/org.apache.zookeeper/zookeeper/3.4.6  

1 应用场景:

hbase分布式部署 和 Hadoop2的自动切换

2 一些地址:

官网地址:http://zookeeper.apache.org/

下载地址: http://www.apache.org/dyn/closer.cgi/zookeeper/

官网文档学习地址: http://zookeeper.apache.org/doc/trunk/

 3  概念简介:

 Zookeeper 是 Google 的 Chubby一个开源的实现,是 Hadoop 的分布式协调服务
它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等

 zk是一个基本命令的集合。

a) 为何使用:

大部分分布式应用需要一个主控、协调器或控制器来管理物理分布的子进程(如资源、任务分配等)
目前,大部分应用需要开发私有的协调程序,缺乏一个通用的机制
协调程序的反复编写浪费,且难以形成通用、伸缩性好的协调器
ZooKeeper:提供通用的分布式锁服务,用以协调分布式应用

a.1) 特点   (zk如何从中抽取到一套机制来满足各个不同主从分布式系统(hadoop hbase)的需要)

简单

高可用

松耦合的交互

是一个资源库

b) zookeeper的角色:

领导者(leader),负责进行投票的发起和决议,更新系统状态
学习者(learner),包括跟随者(follower)和观察者(observer),follower用于接受客户端请求并想客户端返回结果,在选主过程中参与投票
Observer可以接受客户端连接,将写请求转发给leader,但observer不参加投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度
客户端(client),请求发起方,类比mysql的sqlyog工具

 c) zk集群为奇数原因: 能够快速实现投票选举leader

d) zk目的是同步,借助于集群的存储数据是手段,   zk之间是通过网络端口http传输的。

zk客户端连接到zk集群后,并在zk集群中创建节点后,然后zk客户端可以在创建好的节点上存放数据,当客户端在zk1节点上写上数据后,那么zk集群的各个服务器上数据将会被同步,即使在客户端在上传数据到zk1时网络中断,如果zk1对应节点上能看到数据,那么zk集群也会有相同节点并存放相同数据。

e) zk监视器:  监控节点以及节点上的数据变化。 
比如 某个节点坏掉  就会触发zk监视器, 或者某个节点数据变化了,也会触发zk监视器。

客户端用到那个znode节点,就会在当前节点上启动监视器。

f) zk也是一个文件系统。

4 搭建:

// 0  解压和重命名
[root@master local]# tar -zxvf zookeeper-3.4.5.tar.gz 
[root@master local]# mv zookeeper-3.4.5 zk
// 1 设置环境变量 增加zk部分
[root@master zk]# vi /etc/profile    
export JAVA_HOME=/usr/local/jdk
export HADOOP_HOME=/usr/local/hadoop
export HIVE_HOME=/usr/local/hive
export ZK_HOME=/usr/local/zk
export PATH=.:$ZK_HOME/bin:$HIVE_HOME/bin:$HADOOP_HOME/bin:$JAVA_HOME/bin:$PATH
[root@master zk]# source /etc/profile  

// 2 给zk增加Java环境变量:
[root@master conf]# ls
configuration.xsl  log4j.properties  zoo_sample.cfg
[root@master conf]# mv zoo_sample.cfg  zoo.cfg
[root@master conf]# ls
configuration.xsl  log4j.properties  zoo.cfg
[root@master conf]# 

// 3 修改 zoo.cfg的信息, 如下,此目录存放myid+zk的节点数据信息+zookeeper.out
dataDir=/usr/local/zk/data

server.0=master:2888:3888
server.1=sliver103:2888:3888
server.2=sliver104:2888:3888
// 4 创建data目录,并创建myid文件添加内容:
[root@master zk]# mkdir data
[root@master data]# more myid //0是zk server标识,对应zoo.cfg下的server.0(server.是zk固定写法)
0

// 5 拷贝zk到sliver103, sliver104上
[root@master zk]# scp -r /usr/local/zk sliver103:/usr/local/
[root@master zk]# scp -r /usr/local/zk sliver104:/usr/local/

// 6 修改sliver103, sliver104的 zk/data/myid, 分别修改为1,2
修改操作通过vi myid即可

// 7 拷贝master的/etc/profile到sliver103, sliver104上
[root@master zk]# scp /etc/profile sliver103:/etc/
[root@master zk]# scp /etc/profile sliver104:/etc/
并分别在sliver103,104上执行 # source /ect/profile 

// 8 在三个节点上分别执行命令zkServer.sh start

[root@master bin]# zkServer.sh start
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@master bin]# ls


[root@sliver103 bin]# zkServer.sh start
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

[root@sliver104 bin]# zkServer.sh start
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED


// 9 检验,在三个节点上分别执行命令zkServer.sh status, 可以看到此三个节点通过选举在sliver103上产生了leader


[root@master bin]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo.cfg
Mode: follower


[root@sliver103 bin]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo.cfg
Mode: leader


[root@sliver104 bin]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo.cfg
Mode: follower

 

注: 如果安装的是单节点zk,那么 zkServer.sh status后的结果为  Mode: standalone

sh zkCli.sh后会看到 welcome to Zookeeper!
 ininiating session  
 session setablishment complete on server localhost/127.0.0.1:2181,initiating session.
 这样基于session可以知道这种客户端连接下是能够监控到状态的。 

 2181是客户端连接服务端的通讯端口。

 

5 使用简介:

4.1) 进入master机器客户端界面,创建并赋值一个变量
[root@sliver103 bin]# zkCli.sh
Welcome to ZooKeeper!
.....
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0] 
[zk: localhost:2181(CONNECTED) 0] dfddfdfdffdf  //随便敲击命令,zk会输出如下命令提示信息:
ZooKeeper -server host:port cmd args
        connect host:port
        get path [watch]  // 获取数值
        ls path [watch]   // 查看子集
        set path data [version] // 设置数值
        rmr path
        delquota [-n|-b] path
        quit 
        printwatches on|off
        create [-s] [-e] path data acl  // 创建路径
        stat path [watch] 
        close 
        ls2 path [watch]
        history 
        listquota path
        setAcl path acl
        getAcl path
        sync path
        redo cmdno
        addauth scheme auth
        delete path [version]  // 删除路径
        setquota -n|-b val path

[zk: localhost:2181(CONNECTED) 5] create /myzk  myzookeeperdata  // 在zk根目录下创建目录myzk  内容为myzookeeperdata
Created /myzk
[zk: localhost:2181(CONNECTED) 6] ls /                         
[myzk, zookeeper]

[zk: localhost:2181(CONNECTED) 8] get /myzk   // 获取数据  下面更多的是版本时间信息
myzookeeperdata
cZxid = 0x100000002
ctime = Sat Dec 20 20:54:04 PST 2014
mZxid = 0x100000002
mtime = Sat Dec 20 20:54:04 PST 2014
pZxid = 0x100000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 15
numChildren = 0
[zk: localhost:2181(CONNECTED) 9] delete /myzk    删除节点
[zk: localhost:2181(CONNECTED) 10] get /myzk
Node does not exists: /test

10.2) 进入sliver103主机,获取get /myzk:   zk保证了数值的一致性
[root@sliver103 ~]# cd /usr/local/zk/bin
[root@sliver103 bin]# zkCli.sh 
[zk: localhost:2181(CONNECTED) 0] get /myzk
myzookeeperdata
cZxid = 0x100000002
ctime = Sat Dec 20 20:54:04 PST 2014
mZxid = 0x100000002
mtime = Sat Dec 20 20:54:04 PST 2014
pZxid = 0x100000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 15
  6  zk启动后对应的进程名称为: 16343 QuorumPeerMain   6.1 zoo.cfg 配置的dataDir,此目录存放myid+zk的节点数据信息+zookeeper.out, 如下图:


    6.2 Java客户端操作zk代码, maven工程见上传附件:  注意使用 zk为 3.4.6, 如果使用3.4.5版本在pom.xml中增加zk依赖时会增加很多别的依赖配置, 要下载更多,因此测试工程使用 zk 3.4.6版本
public class zookeepertest {

	/**
	 * @throws IOException 
	 * 
	 */
	public static void main(String[] args) throws Exception {
         // 2000是超时时间 单位是ms
		
	 ZooKeeper zk = new ZooKeeper("hadoop3:2181", 
			 2000, new Watcher() { 
		            // 监控所有被触发的事件
		            public void process(WatchedEvent event) { 
		                System.out.println("已经触发了" + event.getType() + "事件!"); 
		            } 
		        }); 
	// System.out.println(zk);
	 //System.out.println(zk.getChildren("/", false));
	System.out.println(zk.getData("/zmtest",false,null)); // 以字节码打印
	}

}
      7  zk 启动的时候出现的错误 Error contacting service. It is probably not running:      启动zk时候, jps可以看到进程号,但是 zkServer.sh status 则报错如上,     处理方式如下:  参考链接 http://blog.sina.com.cn/s/blog_72827fb101018yn9.html    这里我是用 7.1 方式解决的,以前使用集群的时候 都没有创建logs 不知道这次重新部署为什么出现这个错误 .....    7.1   在zookeeper路径下创建文件夹 logs    7.2  或者         
解决办法修改zkServer.sh脚本,等待dataDir目录创建完毕后再将pid写入。找到相应的语句块,替换为下面的语句,注意替换的范围
...
    if [ $? -eq 0 ]
    then
      while [ ! -d `dirname $ZOOPIDFILE` ]
      do 
        sleep 1;
      done
      if /bin/echo -n $zkpid > "$ZOOPIDFILE"
      then
        sleep 1
        echo STARTED
      else
        echo FAILED TO WRITE PID
        exit 1
      fi

进行测试:
    $zkServer.sh start
    $echo ruok | nc namenode 2181
    imok
是zookeeper在说 I’m OK,可以把namenode换成集群里其它的主机名测试是否组网成功
在每台机器上分别执行zkServer.sh start,启动后通过jps看java进程是否出现QuoRumPeerIn,出现后再通过zkServer.sh status命令查看zookeeper的状态。然后echo ruok | nc namenode 2181,看是否会输出imok
而且集群中的zookeeper需要每台机器都启动zookeeper,保证每台机器的3888端口都是开通的
      7.3   或者:
发现是nc版本的问题,
导致zkServer.sh status出错……各种无语!
解决方法:
打开zkServer.sh
找到
status)
    STAT=`echo stat | nc localhost $(grep clientPort "$ZOOCFG" | sed -e 's/.*=//') 2> /dev/null| grep Mode`
在nc与localhost之间加上 -q 1 (是数字1而不是字母l)
如果已存在则去掉
   8 附上zk单节点搭建的别人链接: Zookeeper 安装和配置  

猜你喜欢

转载自chengjianxiaoxue.iteye.com/blog/2168799