Zookeeper使用

一、准备条件:

  1. 系统中安装java  rpm -ivh jdk-7u45-linux-i586.rpm
  2. 如果没有java则需要安装1.6版本以上的JDK

如果安装JDK,需要在/etc/profile中增加:

JAVA_HOME=/usr/java/jdk1.7.0_45

CLASSPATH=.:$JAVA_HOME/lib/tools.jar

PATH =$JAVA_HOME/bin:$PATH

export JAVA_HOME CLASSPATH PATH

  1. 如果防火墙未关闭,则需要关闭防火墙: service iptables stop
  2. 2181端口被占用,需要等待客户端释放该端口的占用
  3. 需要清除日志文件,不然启动之后会占用大量内存

二、安装cppunit1.10.2

1.解压缩 tar –xvzf

2../configure

3.make && make install

4.ACLOCAL=”aclocal –I/usr/local/share/aclocal/” autoreconf -if

5. autoreconf –if

 

三、安装zookeeper

1.进入/home/server1/zookeeper-3.4.5/zookeeper-3.4.5/src/c目录下,

2. ./configure

3.make && make install

4.修改/etc/profile,增加export LD_LIBRARY_PATH=/usr/local/lib

5.再root权限下执行export LD_LIBRARY_PATH=/usr/local/lib或者ldconfig

 

四、配置(伪)集群服务

  1. 一台机器上跑三个server,如在/home/server1、/home/server2、/home/server3;分别放置zookeeper解压缩文件

  2. 在每个server上都配置好zoo.cfg文件

   如:我的目录是/home/server1/zookeeper-3.4.5/zookeeper-3.4.5/conf/zoo.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=/tmp/zookeeper

dataDir=/home/server1/data

dataLogDir=/home/server1/dataLog

 

# the port at which the clients will connect

clientPort=2181(伪集群中每个server的监听端口必须不一致,否则有的服务启动不了

#

# 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=127.0.0.1:2888:3888myid1

server.2=127.0.0.1:2889:3889myid2

server.3=127.0.0.1:2890:3890myid3

 

6、配置每个server的myid文件

文件位置在zoo.cfg中配置的data目录,如我的为:dataDir=/home/server/data

myid的值与zoo.cfg中的server.x一致

 

Zookeeper其它介绍

Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理。

Zookeeper集群中,主要分为三者角色,而每一个节点同时只能扮演一种角色,这三种角色分别是:

(1)Leader 接受所有Follower的提案请求并统一协调发起提案的投票,负责与所有的Follower进行内部的数据交换(同步);

(2)Follower 直接为客户端服务并参与提案的投票,同时与Leader进行数据交换(同步);

(3)Observer 直接为客户端服务但并不参与提案的投票,同时也与Leader进行数据交换(同步);

                                                图1 zookeeper集群整体架构

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

 

Paxos算法:是一个基于消息传递的一致性算法。CAP:一致性(CONSISTENCY)、可用性(AVAILABILITY)、分区容忍性(PARTITION TOLERANCE)。

         CAP理论并非严格的三选二,大多数情况下,A和C是可以兼得的,因为大多数情况下,P都不存在。P只有在结点之间通信延迟大于可接受的范围时才出现(结点之间开始近似隔离,状态开始不一致),即P一旦出现,我们选择继续提供服务那么状态就肯定不一致,也就等于放弃了C;我们选择不提供服务,那么就等于放弃了A。通俗一点,P并不是目标,也不是手段,它是伴随着“多结点,网络,数据,共享”的要求而必然出现的,出现的原因是因为网络的不可靠性及结点通信延迟(延迟的原因可能是由于硬件,网络,或者压力太大而无法及时响应)。

节点

挥发节点

计数节点

Watch监测功能

 

常用C API接口

 1. zhandle_t *zookeeper_init(const char *host, watcher_fn fn,

                                 int recv_timeout,

                                 const clientid_t * clientid,

                                 void *context, int flags);

2. zookeeper_close(zhandle_t * zh);

3. int zoo_exists(zhandle_t * zh, const char *path, int watch,

                      struct Stat *stat);

4. int zoo_delete(zhandle_t * zh, const char *path, int version);

5. int zoo_set(zhandle_t * zh, const char *path,

                   const char *buffer, int buflen, int version);

6. int zoo_get(zhandle_t * zh, const char *path, int watch,

                   char *buffer, int *buffer_len, struct Stat *stat);

7. int zoo_get_children(zhandle_t * zh, const char *path,

                            int watch, struct String_vector *strings);

 

其它一致性数据库

OpenReplica (Python)

Doozer (Go)

三种开源实现比较

 

ZooKeeper

OpenReplica

Doozer

功能

  1. leader选举(满足)
  2. 配置管理一致性(满足)
  3. Watcher机制(满足)
  4. 顺序一致性:客户端的更新将以请求发送的次序被应用。
  5. 原子性:更新要么成功,要么失败,没有部分更新。
  6. 单一系统镜像:无论连接到哪个服务器,客户端将看到一样的视图。
  7. 可靠性:更新操作的结果将是持续的,直到客户端覆盖了更新。
  8. 及时性:在某个时间范围内,客户端视图确保是最新的。

 

  1. 命名服务
  2. 数据库主机选举
  3. 配置一致性

性能

  1. 设计目标:简单、冗余、有序、快速
  2. 在读多写少场合更能发挥其特效(读写比10:1),在写的过程中需要消耗时间做一致性工作(集群复制)
  3. 将数据放在内存中来提高性能
  4.  

 

 

资源消耗

由于一致性协议带来的额外网络交互,消息开销,以及本地log的IO开销,再加上ZK本身每1000条批量处理1次的优化策略,写入的平均响应时间总会在50-60ms之上。但是整体的TPS还是可观的。单个写入数据的体积越大,响应时间越长,TPS越低,这也是普遍规律了。压测过程中log文件对磁盘的消耗很大。实际运行中应该使用自动脚本定时删除历史log和snapshot文件。

 

 

成熟度

  1. 用户众多,是目前最流行的分布式锁服务
  2. 开源的,而且满足企业级稳定性
  3. 相关技术文档丰富

1.可利用资源较少,技术文档较少

1.主分支已经不再活跃,fork分支有持续更新

编程语言

基于 JRE, 提供 Java/C 两种API接入

Python

Go

适用场景

  1. 数据发布与订阅(配置中心):例如全局的配置信息,服务式服务框架的服务地址列表等就非常适合使用。
  2. 负载均衡:消息中间件中发布者和订阅者的负载均衡,linkedin开源的KafkaMQ和阿里开源的metaq都是通过zookeeper来做到生产者、消费者的负载均衡。
  3. 命名服务(Naming Service):通过调用ZK提供的创建节点的API,能够很容易创建一个全局唯一的path,这个path就可以作为一个名称。阿里巴巴集团开源的分布式服务框架Dubbo中使用ZooKeeper来作为其命名服务,维护全局的服务地址列表
  4. 分布式通知/协调:ZooKeeper中特有watcher注册与异步通知机制,能够很好的实现分布式环境下不同系统之间的通知与协调,实现对数据变更的实时处理。使用方法通常是不同系统都对ZK上同一个znode进行注册,监听znode的变化(包括znode本身内容及子节点的),其中一个系统update了znode,那么另一个系统能够收到通知,并作出相应处理
  5. 集群管理与Master选举:利用ZooKeeper有两个特性,就可以实时另一种集群机器存活性监控系统:1.客户端在节点 x 上注册一个Watcher,那么如果 x的子节点变化了,会通知该客户端。2.创建EPHEMERAL类型的节点,一旦客户端和服务器的会话结束或过期,那么该节点就会消失。3. Master选举则是zookeeper中最为经典的应用场景
  6. 分布式锁:这个主要得益于ZooKeeper为我们保证了数据的强一致性。锁服务可以分为两类,一个是保持独占,另一个是控制时序。

 

  1. 当数据变化时,它立刻通知接入的客户端(不缓存),对于那些很少更新,但是希望更新发生时实时性高的客户端来说是非常理想的。
  2. 它永远都不会将数据写入持久化文件。维护在内存当中

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值