协调服务的功能

在分布式架构中,每个服务器或者服务之间信息的协调和管理是非常有必要的。

常见的分布式协调服务有Google的Chubby,Apache的ZooKeeper

我们先从zookeeper的几个功能来了解zookeeper


1.名称服务:什么是名称服务?比如DNS将域名映射到一个IP、手机通讯录将人命映射到手机号...诸如此类功能就是名称服务,在分布式系统中,zookeeper的名称服务是通过名称来跟踪一些服务器或者服务的运行状态

2.分布式锁:在一台机器一个服务上,我们可以用高并发中学到的对象锁,重入锁等知识,来完成不同线程对同一资源的顺序调度。那么在分布式架构下,我们面对的问题要复杂得多,这时候不同进程对于同一资源的调度,就只能使用分布式锁来完成协调,zookeeper提供一种简单的方式来实现分布式互斥(distributed mutexes

3.配置管理:zookeeper通过集中式存储和管理分布式系统的配置,加入加入一个新的服务节点(znode),那么可以立即使用zookeeper的最新配置,也可以通过一个zookeeper客户端来更改集中式配置

4.领导者选举:当分布式系统中一个服务出现故障(比如停机),zookeeper通过领导者选举来转移故障,使系统继续运行

zookeeper的安装


首先在linux上安装zookeeper,必须保证linux上装有jdk,因为zookeeper是在jvm上运行的

使用wget下载后,zoo_sample.cfg副本,命名为zoo.cfg

此步骤的原因是:Zookeeper 在启动时会找zoo.cfg这个文件作为默认配置文件

启动zookeeper(在解压根目录下输入):./bin/zkServer.sh start(关闭stop)

export ZOOKEEPER_HOME=/zookeeperexport PATH=$PATH:$ZOOKEEPER_HOME/bin

这样便可直接使用zkServer.sh start启动

zookeeper的UI模型


zookeeper的数据模型是由zondes构成的,你可以把zookeeper的数据模型看成是操作系统中的目录结构,每个目录的文件夹名就是一个zonde,在每个文件夹(znode)下都有一些存储数据,类似于目录下的文件,但是在zookeeper下这些数据一般很小(1M以下),只是用来存储一些必要信息

每个zookeeper服务器下都存储了znodes,这也遵循了分布式的原则,因为zookeeper本身也是一个分布式应用,此外每个zookeeper服务器都维护了一个事务日志(记录的是所有的请求)

zk客户端与zk服务器的交互

在启动一个zk服务器的时候,我们先来看下它的配置

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper/data
dataLogDir=/tmp/zookeeper/log
clientPort=2181#端口2888由对等的zookeeper服务器使用,用于互相通信#端口3888用于领导者选举server.1=106.15.205.155:2888:3888

clientPort是给客户端连接用的端口dataDir是节点数据存储的目录dataLogDir是日志输出的目录,不指定的话默认在dataDir下

/tmp/zookeeper/data目录下新建一个文件myid,并存入一个值为11

server.1=106.15.205.155:2888:3888这行代码中106.15.205.155是Ip(写自己的)2888是领导者选举端口3888是zookeeper服务器间的通信端口

打开zookeeper服务器(关闭为stop):

zkServer.sh start

打印出以下日志说明zookeeper启动成功:

ZooKeeper JMX enabled by defaultUsing config: /zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

启动zk客户端:

zkCli.sh

成功连接之后,便可以对zkServer进行节点操作

1.增加节点并且给予success数据:

create /znode1 success

2.查看该zk服务器znode明细:

ls /

3.查看指定节点详情:

get znode1

4.设置节点(比如修改数据:sunnces变为error)

set /znode1 error

5.关闭zkCli:

close

6.删除节点

delete /znode1

同样可以使用java代码来实现对zookeeper服务器的操作Scalable io in java

监听日志

我们监听的是zookeeper/bin下zookeeper.out日志

tail -f zookeeper.out

以上便是zookeeper服务器的简单介绍