2015.08.16zookepper

 

Zookeeper

是 Google 的 Chubby一个开源的实现,是 Hadoop 的分布式协调服务(如同小区里面的供水、电的系统)

它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等(在大数据框架后面默默地工作,它可以完成大数据计算框架在它们主要业务外的辅助性业务)

 

 

Zookepper的角色

数据同步的工具

 

 

事务性地同步数据

领导者(leader),负责进行投票的发起和决议,更新系统状态

学习者(learner),包括跟随者(follower)和观察者(observer),follower用于接受客户端请求并想客户端返回结果,在选主过程中参与投票

Observer(知道数据同步的状态,使用它完成编程一些事情)可以接受客户端连接,将写请求转发给leader,但observer不参加投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度

客户端(client),请求发起方

 

Zookeeper的特性

Zookeeper是简单的

Zookeeper是富有表现力的

Zookeeper具有高可用性(集群结构,leader挂了,会自动选出新的leader)

Zookeeper采用松耦合交互方式

Zookeeper是一个资源库(存储数据)

 

Zookeeper的数据模型

层次化的目录结构,命名符合常规文件系统规范(树状的文件系统)

每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识

节点Znode可以包含数据和子节点(有序性,可分布式排序,永久性节点和临时节点(/TMP),临时节点随着建立节点的连接的消失而消失,可监控这个节点监控这个连接),但是EPHEMERAL类型的节点不能有子节点

Znode中的数据可以有多个版本,比如某一个路径下存有多个数据版本,那么查询这个路径下的数据就需要带上版本

客户端应用可以在节点上设置监视器

节点不支持部分读写,而是一次性完整读写

 

文件系统

 

Zookeeper的节点

Znode有两种类型,短暂的(ephemeral)和持久的(persistent)

Znode的类型在创建时确定并且之后不能再修改

短暂znode的客户端会话结束时,zookeeper会将该短暂znode删除,短暂znode不可以有子节点

持久znode不依赖于客户端会话,只有当客户端明确要删除(通过敲代码)该持久znode时才会被删除

Znode有四种形式的目录节点,PERSISTENT、PERSISTENT_SEQUENTIAL(临时有序性)、EPHEMERAL、EPHEMERAL_SEQUENTIAL(持久有序性)

 

Zookeeper的安装和配置(单机模式)

解压:tar -zxvf zookeeper-3.4.6.tar.gz -C .(stable稳定版,加点是当前路径)

在conf目录下创建一个配置文件zoo.cfg(mv zoo_sample.cfg zoo.cfg)


dataDir=/usr/local/zookeeper-3.4.6/data (新建个data文件zk存放各个节点数据的路径,编辑配置文件将路径配置进去)

Clientport =2181(端口号)

 

  • tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
  • dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
  • clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
  • initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 5个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
  • syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒
  • server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。

 

启动ZooKeeper的Server:sh bin/zkServer.sh start

如果想要关闭,输入:zkServer.sh stop

Jps查看到QuorumPeerMain (quorum是法定人数,定额的意思, peer是对等的意思)

 

(连接命令行客户端)zkCli.sh,客户端连接zookepper建立了一个session(有状态的,建立关闭可监控,zk对其监控)

(查看)ls /

(zk是文件系统)ls /zookeeper

ls /zookeeper/quota

(创建)create /crxy crxy.cn(文件名,文件内容)

(查看内容)get /crxy(信息有内容,创建时间,版本,文件大小)

(修改内容)set /crxy www.crxy.cn

(删除)rmr/delete

 

 

 

Java客户端

(connectingString连接字符串(连接zookepper,选第二个),sessionTimeout会话超时(网络原因会连接不上),watcher监视器,监视节点和其数据的变化,在前面交叉点一下),需要一个实现,newwatcher,它是一个接口,创建了一个匿名类(不是外部类),其里面有个process方法,形参WatchedEvent(监控事件),通过监听的类型体现出来,会抛异常,使用完close

(eclipse操作,光标移到创建的形参里面,第一个是创建本地变量。Shift+home/end选定当前行,Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候) )

 

(如果连接不上关物理机和虚拟机的防火墙。关虚拟机)systemctl stop firewalld.service

 

 

 

 

 

Zookeeper的安装和配置(集群模式)

创建myid文件,server1机器的内容为:1,server2机器的内容为:2,server3机器的内容为:3

在conf目录下创建一个配置文件zoo.cfg,
dataDir=/usr/local/zk/data                      server.1=server1:2888:3888     (第一个1表示zk节点,在/data目录下myid文件写入自身的标示(如这里的数字1)3888是选举leader的端口号)              server.2=server2:2888:3888                   server.3=server3:2888:3888

(在213的机器上scp -rp zookeeper-3.4.6/ crxy212.crxy/usr/local)

(scp -rp zookeeper-3.4.6/ crxy211.crxy/usr/local)

(到212 zk目录下vi /data/myid改为212)

(依次启动zk目录下bin/zkSever.sh start,启动成功会有日志信息,)(查看身份bin/zkServer.sh status)

 

 

 

    package zookeeper1;

 

import
java.io.IOException;

 

import
org.apache.zookeeper.KeeperException;

import org.apache.zookeeper.WatchedEvent;

import org.apache.zookeeper.Watcher;

import org.apache.zookeeper.ZooKeeper;

        

        //使用客户端连接zookeeper

public
class Test1 {

 

 

 

    private
static String connectString = "192.168.1.99:2181";

    private
static
int
sessionTimeout = 999999;

 

    public
static
void main(String[] args) throws Exception {

 

        

        Watcher watcher = new Watcher() {

            

            public
void process(WatchedEvent event) {

                System.out.println("监听听到的事情"+event);

            }

        };

            

        final ZooKeeper zooKeeper = new ZooKeeper(connectString , sessionTimeout , watcher );

        

                System.out.println("获得连接"+zooKeeper);

                //获取值,路径,形参watcher,之前创建的对象就可以传回值,统计信息设定为null

                zooKeeper.setData("/crxy", "haha".getBytes(),-1);//修改值。可以使用-1指定版本号

                final
byte[] data = zooKeeper.getData("/crxy", watcher, null);

                System.out.println("读取的值"+new String(data));//字节数组转换为字符串,new String

                

                zooKeeper.close();        

    }

 

}

Zookeeper应用场景

 

分布式队列

    FIFO(先进先出)

    Barrier(同步队列)

共享锁

集群管理

     leader选举

命名服务

分布式应用配置项的管理等

 

分布式FIFO队列

 

FIFO设计思路

1.在/queue-fifo的目录下创建 SEQUENTIAL 类型的子目录 /x(i),这样就能保证所有成员加入队列时都是有编号的。

 

2.出队列时通过 getChildren( ) 方法可以返回当前所有的队列中的元素,然后消费其中最小的一个,这样就能保证FIFO

 

Barrier(同步队列)

当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达,这种是同步队列。

例如:远程会议,所有人到齐了,才开始

 

共享锁

Zookeeper 可以实现跨进程或者在不同 Server 之间的共享锁

(JVM同一个进程实现锁通过synchronized,lock)

Zookepper(2015.08.16笔记)的更多相关文章

  1. Storm(2015.08.12笔记)

    2015.08.12Storm   一.Storm简介 Storm是Twitter开源的一个类似于Hadoop的实时数据处理框架.   Storm能实现高频数据和大规模数据的实时处理. 官网资料显示s ...

  2. Redis(2015.08.03笔记一)

    一.redis简介 Redis是一种面向"键/值"对数据类型的内存数据库,可以满足我们对海量数据的读写需求. redis的键只能是字符串 redis的值支持多种数据类型: 1:字符 ...

  3. http://www.cnblogs.com/alipayhutu/archive/2012/08/16/2643098.html

    http://www.cnblogs.com/alipayhutu/archive/2012/08/16/2643098.html

  4. 2021.08.16 P1260 工程规划(差分约束)

    2021.08.16 P1260 工程规划(差分约束) 重点: 1.跑最短路是为了满足更多约束条件. P1260 工程规划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 造 ...

  5. 2021.08.16 P1078 文化之旅(最短路)

    2021.08.16 P1078 文化之旅(最短路) 题意: n个地,k个信仰,每个地都有自己的信仰,信仰之间会相互排斥,同信仰之间也会相互排斥,有m条路,问从s到t的最短距离是多少? 有一位使者要游 ...

  6. 2021.08.16 P1300 城市街道交通费系统(dfs)

    2021.08.16 P1300 城市街道交通费系统(dfs) P1300 城市街道交通费系统 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 城市街道交费系统最近创立了.一 ...

  7. 2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意)

    2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意) P1363 幻象迷宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 幻象迷宫可以认为是无限 ...

  8. 2015.03.16,外语,读书笔记-《Word Power Made Easy》 00 “如何最大限度的利用本书”学习笔记

    备注:蓝色表明是自己学习或笔记的部分,红色表明特别的地方,例如自己不理解或需要重点关注的地方.加粗单词表明是要加入生词库学习的词语.单词后面括号中的蓝色部分,是单词的解释和音标. 1.this is ...

  9. 2015.04.16,外语,读书笔记-《Word Power Made Easy》 11 “如何辱骂敌人” SESSION 28

    TEASER PREVIEW (Teaser 片头,预告片,玩笑 Teaser trailer:预告片) 如何称呼这些人: 完全盲目的服从(obedience [әu'bi:diәns] n. 服从, ...

随机推荐

  1. windows下搭建GO开发环境

    1. Go下载 由于某些原因golang.org不能访问,可以使用下面的镜像地址进行下 http://fossies.org/windows/misc/ 我的环境是win8 64位,所以选择go1.7 ...

  2. 【4Large-Style】前端框架设计——Button 的设计思路

    Button 的设计 Button 作为基本的 Web 元素,看似简单,却需要非常用心的设计,因为 Button 作为按钮,是具有多个不同的状态,每种状态都基本上需要进行一些特殊的优化设计,以让组件更 ...

  3. linux python3.5.0安装并替代centos自带的python

    CentOS自带2.7.3版本的Python,旧版本无法及时支持新功能,所以要安装更高版本的Python3.5.0. 1.下载#wget https://www.python.org/ftp/pyth ...

  4. Python学习--20 Web开发

    HTTP格式 HTTP协议是基于TCP和IP协议的.HTTP协议是一种文本协议. 每个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的. HTTP ...

  5. bzoj1492--斜率优化DP+cdq分治

    显然在某一天要么花完所有钱,要么不花钱. 所以首先想到O(n^2)DP: f[i]=max{f[i-1],(f[j]*r[j]*a[i]+f[j]*b[i])/(a[j]*r[j]+b[j])},j& ...

  6. python抓取NBA现役球员基本信息数据

    链接:http://china.nba.com/playerindex/ 所需获取JSON数据页面链接:http://china.nba.com/static/data/league/playerli ...

  7. iOS开发之Runtime常用示例总结

    经常有小伙伴私下在Q上问一些关于Runtime的东西,问我有没有Runtime的相关博客,之前还真没正儿八经的总结过.之前只是在解析第三方框架源码时,聊过一些用法,也就是这些第三方框架中用到的Runt ...

  8. 锋利的jQuery中的事件与动画

    奋夜的奋斗  ----  事件与动画 ----  来自地狱的战镰 小小的单词难不倒我们哦!!!!!!!    bind:绑定     unbind:接触绑定    toggle:栓牢   fadeou ...

  9. TCP详解

    1. 数据进入协议栈的封装过程 2. TCP连接的三次握手 3. TCP连接的三次握手和关闭时的四次握手 各个状态的意义如下: LISTEN - 侦听来自远方TCP端口的连接请求: SYN-SENT ...

  10. Spring源码解析三:IOC容器的依赖注入

    一般情况下,依赖注入的过程是发生在用户第一次向容器索要Bean是触发的,而触发依赖注入的地方就是BeanFactory的getBean方法. 这里以DefaultListableBeanFactory ...