欢迎来到彩票365专业数据平台_彩票365网站_彩票365新版! 联系我们 网站地图

彩票365专业数据平台_彩票365网站_彩票365新版

0379-65557469

彩票365网站
全国服务热线
0379-65557469

电话: 0379-65557469
0379-63930906
0379-63900388 
0379-63253525   
传真: 0379-65557469
地址:洛阳市洛龙区开元大道219号2幢1-2522、2501、2502、2503、2504、2505室 

彩票365网站
当前位置: 首页 | 咨询案例 > 彩票365网站

彩票365专业数据平台-zookeeper入门到实战

作者:admin 发布时间:2019-05-14 20:16:07 浏览次数:199
打印 收藏 关闭
字体【
视力保护色

一.zookeeper介绍

ZooKeeper 是一个开源的分布式和谐服务,由yahoo创立,是 Google Chubby 的开源完成。分布式应用程序能够依据 ZooKeeper 完成比如数据发布/订阅、负载均衡、命名服务、分布式和谐/告诉、集群办理、Master 推举、装备保护,姓名服务、分布式同步、分布式锁和分布式行列等功能。

数据模型

ZooKeeper 答应分布式进程经过同享的层次结构命名空间进行彼此和谐,这与标准文件体系相似。称号空间由 ZooKeeper 中的数据寄存器组成,称为 Znode,这些相似于文件和目录。与典型文件体系不同,ZooKeeper 数据保存在内存中,这意味着 ZooKeeper 能够完成高吞吐量和低推迟。

次序拜访

关于来自客户端的每个更新恳求,ZooKeeper 都会分配一个大局仅有的递加编号。这个编号反响了一切业务操作的先后次序,应用程序能够运用 ZooKeeper 这个特性来完成更高层次的同步原语。这个编号也叫做时刻戳—zxid(ZooKeeper Transaction Id)。

可构建集群

为了确保高可用,最好是以集群形状来布置 ZooKeeper,这样只需集群中大部分机器是可用的(能够忍受必定的机器毛病),那么 ZooKeeper 自身依然是可用的。客户端在运用 ZooKeeper 时,需求知道集群机器列表,经过与集群中的某一台机器树立 TCP 衔接来运用服务。客户端运用这个 TCP 链接来发送恳求、获取成果、获取监听事情以及发送心跳包。假如这个衔接反常断开了,客户端能够衔接到别的的机器上。

  • 上图中每一个 Server 代表一个装置 ZooKeeper 服务的服务器。组成 ZooKeeper服务的服务器都会在内存中保护当时的服务器状况,而且每台服务器之间都相互坚持着通讯。集群间经过 Zab 协议(Zookeeper Atomic Broadcast)来坚持数据的一致性。Zookeeper服务器有三种人物:Leader、Follower、Observer,集群中的一切机器经过一个 Leader 推举进程来选定一台称为 “Leader” 的机器。Leader 既能够为客户端供给写服务又能供给读服务。除了 Leader 外,Follower 和Observer 都只能供给读服务。Follower 和Observer 仅有的差异在于Observer 机器不参加 Leader 的推举进程,也不参加写操作的“过半写成功”战略,因而 Observer 机器能够在不影响写功能的情况下提高集群的读功能。在 ZooKeeper 中,首要依靠 ZAB 协议来完成分布式数据一致性,依据该协议,ZooKeeper完成了一种主备形式的体系架构来坚持集群中各个副本之间的数据一致性。

作业原理:

  1. Zookeeper的中心是原子播送,这个机制确保了各个server之间的同步。完成这个机制的协议叫做Zab协议。
  2. Zab协议有两种形式,它们分别是康复形式和播送形式。当服务发动或许在领导者溃散后,Zab就进入了康复形式,当领导者被推举出来,且大大都server的完成了和leader的状况同步今后,康复形式就完毕了。状况同步确保了leader和server具有相同的体系状况。一旦leader现已和大都的follower进行了状况同步后,他就能够开端播送音讯了,即进入播送状况。这时分当一个server参加zookeeper服务中,它会在康复形式下发动,发现leader,并和leader进行状况同步。待到同步完毕,它也参加音讯播送。
  3. Zookeeper服务一向维持在Broadcast状况,直到leader溃散了或许leader失掉了大部分的followers支撑。

Leader推举:

  1. 播送形式需求确保proposal(提议)被按次序处理(leader来履行写操作),因而zk选用了递加的业务id号(zxid)来确保。一切的提议都在被提出的时分加上了zxid。完成中zxid是一个64为的数字,它高32位是epoch用来标识leader联系是否改动,每次一个leader被选出来,它都会有一个新的epoch。低32位是个递加计数。
  2. 当leader溃散或许leader失掉大大都的follower,这时分zk进入康复形式,康复形式需求从头推举出一个新的leader,让一切的server都康复到一个正确的状况。每个Server发动今后都问询其它的Server它要投票给谁。关于其他server的问询,server每次依据自己的状况都回复自己引荐的leader的id和上一次处理业务的zxid(体系发动时每个server都会引荐自己),收到一切Server回复今后,就核算出zxid最大的话哪个Server,并将这个Server相关信息设置成下一非必须投票的Server。核算这进程中取得票数最多的的sever为获胜者,假如获胜者的票数超越对折,则改server被选为leader。不然,持续这个进程,直到leader被推举出来。

二.运用Zookeeper

1 //客户端衔接zookeeper服务器
2 ZooKeeper zkClient = new ZooKeeper(CONNECT_STR, 50000, new Watcher() {
3 @Override
4 public void process(WatchedEvent watchedEvent) {
5 //监控服务节点改变
6 System.out.println("sssss");
7 }
8 });
9
10 //获取根节点下的一切节点
11 List nodeList= zkClient.getChildren("/",null);
12
13 System.out.println(nodeList.toString());
14
15 //Stat isExists= zkClient.exists(LOCK_ROOT_PATH,null);
16 //在test父节点下创立子节点
17 String lockPath = zkClient.create("/test/why","why".getBytes(),
18 ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);

代码中需求留意的是假如父节点不存在,会报反常,一起父节点不能是暂时节点。

Znode:

  1. 在 ZooKeeper中,“节点"分为两类,第一类彩票365专业数据平台-zookeeper入门到实战同样是指构成集群的机器,咱们称之为机器节点,第二类则是指数据模型中的数据单元,咱们称之为数据节点一ZNode。ZooKeeper 将一切数据存储在内存中,数据模型是一棵树(Znode Tree),由斜杠(/)的进行切割的途径,便是一个
  2. Znode,例如/foo/path1。每个上都会保存自己的数据内容,一起还会保存一系列特点信息。
  3. zookeeper有四类节点:PERSISTENT(耐久的)、EPHEMERAL(暂时的)、PERSISTENT_SEQUENTIAL(耐久化次序编号目录节点)、EPHEMERAL_SEQUENTIAL(暂时化次序编号目录节点)

Session:

  1. Session 指的是 ZooKeeper 服务器与客户端会话。在 ZooKeeper 中,一个客户端衔接是指客户端和服务器之间的一个 TCP 长衔接。
  2. 客户端发动的时分,首要会与服务器树立一个 TCP衔接,从第一次衔接树立开端,客户端会话的生命周期也开端了。经过这个衔接,客户端能够经过心跳检测与服务器坚持有用的会话,也能够向Zookeeper 服务器发送恳求并承受呼应,一起还能够经过该衔接接纳来自服务器的 Watch 事情告诉。
  3. Session 的 sessionTimeout值用来设置一个客户端会话的超时时刻。当因为服务器压力太大、网络毛病或是客户端自动断开衔接等各种原因导致客户端衔接断开时,只需在sessionTimeout规则的时刻内能够从头衔接上集群中恣意一台服务器,那么之前创立的会话依然有用。在为客户端创立会话之前,服务端首要会为每个客户端都分配一个sessionID。因为 sessionID 是 Zookeeper 会话的一个重要标识,许多与会话相关的运行机制都是依据这个sessionID 的。因而,无论是哪台服务器为客户端分配的 sessionID,都必须确保大局仅有。

Watcher:是 ZooKeeper 中的一个很重要的特性。ZooKeeper 答应用户在指定节点上注册一些 Watcher,而且在一些特定事情触发的时分,ZooKeeper 服务端会将事情告诉到感兴趣的客户端上去,该机制是 ZooKeeper 完成分布式和谐服务的重要特性。

Version: Zookeeper 的每个 ZNode 上都会存储数据,对应于每个 ZNode,Zookeeper都会为其保护一个叫作 Stat 的数据结构。Stat 中记录了这个 ZNode 的三个数据版别,分别是:version(当时节点版别)、cversion(当时节点的子节点版别)、aversion(当时节点的ACL版别)

ACL:ZooKeeper 选用 ACL(AccessControlLists)战略来进行权限操控,相似于 UNIX 文件体系的权限操控。ZooKeeper 界说了 5 种权限:CREATE/READ/WRITE/DELETE/ADMIN

三.经过zookeeper完成分布式锁

package com.why;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;

import java.io.IOException;
import java.util.Collections;
import java.util.List;

/*
* 分布式锁
* */
public class DistributeLock {

private static final String LOCK_ROOT_PATH = "/test";
//private static final String LOCK_NODE_NAME = "Lock";

private static ZooKeeper _zkClient;

static {
try {
_zkClient = new ZooKeeper("192.168.6.132:2181", 500000, null);
} catch (IOException e) {
e.printStackTrace();
}
}


public static String getLock() {
try {

//System.out.println(_zkClient.getChildren("/",false));

String lockPath = _zkClient.create( "/test/why", null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
//System.out.println(lockPath);
//System.out.println(_zkClient.getChildren(LOCK_ROOT_PATH,false));
if (tryLock(lockPath))
return lockPath;
else
return null;
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}

private static boolean tryLock(String lockPath) throws KeeperException, InterruptedException {
List lockPaths = _zkClient.getChildren(LOCK_ROOT_PA彩票365专业数据平台-zookeeper入门到实战TH, false);
Collections.sort(lockPaths);
int index=lockPaths.indexOf(lockPath.substring(LOCK_ROOT_PATH.length()+1));
if(index==0){
//取得锁
return true;
}
else{
String preLockPath="/"+lockPaths.get(index-1);

Watcher watcher=new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
synchronized (this){
//唤醒线程
notifyAll();
}
}
};

Stat stat=_zkClient.exists(preLockPath,watcher);

if(stat==null){
return tryLock(lockPath);
}else{
synchronized (watcher){
watcher.wait();
}
return tryLock(lockPath);
}

}

}

public static void closeZkClient() throws InterruptedException {
_zkClient.close();
}

public static void releaseLock(String lockPath) throws Keep彩票365专业数据平台-zookeeper入门到实战erException, InterruptedException {
_zkClient.delete(lockPath,-1);
}
}

测验:

package com.why;

import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooKeeper;

import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MultiThreadDemo {

private static int counter = 0;

public static void plus() throws InterruptedException {
Thread.sleep(500);
counter++;
//System.out.prin彩票365专业数据平台-zookeeper入门到实战tln(counter);
}

public static int Count(){
return counter;
}

public static void main(String[] args) throws IOException, KeeperException, InterruptedException {

ExecutorService executor= Executors.newCachedThreadPool();
final int num=10;
for(int i=0;i
executor.submit(new Runnable() {
@Override
public void run() {
try {
String path = DistributeLock.getLock();
System.out.println(path);
plus();
DistributeLock.releaseLock(path);
System.out.println(Count());
} catch (InterruptedException | KeeperException e) {
e.printStackTrace();
}
}
});
}
executor.shutdown();

}
}

最终

我整理了一些互联网公司java程序员在面试中涉及到的绝大部分架构面试题及答案做成了文档和架构视频材料免费共享给我们(包含Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术材料)也能够重视取得更多的面试材料,节约我们搜集的时刻!

获取材料的方法:转发+私信【材料】收取!

版权所有:洛阳市建设工程咨询有限责任公司 联系人:李经理 电话: 地址:洛阳市洛龙区开元大道219号2幢1-2522、2501、2502、2503、2504、2505室
版权所有 彩票365专业数据平台 皖ICP备140131167号-9