Zookeeper(CP)

以集群的方式【leader和follower】为分布式应用提供协调服务、负责存储和管理大家都关系的数据,接受观察者注册、消息分发等服务

特点:
  1. 只要有半数以上的节点存活就能保证zookeeper的集群正常工作

  2. 每一个Client保存一份相同的数据副本

  3. 来自同一个client的跟新请求可以顺序执行

  4. 数据更新原子性,且在一定时间范围内,client能读到最新的数据

  5. 软负载均衡:可以让访问数最少的服务器去处理最新服务器请求

启动命令

#启动zk服务器,查询zk服务器状态
./zkServer.sh status
./zkServer.sh start path/to/zoo.config
./zkServer.sh stop
#连接服务器
./zkCli.sh

客户端命令行

create treeNode data #在某个节点下存放数据
create -s treeNode data #有序号的节点,记录节点创建的先后顺序,没有从零开始
ls TreeNode # 获取某个树节点下的所有数据
delete TreeNode #删除节点,如果下面还有子节点是无法删除的
rmr Tree #删除某个子树 get treeNode #获取某个节点下的数据
get treeNode watch #注册对某个节点修改的监听,只会有效一次
set treeNode data #改变值
get path #获取某个树形结构下的值
get -w path #获取某个树形结构下的值,并监听一次变化
helo #帮助手册
quit#退出
短暂数据:
create -e treeNode data #在某个节点下存放数据,当前客户端与服务器断开则节点消失
节点参数:

czxid:创建该节点的事务ID、mzxid:最后更新的事务ID、cversion:节点的修改次数、dataversion:数据变化号

节点类型【树形结构】

持久节点,顺序【名字递增】&非顺序:persistent、persistent_sequential,除了在内存中,在磁盘中也会保存一份

临时节点,顺序&非顺序:ephemeral、ephemeral_sequential 短暂节点在与客户端断开连接后,创建的节点自己删除了。其原理是通过ping去保活,如果断开,则会发生session-timeOut,顺序的临时节点适合用来充当分布式锁。相比redis集群而言,zookeeper集群具备更好的数据一致性。另外临时节点不允许创建子节点

容器节点:当没有子节点时,会被服务器删除【默认60s检查一次】

TTL节点:过了TTL指定节点的时间就会被服务器删除,和redis一致

集群搭建

在.cfg文件中设置存储数据的目录,同时在目录下touch一个myid,并设置一个唯一标识

配置文件:默认是/conf/zoo.cfg

server.A1=B:C:D
server.A2=B:C:D
server.A3=B:C:D
#Ai:myid,唯一的数字标识,在数据存储目录中myid文件里定义
#B:服务器的IP地址
#C:leader服务器交换信息的端口号
#D:传递选举信息的端口号

当半数启动后集群开始正常运转【一般三个或以上】

节点的读写

在zookeeper中,某个节点接受到客户端写请求,会将请求转发给leader,由leader广播写请求,并统计成功数。当超过半数回复成功时,才会向客户端返回成功

CAP:

CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容忍性(Partition tolerance):将数据项复制到多个节点上,当某些节点发生故障,仍然可以访问到数据的能力

整合spring

连接并设置监听是否变化,产生变化后再次监听:不依赖spring,只依赖一个zookeeper.jar包,如果是Spring框架,可以通过配置pean的方式,直接注入 zookeeper
public class ZooKeeperTest {
private int sessionTimeout = 2000;
private String connectString="222.201.144.247:2181";
public ZooKeeper zooKeeper;
@Test
public void init() throws IOException, KeeperException, InterruptedException { zooKeeper = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
try {
System.out.println("_________________start___________________");
List<String> list = zooKeeper.getChildren("/",true);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// String s=zooKeeper.create("/connect", "spring".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
zooKeeper.getChildren("/",true);//设置监听,只会生效一次
Thread.sleep(Long.MAX_VALUE);
}
}
    <dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>
监听服务器上下线:

服务器集群向Zookeeper集群上传访问量总量,且数据类型为ephemeral,服务器掉线则数据消失

客户端集群向Zookeeper监听数据getChildren(),服务器宕机、上线时做出处理并重设监听

//客户机,主机部分向Zookeeper集群里的/下写上带序号、ephemeral的key 和 hostName即可,而由客户机负责监听
public class DistributeClient { public static void main(String[] args) throws KeeperException, InterruptedException, IOException {
DistributeClient client = new DistributeClient();
//连接到Zookeeper集群
client.getConnect();
//设置监听在控制台打印节点
client.getChildren();
//业务部分
client.business();
} private int sessionTimeout = 2000;
private String connectString="222.201.144.247:2181";//如果是Zookeeper集群的话直接在用逗号隔开即可
public ZooKeeper zooKeeper; private void getConnect() throws IOException {
zooKeeper = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
try {
getChildren();
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
} private void getChildren() throws KeeperException, InterruptedException {
List<String> children = zooKeeper.getChildren("/",true); ArrayList<String> host = new ArrayList<>();
for (String child :children){
byte[] data = zooKeeper.getData("/"+child,false,null);
host.add(new String(data));
}
System.out.println(host);
} private void business(){
} }

利用zookeeper实现分布式锁

方法一:

获取锁:create -e /ephemeral/lock threadName 创建失败则监听 get -w /ephemeral/lock【此时处于阻塞状态】,利用Watcher重新获取锁。弊端:所有的线程都需要反复的监听,尝试获取锁,产生系统资源浪费

方法二:【只能实现公平锁】

请求直接在 create -e -s /ephemeral/lock threadName 创建一个临时顺序节点,并判断自己是否是最小的节点,如果是,则获取锁,若不是,则只监听前一个节点【只比其小一的节点】并等待。最后通过delete释放锁

Zookeeper分布式服务的更多相关文章

  1. Zookeeper分布式服务协调组件

    1.简介 Zookeeper是一个分布式服务协调组件,是Hadoop.Hbase.Kafka的重要组件,它是一个为分布式应用提供一致性服务的组件.   Zookeeper的目标就是封装好复杂易出错的服 ...

  2. zookeeper分布式服务中选主的应用

    通常zookeeper在分布式服务中作为注册中心,实际上它还可以办到很多事.比如分布式队列.分布式锁 由于公司服务中有很多定时任务,而这些定时任务由于一些历史原因暂时不能改造成框架调用 于是想到用zo ...

  3. Hadoop Zookeeper 分布式服务框架

    what is Zookeeper? 1,开源的分布式的,为分布式应用提供协调服务的Apache项目2,提供一个简单原语集合,以便于分布式应用可以在它之上构建更高层次的同步服务3,设计非常易于编程,它 ...

  4. Java学习之Dubbo+ZooKeeper分布式服务Demo

    背景:在之前的一个<Java学习之SpringBoot整合SSM Demo>分享中说到搭建ZooKeeper和Dubbo分布式框架中遇到了一些技术问题没能成功,只分享了其中的一个中间产物, ...

  5. 分布式服务框架Zookeeper

    协议介绍 zookeeper协议分为两种模式 崩溃恢复模式和消息广播模式 崩溃恢复协议是在集群中所选举的leader 宕机或者关闭 等现象出现 follower重新进行选举出新的leader 同时集群 ...

  6. 分布式服务框架 Zookeeper -- 管理分布式环境中的数据

    转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/index.html Zookeeper 分布式服务框架是 Apa ...

  7. 分布式服务框架 Zookeeper(转)

    分布式服务框架 Zookeeper -- 管理分布式环境中的数据 Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题 ...

  8. 分布式服务框架 Zookeeper -- 管理分布式环境中的数据(转载)

    本文转载自:http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/ Zookeeper 分布式服务框架是 Apache Had ...

  9. 分布式服务框架 Zookeeper -- 管理分布式环境中的数据--转载

    原文:http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/ Zookeeper 分布式服务框架是 Apache Hadoop ...

  10. 分布式服务框架 Zookeeper — 管理分布式环境中的数据

    本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Zab协议.通信协议等相关知识,理解起来比较抽象所以还需要借助一些应用场景,来帮我们理解. ...

随机推荐

  1. 输入流导致javax.crypto.BadPaddingException

    使用FileInputStream一切正常,切换为使用classpath从jar包读取getResourceAsStream一直报如下错误 javax.crypto.BadPaddingExcepti ...

  2. 实战记录在 Linux Ubuntu 20.04 安装VNC 远程桌面

    Virtual Network Computing (VNC),是一个图形桌面共享系统,允许我们像使用Windows桌面系统一样可视化的使用键盘和鼠标远程控制服务器,当做一台远程的电脑一样. 主要用在 ...

  3. unix:///var/run/supervisor.sock no such file报错解决办法

    报错 unix:///var/run/supervisor.sock no such file 原因 /var/run/supervisor.sock已被清理. 解决办法 关闭supervisor:p ...

  4. Python request模块 携带cookie

    # _*_coding:utf-8 _*_ import time import requests import json import sys import random import string ...

  5. Vue路由跳转时定位到页面顶部

    代码如下: router.afterEach((to, from, next) => { document.body.scrollTop = 0; document.documentElemen ...

  6. 在ubuntu18.04上安装nodejs14

    步骤 1:更新 在 Ubuntu 上运行 apt update 命令以更新软件包库内容数据库. sudo apt update 第 2 步:在 Ubuntu 18.04 上安装 Node.js 14 ...

  7. CF1557总结

    CF1557总结 Codeforces Round #737 (Div. 2) 先看了 A .意思是要把序列分成两个子序列,使得两序列各自平均值的和最小,输出最小值,要求 \(O(n)\) .想半天然 ...

  8. 【Java】dto转json

    <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifac ...

  9. How to Check and Repair EXT4 Filesystem in Linux

    The fsck (stands for File System Consistency Check) is used to check and repair one or more Linux fi ...

  10. 手把手教你用Burpsuite+夜神模拟器抓安卓(Android 7)http+https包

    (1)进入正题,bp证书下载(下载证书至电脑):打开bp,配置好代理,浏览器访问http://127.0.0.1:8080 下载证书,记住保存路径,注意别修改证书后缀(der)!!! (2)准备一个L ...