ZooKeeper的介绍以及集群环境搭建、网络编程和RPC的简单了解


ZooKeeper介绍

  • 概述

    ZooKeeper是一个分布式协调服务开源框架,主要用来解决分布式集群中应用系统的一致性问题。例如怎样避免同时操作同一数据造成脏读的问题

    ZooKeeper本质上是一个分布式的小文件存储系统(ZooKeeper上面的每个文件内容最好不要超过1M),提供基于类似文件系统的目录树方式的数据存储,并且可以对树中的节点进行有效管理,从而用来维护监控你存储的数据的状态变化,通过监控这些数据状态的变化,从而可以达到基于数据的集群管理。比如:统一命名服务(dubbo)分布式配置管理(solr的配置集中管理)分布式消息队列(sub/pub)分布式锁分布式协调等功能。
  • 架构图

    Leader:ZooKeeper集群工作的核心=。事务请求(写操作)的唯一调度处理者保证集群事务处理的顺序性,集群内部各个服务器的调度者。(对于create,setData,delete等有写操作的请求,则需要统一转发给leader处理,leader需要决定编号、执行操作,这个过程称为一个事务)

    Follower:处理客户端非事务(读操作)请求,转发事务请求给Leader,参与集群Leader选举投票,2n-1台可以做集群投票。此外,针对访问量较大的ZooKeeper集群,还可新增观察者角色。

    Observer:观察者角色。观察ZooKeeper集群的最新状态变化并将这些状态同步过来,其对于非事务请求可以进行独立处理,对于事务请求则会转发给Leader服务器进行处理。(说白了就是增加并发的读请求)


ZooKeeper基本特性

  • 全局数据一致

    最重要的特性。每个server保存一份相同的数据副本,client无论连接到哪个server,展示的数据都是一致的。
  • 可靠性

    如果消息被其中一台服务器接收,那么将被所有服务器接收。
  • 顺序性

    包括全局有序偏序两种:全局有序是指如果在一台服务器上,消息a在消息b前发布,则在所有server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,消息a必将排在消息b前面。
  • 数据更新原子性

    一次数据更新要么成功(半数以上节点成功,要么失败,不存在中间状态。
  • 实时性

    ZooKeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。

三台机器ZooKeeper的集群环境搭建

  • 概述

    ZooKeeper集群搭建指的是ZooKeeper分布式模式安装,通常由2n+1台servers组成。这是为了保证Leader选举(基于Paxos算法的实现)能够得到多数的支持,所以ZooKeeper集群的数量一般为奇数。

    ZooKeeper运行需要Java环境,所以需要提前安装jdk

  • 安装Leader+Follower模式集群的步骤

    第一步:下载ZooKeeper压缩包。下载网址:http://archive.apache.org/dist/zookeeper/. 下载完成后,上传到/export/softwares

    第二步:解压ZooKeeper到/export/servers下

cd /export/softwares

tar -zxvf zookeeper-3.4.9.tar.gz -C /export/servers/

  第三步:修改配置文件-----------进入到ZooKeeper的conf文件夹中,备份zoo_sample.cfg,创建zkdatas文件夹,编辑zoo.cfg

cd /export/servers/zookeeper-3.4.9/conf/

cp zoo_sample.cfg zoo.cfg

mkdir -p /export/servers/zookeeper-3.4.9/zkdatas/

vim 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=/export/servers/zookeeper-3.4.9/zkdatas ->路径修改为刚刚创建的文件夹
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# 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=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888 ->添加三行

  第四步:添加myid配置

在第一台机器/export/servers/zookeeper-3.4.9/zkdatas/创建一个文件,名为myid,文件内容为1
echo 1 > /export/servers/zookeeper-3.4.9/zkdatas/myid

  第五步:安装包分发并修改myid的值

在第一台机器上执行
scp -r /export/servers/zookeeper-3.4.9/ node02:/export/servers/
scp -r /export/servers/zookeeper-3.4.9/ node03:/export/servers/
在第二台机器上修改myid值为2
echo 2 > /export/servers/zookeeper-3.4.9/zkdatas/myid
在第三台机器上修改myid值为3
echo 3 > /export/servers/zookeeper-3.4.9/zkdatas/myid

  第六步:三台机器启动ZooKeeper

三台机器都要执行
/export/servers/zookeeper-3.4.9/bin/zkServer.sh start 查看启动状态
/export/servers/zookeeper-3.4.9/bin/zkServer.sh status

ZooKeeper的Shell操作

  • 客户端连接

    运行 zkCli.sh - server ip 进入命令行工具

    输入 help,输出 zk shell 提示

  • Shell操作

    创建节点    create [-s] [-e] path data acl

    其中,-s-e 分别指定节点特性、顺序或临时节点,若不指定,则表示持久节点。acl用来进行权限控制。

    创建永久节点



    创建永久顺序节点



    创建临时节点(客户端与服务端断开连接时,临时节点消失)



    创建临时顺序节点

  读取节点    ls path [watch]

           get path [watch]

           ls2 path [watch]

   与读取相关的命令有 ls 命令和 get 命令。

   ls 命令可以列出ZooKeeper指定节点下的所有子节点,只能查看指定节点下的第一级的所有子节点;

   get 命令可以获取ZooKeeper指定节点的数据内容和属性信息。

  更新节点    set path data [version]

   data就是要更新的新内容,version表示数据版本。

  删除节点    delete path data [version]

   若删除节点存在子节点,那么无法删除该节点,必须先删除子节点,再删除父节点。

   rmr path:可以递归删除节点


ZooKeeper的数据模型

  • 概述

    ZooKeeper当中每一个节点都称之为一个znode,每个znode既具有文件夹的特性,又具有文件的特性(临时节点不能有子节点)

数据结构



图中每一个节点称为一个Znode,每个Znode由3部分组成

1.stat:此为状态信息,描述该Znode的版本、权限等信息

2.data:与该Znode关联的数据

3.children:该Znode下的子节点


ZooKeeper节点的四种模型

  • PERSISTENT:永久节点
  • EPHEMERAL:临时节点
  • PERSISTENT_SEQUENTIAL:永久节点、序列化
  • EPHEMERAL_SEQUENTIAL:临时节点、序列化

ZooKeeper的watch机制

  • 概述

    ZooKeeper允许客户端向服务端注册一个 Watcher 监听,当服务端的一些事情触发了这个 Watcher,那么就会向指定客户端发送一个事件通知来实现分布式的通知功能。

    触发事件种类有很多,比如节点创建节点删除节点改变子节点改变等。

    总的来说,可以概括 Watcher 为以下三个过程客户端向服务端注册 Watcher服务端事件发生触发 Warcher客户端回调 Watcher 得到触发事件情况

  • watch机制特点

    一次性触发:事件发生触发监听,一个 Watcher Event 就会被发送到设置监听的客户端,这种效果是一次性的,后续再发生同样的事件不会再触发。

    事件封装:ZooKeeper使用 WatchedEvent 对象来封装服务端事件并传递。WatchedEvent 包含了每一个事件的三个基本属性:通知状态(KeeperState)、事件类型(EventType)和节点路径(Path)。

    event 异步发送:Watcher 的通知事件从服务端发送到客户端是异步的。

    先注册再触发:ZooKeeper中的 watch 机制,必须客户端先去服务端注册监听,这样事件发送才会触发监听,通知给客户端

  • 通知状态和事件类型

  • Shell客户端设置watch机制

    设置节点数据变动监听



    通过另一个客户端更改节点数据



    此时设置的监听节点收到通知


ZooKeeper的JavaAPI

  • 导包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>bigdata13</artifactId>
<groupId>cn.itcast.bigdata13</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion> <artifactId>day01_zk</artifactId> <dependencies>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>com.google.collections</groupId>
<artifactId>google-collections</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!--Java编译插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
  • 在IDEA关于节点的操作
package cn.itcast.zk.demo1;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.junit.jupiter.api.Test; public class zkOperate {
//以下方法
}

创建永久节点


/*
* 创建一个永久节点
* */
@Test
public void createNode() throws Exception {
//定义我们的重试机制
ExponentialBackoffRetry exponentialBackoffRetry = new ExponentialBackoffRetry(3000,3); //得到客户端
CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient("node01:2181,node02:2181,node03:2181",exponentialBackoffRetry); curatorFramework.start(); curatorFramework.create().creatingParentContainersIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/bigdata/hello/abc","helloworld".getBytes()); curatorFramework.close();
}

创建临时节点

	/*创建一个临时节点
* */
@Test
public void createTempNode() throws Exception {
ExponentialBackoffRetry exponentialBackoffRetry = new ExponentialBackoffRetry(5000,5); CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient("node01:2181,node02:2181,node03:2181",exponentialBackoffRetry); curatorFramework.start(); curatorFramework.create().creatingParentContainersIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/mytempNodenew","tempNode".getBytes()); Thread.sleep(8000); curatorFramework.close();
}

修改节点数据

	/*
修改节点数据
*/
@Test
public void updateNodeData() throws Exception {
CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient("node01:2181",new ExponentialBackoffRetry(5000,5)); curatorFramework.start(); curatorFramework.setData().forPath("/abc","bbb".getBytes()); curatorFramework.close();
}

查询节点数据

	/**
* 查询节点数据
*/
@Test
public void getData() throws Exception {
CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient("node01:2181",new ExponentialBackoffRetry(5000,5)); curatorFramework.start(); byte[] bytes = curatorFramework.getData().forPath("/bigdata/hello/abc");
String s = new String(bytes);
System.out.println(s); curatorFramework.close();
}

建立watch机制

/**
* 建立watch机制
*/
@Test
public void watchNode() throws Exception {
CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient("node01:2181",new ExponentialBackoffRetry(5000,5)); curatorFramework.start(); //通过使用TreeCache来监听我们的节点
TreeCache treeCache = new TreeCache(curatorFramework,"/abc");
treeCache.getListenable().addListener(new TreeCacheListener() {
/**
* 这个方法里面实现我们监听的逻辑,所有的监听事件都会回调这个方法
* @param curatorFramework
* @param event
* @throws Exception
*/
@Override
public void childEvent(CuratorFramework curatorFramework, TreeCacheEvent event) throws Exception {
ChildData data =event.getData();
if (null != data){
//这个type封装的是我们的事件,比如节点新增,节点修改,节点删除等各种类型的事件
TreeCacheEvent.Type type =event.getType();
switch (type){
case NODE_ADDED:
System.out.println("节点新增被我监听到了");
break;
case INITIALIZED:
System.out.println("初始化操作我监听到了");
break;
case NODE_REMOVED:
System.out.println("节点删除被我监听到了");
break;
case NODE_UPDATED:
System.out.println("节点的修改操作被我监听到了");
break;
default:
System.out.println("没监听到");
break;
} }
}
});
treeCache.start();
Thread.sleep(500000000);
}

网络编程

  • 概述

    网络编程是指用来实现网络互联的不同计算机上运行的程序间可以进行数据交换。对我们来说即如何用编程语言java实现计算机网络中不同计算机之间的通信。
  • 网络通信三要素

    IP地址

    A类:第1个8位表示网络地址,剩下3个8位表示主机地址(主要留给政府或者大型企业)

    B类:第2个8位表示网络地址,剩下2个8位表示主机地址(主要分配给中等规模的公司)

    C类:第3个8位表示网络地址,剩下1个8位表示主机地址(分配给小公司或者个人)

    D类:用于IP网络中的组播

    E类:保留作研究用

    端口号

    用于标识进程的逻辑地址,不同进程的标识

    有效端口:0-65535,其中 0-1024 系统使用或保留端口

    传输协议

    通讯的规则

    常见协议:UDP(用户数据报协议)、TCP(传输控制协议)

  • 网络模型

    网络模型一般是指OSI七层参考模型和TCP/IP五层参考模型



  • Socket机制

    概述:又称为套接字,用于描述 IP 地址和端口。应用程序通常通过 Socket 向网络发出请求或者应答网络请求。通信两端都有 Socket,数据在两个 Socket 之间通过 IO 传输。网络编程也称为 Socket 编程、套接字编程,Socket 通信是 Client/Server 模型。

    基于UDP协议的Socket通信

    核心类:DatagramSocket

    基于TCP协议的Socket通信
  • IO 通信模型

    只要有 IO 就会有阻塞或非阻塞的问题,无论这个 IO 是网络的,还是硬盘的。原因在于程序是运行在系统之上的,任何形式的IO操作发起都需要系统内核的支持。

  • BIO(阻塞模式)

    BIO 即 blocking IO,是一种阻塞的 IO。BIO 的问题在于 accept()、read()的操作点都是阻塞的。

    服务器线程发起一个 accept 动作,询问操作系统是否有新的 Socket 信息从端口 X 发送过来。注意,是询问操作系统。如果操作系统没有发现有 Socket 从指定的端口 X 来,那么操作系统就会等到。
  • NIO(非阻塞模式)

    NIO 即 non-blocking IO,是一种非阻塞的 IO。三大核心部分为:Channel(通道)、Buffer(缓冲区)、Selector(选择器)
  • 阻塞/非阻塞 同步/非同步

    阻塞和非阻塞这两个概念是程序级别的,主要研究的是如果 IO 资源没有准备好,那么程序该如何处理问题

    同步和非同步这两个概念是操作系统级别的,主要研究的是操作系统收到程序请求 IO 操作后,如果 IO 资源没有准备好,该如何响应程序的问题

RPC(Remote Procedure Call Protocol)

  • 概述

    远程过程调用协议。简单地说,就是客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个过程或函数,就像调用本地应用程序中的意义
  • 主要特质

    网络协议和网络 IO 对其透明

    信息格式对其透明

    跨语言能力
  • RPC原理

    实现 RPC 的程序包括5个部分:UserUser-stubRPCRuntimeServer-stubServer

【Hadoop离线基础总结】zookeeper的介绍以及集群环境搭建、网络编程和RPC的简单了解的更多相关文章

  1. ZooKeeper 介绍及集群环境搭建

    本篇由鄙人学习ZooKeeper亲自整理的一些资料 包括:ZooKeeper的介绍,我们要学习ZooKeeper的话,首先就要知道他是干嘛的对吧. 其次教大家如何去安装这个精巧的智慧品! 相信你能研究 ...

  2. Hadoop学习(一):完全分布式集群环境搭建

    1. 设置免密登录 (1) 新建普通用户hadoop:useradd hadoop(2) 在主节点master上生成密钥对,执行命令ssh-keygen -t rsa便会在home文件夹下生成 .ss ...

  3. kafka介绍和集群环境搭建

    kafka概念:     kafka是一个高吞吐量的流式分布式消息系统,用来处理活动流数据.比方网页的訪问量pm,日志等,既可以实时处理大数据信息     也能离线处理.     特点:       ...

  4. zookeeper集群环境搭建详细图文教程

    zookeeper集群环境搭建详细图文教程 zhoubang @ 2018-01-02 [文档大纲] 友情介绍 软件环境 注意点 环境安装 1. 新建用于存储安装包以及软件安装的目录 2. 下载安装z ...

  5. hadoop集群环境搭建之zookeeper集群的安装部署

    关于hadoop集群搭建有一些准备工作要做,具体请参照hadoop集群环境搭建准备工作 (我成功的按照这个步骤部署成功了,经实际验证,该方法可行) 一.安装zookeeper 1 将zookeeper ...

  6. 大数据 -- Hadoop集群环境搭建

    首先我们来认识一下HDFS, HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.它其实是将一个大文件分成若干块保存在不同服务器的多个节点中.通过联网 ...

  7. Hadoop集群环境搭建步骤说明

    Hadoop集群环境搭建是很多学习hadoop学习者或者是使用者都必然要面对的一个问题,网上关于hadoop集群环境搭建的博文教程也蛮多的.对于玩hadoop的高手来说肯定没有什么问题,甚至可以说事“ ...

  8. Hadoop+Spark:集群环境搭建

    环境准备: 在虚拟机下,大家三台Linux ubuntu 14.04 server x64 系统(下载地址:http://releases.ubuntu.com/14.04.2/ubuntu-14.0 ...

  9. hadoop集群环境搭建之安装配置hadoop集群

    在安装hadoop集群之前,需要先进行zookeeper的安装,请参照hadoop集群环境搭建之zookeeper集群的安装部署 1 将hadoop安装包解压到 /itcast/  (如果没有这个目录 ...

随机推荐

  1. 学习Salesforce | Einstein业务机会评分怎么玩

    Einstein 业务机会评分(Opportunity Scoring)是销售团队的得力助手,通过分数以及研究影响分数的因素,确定业务机会的优先级,赢得更多交易. Einstein 业务机会评分可以给 ...

  2. E. 数字串

    给你一个长度为 n 的数字串,找出其中位数不超过15位的不包含前导0和后导0的数 x ,使得 x+f(x) 是一个回文数,其中 f(x) 表示将 x 反转过来的数. 输入格式 多组输入,处理到文件结束 ...

  3. EOS基础全家桶(八)jungle测试网的使用

    简介 前面我们已经学习了一些EOS的基础知识了,但是在EOS主网上的很多操作(比如:抵押.赎回.买卖内存)都是需要EOS链被正式激活后才可使用,而激活EOS链还需要很多的准备操作,我打算在单独的一篇文 ...

  4. redis: 其他数据类型(八)

    1.geospatial 地理位置 有效的经度从-180度到180度 有效的纬度从-85.05112878度到85.05112878度 当坐标位置超出上述指定范围时,该命令将会返回一个错误 底层实现原 ...

  5. position的用法(top, bottom, left, right 四个定位属性配合进行使用)

    一般情况下 页面元素的定位方式是根据文档流也就是说默认的从上到下,从左到右的方式进行排列的,而将元素从文档流脱离出来显示的方式有两种,一种是 position 定位另一种是float 浮动,这里我们详 ...

  6. 堆溢出---glibc malloc

    成功从来没有捷径.如果你只关注CVE/NVD的动态以及google专家泄露的POC,那你只是一个脚本小子.能够自己写有效POC,那就证明你已经是一名安全专家了.今天我需要复习一下glibc中内存的相关 ...

  7. python os模块判断文件是否存在

    import os os.path.exists(test_file.txt)

  8. Nginx(1)---安装及基础命令

    一.简述 Nginx是一个高性能WEB服务器,除它之外Apache.Tomcat.Jetty.IIS,它们都是Web服务器 Nginx  相对基它WEB服务有什么优势:Tomcat.Jetty 面向j ...

  9. 【认证与授权】Spring Security的授权流程

    上一篇我们简单的分析了一下认证流程,通过程序的启动加载了各类的配置信息.接下来我们一起来看一下授权流程,争取完成和前面简单的web基于sessin的认证方式一致.由于在授权过程中,我们预先会给用于设置 ...

  10. css的变量教程,更强大的css

    当微软宣布 Edge 浏览器将支持 CSS 变量.这个重要的 CSS 新功能,所有主要浏览器已经都支持了.本文全面介绍如何使用它,你会发现原生 CSS 从此变得异常强大. 一.变量的声明 声明变量的时 ...