为什么使用Zookeeper?
大部分分布式应用需要一个主控、协调器或控制器来管理物理分布的子进程(如资源、任务分配等)
目前,大部分应用需要开发私有的协调程序,缺乏一个通用的机制
协调程序的反复编写浪费,且难以形成通用、伸缩性好的协调器
ZooKeeper:提供通用的分布式锁服务,用以协调分布式应用
Zookeeper能帮我们做什么?
Hadoop2.0,使用Zookeeper的事件处理确保整个集群只有一个活跃的NameNode,存储配置信息等.
HBase,使用Zookeeper的事件处理确保整个集群只有一个HMaster,察觉HRegionServer联机和宕机,存储访问控制列表等.
Zookeeper的特性
Zookeeper是简单的
Zookeeper是富有表现力的
Zookeeper具有高可用性
Zookeeper采用松耦合交互方式
Zookeeper是一个资源库
Zookeeper单机
单机模式:
1) 首先下载zookeeper压缩包
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz
2) 解压缩
首先创建文件夹,这里放到/user/local/zk/cloud/文件夹下
tar -zxvf zookeeper-3.4.8.tar.gz -C /user/local/zk/cloud/zookeeper1
tar -zxvf zookeeper-3.4.8.tar.gz -C /user/local/zk/cloud/zookeeper2
tar -zxvf zookeeper-3.4.8.tar.gz -C /user/local/zk/cloud/zookeeper3
3)运行单价环境
跳转到对应目录:cd /usr/local/zk/cloud/zookeeper1/conf
修改配置文件名:mv zoo_sample.cfg zoo.cfg
跳转到对应目录:cd /usr/local/zk/cloud/zookeeper1/bin
启动zookeeper :./zdServer.sh start
4) 使用java 客户端连接ZooKeeper
跳转到对应目录:cd /usr/local/zk/cloud/zookeeper1/bin
启动zookeeper客户端 :./zkCli.sh -server 127.0.0.1:2181
启动完成之后测试一下:
create /name “xiangping”
get /name :如果可以得到值就可以了
5) 关闭
跳转到对应目录:cd /usr/local/zk/cloud/zookeeper1/bin
关闭zookeeper :./zdServer.sh stop
Zookeeper集群(单机中做集群)
所谓 “伪分布式集群” 就是在,在一台PC中,启动多个ZooKeeper的实例。“完全分布式集群” 是每台PC,启动一个ZooKeeper实例。
ZooKeeper不存在明显的master/slave关系,各个节点都是服务器,leader挂了,会立马从follower中选举一个出来作为leader.
由于没有主从关系,也不用配置SSH无密码登录了,各个zk服务器是自己启动的,互相之间通过TCP端口来交换数据
创建环境目录
1.切换到/usr/local/zk/cloud/路径下,把解压好的zookeeper复制三份,zookeeper1,zookeeper2,zookeeper3
2.创建三个myid文件:
~ echo “1” > /usr/local/zk/cloud/zookeeper1/myid
~ echo “2” > /usr/local/zk/cloud/zookeeper2/myid
~ echo “3” > /usr/local/zk/cloud/zookeeper3/myid
注意:myid只能为数字,因为我试验了下,包含英文的话zk启动不起来,抛出异常
3.修改配置文件
vi /usr/local/zk/cloud/zookeeper1/conf/zoo.cfg
initLimit=10
syncLimit=5
dataDir=/usr/local/zk/cloud/data/zookeeper1
clientPort=2181
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
vi /usr/local/zk/cloud/zookeeper2/conf/zoo.cfg
initLimit=10
syncLimit=5
dataDir=/usr/local/zk/cloud/data/zookeeper2
clientPort=2182
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
vi /usr/local/zk/cloud/zookeeper3/conf/zoo.cfg
initLimit=10
syncLimit=5
dataDir=/usr/local/zk/cloud/data/zookeeper3
clientPort=2183
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
启动每台机器
cd /usr/local/zk/cloud/
/zookeeper1/bin/zkServer.sh start
/zookeeper2/bin/zkServer.sh start
/zookeeper3/bin/zkServer.sh start
测试zookeeper集群:
cd /usr/local/zk/cloud/
/zookeeper1/bin/zkCli.sh -server 127.0.0.1:2181
启动完成之后:
create /name “xiangping”
cd /usr/local/zk/cloud/
/zookeeper2/bin/zkCli.sh -server 127.0.0.1:2182
启动完成之后:
get /name : 如果可以得到—”xiangping”就ok了
cd /usr/local/zk/cloud/
/zookeeper3/bin/zkCli.sh -server 127.0.0.1:2183
启动完成之后:
get /name : 如果可以得到—”xiangping”就ok了
zookeeper集群(多台机器集群)
我们使用三台机器搭建Zookeeper集群
设置ip地址与机器名分别为:
192.168.100.104 zookeeper1
192.168.100.105 zookeeper2
192.168.100.106 zookeeper3
1、 修改机器IP 可以在网络连接中直接使用鼠标操作
2、 修改机器名vim /etc/sysconfig/network 修改如下配置:HOSTNAME=机器名称,HOSTNAME=为你的机器名称,三台机器分别设置为:zookeeper1、zookeeper2、zookeeper3
3、 修改机器名称与IP地址对应关系:vim /etc/hosts
添加如下配置:
192.168.100.104 zookeeper1
192.168.100.105 zookeeper2
192.168.100.106 zookeeper3
4、 解压下载好的zookeeper-3.4.5.tar.gz
修改zoo.cfg文件
dataDir=/usr/local/zk/cloud/zookeeper-3.4.5/data
在文件中添加配置:
server.1=hadoop4:2888:3888
server.2=hadoop5:2888:3888
server.3=hadoop6:2888:3888
zook.cfg文件内容如下:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/zookeeper/data
# the port at which the clients will connect
clientPort=2181
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current
/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=zookeeper1:2888:3888
server.2=zookeeper2:2888:3888
server.3=zookeeper3:2888:3888
1.tickTime:CS通信心跳时间
Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。
tickTime=2000
2.initLimit:LF初始通信时限
集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。
initLimit=5
3.syncLimit:LF同步通信时限
集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)。
syncLimit=2
4.dataDir:数据文件目录
Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。
dataDir=/usr/zookeeper/data
5.clientPort:客户端连接端口
客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
clientPort=2181
6.服务器名称与地址:集群信息(服务器编号,服务器地址,LF通信端口,选举端口)
这个配置项的书写格式比较特殊,规则如下:
server.N=YYY:A:B
server.1=zookeeper1:2888:3888
server.2=zookeeper2:2888:3888
server.3=zookeeper3:2888:3888
5、 创建myid文件:在zoo.cfg中设置的dataDir对应的目录中(/usr/local/zk/cloud/zookeeper-3.4.5/data)创建myid文件
并添加如下内容:echo “N” > myid (N为唯一id(最方便可以写机器名称最后一位数字))
添加内容以后:touch myid
注意三台机器都要设置
6、 启动zookeeper进入zookeeper-3.4.5的bin目录:./zkServer.sh start 注意三台机器都要启动
使用 ./zkServer.sh status 可以查看状态,三台机器中有一台会是leader状态其它是follower状态
7、 测试zookeeper
进入zookeeper-3.4.5的bin目录:./zkCli.sh
创建一个文件 create /name “xiangping”
使用另外一台机器登录zookeeper: ./zkCli.sh
get /name -如果能获取到xiangping就可以了