介绍

  • 相当于“数据库”,类似linux、hdfs的属性文件结构
  • 分布式协调框架,实现HA(High Availability)
  • 分布式锁管理框架
  • 保证数据在zookeeper集群之间数据的事务一致性

组成

  • Leader:数据总控节点,用于接收客户端连接请求,分发给所有的Follower节点后,各个Follower节点进行更新数据操作并返回给Leader节点,如果满足半数以上(所以Zookeeper集群一般是奇数个节点)更新成功则此次操作成功
  • Follower:跟随者,Zookeeper的Leader宕机时,所有的Follower内部通过选举机制,选举出新的Leader
  • Observer:客户端,用于观察Zookeeper集群的数据发送变化,如果产生变化则zookeeper会主动推送watch事件给Observer(客户端),用于对数据变化的后续处理;Observer(客户端)也可以发送数据变更请求

功能

  • 分布式协调
  • 分布式锁
  • 数据同步(端口:2888)
  • 选举机制(端口:3888)

场景

  • 统一命名服务
  • 配置管理
  • 集群管理
    • Hadoop2.0使用ZK的事件处理确保整个集群只有一个活跃的NameNode,并存储配置信息
    • HBase使用ZK的事件处理确保整个集群只有一个HMaster,察觉HRegionServer联机和宕机,并存储访问控制列表
  • 共享锁
  • 队列管理

单机配置

  • 解压,设置环境变量
  • 生效环境变量
  • 创建目录 /root/training/zookeeper-3.4.10/tmp
  • 在 conf/ 下创建zoo_sample.cfg的副本zoo.cfg,添加内容:
    • dataDir=/root/training/zookeeper-3.4.10/tmp
    • server.1=bigdata111:2888:3888
  • 在 /root/training/zookeeper-3.4.10/tmp 下创建文件:myid,输入1

  • zkCli.sh:连接客户端

    • create /node1 "hello world"

秒杀系统

  • 实现方式

    • Zookeeper:利用分布式锁
    • Redis:利用队列
    • 消息系统:利用队列

传统多线程方式(会产生混乱)

 1 package demo;
2
3 public class TestZookeeperDemo {
4
5
6 private static int NUMBER = 10;
7 private static void getNumber() {
8 System.out.println("*******业务方法开始***********");
9 System.out.println("当前值:" + NUMBER);
10 NUMBER --;
11 try {
12 Thread.sleep(2000);
13 } catch (InterruptedException e) {
14 e.printStackTrace();
15 }
16 System.out.println("*******业务方法结束***********");
17 }
18
19 public static void main(String[] args) {
20 //启动10个线程
21 for(int i = 0 ; i < 10 ; i ++ ) {
22 new Thread(new Runnable() {
23 public void run() {
24 getNumber();
25 }
26 }).start();
27 }
28 }
29 }

Zookeeper方式(分布式锁)

 1 package demo;
2
3 import org.apache.curator.RetryPolicy;
4 import org.apache.curator.framework.CuratorFramework;
5 import org.apache.curator.framework.CuratorFrameworkFactory;
6 import org.apache.curator.framework.recipes.locks.InterProcessMutex;
7 import org.apache.curator.retry.ExponentialBackoffRetry;
8
9 public class TestZookeeperDemo {
10
11
12 private static int NUMBER = 10;
13 private static void getNumber() {
14 System.out.println("*******业务方法开始***********");
15 System.out.println("当前值:" + NUMBER);
16 NUMBER --;
17
18 // 睡两秒,客户端依然拿着锁
19 try {
20 Thread.sleep(2000);
21 } catch (InterruptedException e) {
22 e.printStackTrace();
23 }
24 System.out.println("*******业务方法结束***********");
25 }
26
27 public static void main(String[] args) {
28 // 定义retry policy(重试策略)
29 // 每次等待1000ms,重试10次
30 RetryPolicy policy = new ExponentialBackoffRetry(1000, 10);
31 // 创建一个ZK的客户端
32 CuratorFramework cf = CuratorFrameworkFactory.builder()
33 .connectString("192.168.174.111:2181")
34 .retryPolicy(policy)
35 .build();
36
37 cf.start();
38
39 //在ZK中定义一把锁
40 final InterProcessMutex lock = new InterProcessMutex(cf, "/mylock");
41
42 //启动10个线程
43 for(int i = 0 ; i < 10 ; i ++ ) {
44 new Thread(new Runnable() {
45 public void run() {
46 try {
47 // 请求得到锁,如果没有得到,使用retrypolicy重试
48 lock.acquire();
49
50 // 访问共享资源
51 getNumber();
52 }catch(Exception ex) {
53 ex.printStackTrace();
54 }finally {
55 // 释放锁
56 try {
57 lock.release();
58 } catch (Exception e) {
59 e.printStackTrace();
60 }
61 }
62 }
63 }).start();
64 }
65 }
66 }

  ...

ZK集群

  • Leader(bagdata113)
  • Follower(bigdata112、bigdata114)
  • 依赖zk的服务

参考

CDH zookeeper

https://www.aboutyun.com/forum.php?mod=viewthread&tid=9664

https://blog.csdn.net/weixin_33797791/article/details/94468085

集群排错

https://blog.51cto.com/10950710/2129883

https://www.cnblogs.com/austinspark-jessylu/p/6956319.html

zkClient

https://blog.csdn.net/sun_wangdong/article/details/77461108

[DB] Zookeeper的更多相关文章

  1. Docker 系列七(Dubbo 微服务部署实践).

    一.前言 之前我们公司部署服务,就是大家都懂的那一套(安装JDK.Tomcat —> 编译好文件或者打war包上传 —> 启动Tomcat),这种部署方式一直持续了很久,带来的问题也很多: ...

  2. ActiveMQ 笔记(八)高级特性和大厂常考重点

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.可用性保证 引入消息队列之后该如何保证其高可用性? 持久化.事务.签收. 以及带复制的 Leavel ...

  3. 分布式锁三种实现方式(DB,redis,zookeeper)比较

    先贴出看到的一篇博客,后续补充自己总结分析的. https://blog.csdn.net/u010963948/article/details/79006572

  4. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  5. ActiveMQ笔记(2):基于ZooKeeper的HA方案

    activemq官网给出了3种master/slave的HA方案,详见:http://activemq.apache.org/masterslave.html,基于共享文件目录,db,zookeepe ...

  6. ZooKeeper之FastLeaderElection算法详解

    当我们把zookeeper服务启动时,首先需要做的一件事就是leader选举,zookeeper中leader选举的算法有3种,包括LeaderElection算法.AuthFastLeaderEle ...

  7. ZooKeeper 笔记(3) 实战应用之【统一配置管理】

    大型应用通常会按业务拆分成一个个业务子系统,这些大大小小的子应用,往往会使用一些公用的资源,比如:需要文件上传.下载时,各子应用都会访问公用的Ftp服务器.如果把Ftp Server的连接IP.端口号 ...

  8. Zookeeper集群的安装和使用

    Apache Zookeeper 由 Apache Hadoop 的 Zookeeper 子项目发展而来,现已经成为 Apache 的顶级项目,它是一个开放源码的分布式应用程序协调服务,是Google ...

  9. 【转】flume+kafka+zookeeper 日志收集平台的搭建

    from:https://my.oschina.net/jastme/blog/600573 flume+kafka+zookeeper 日志收集平台的搭建 收藏 jastme 发表于 10个月前 阅 ...

随机推荐

  1. Python数据分析入门(六):Pandas的函数应用

    apply和applymap 1. 可直接使用NumPy的函数 示例代码: # Numpy ufunc 函数 df = pd.DataFrame(np.random.randn(5,4) - 1) p ...

  2. NameError: name 'foo' is not defined Python常见错误

    1.变量或者函数名拼写错误 2.在一个定义新变量中使用增值操作符 没有定义的变量被引用时候会出现此错误

  3. 利用Vue实现一个简单的购物车功能

    开始学习Vue的小白,dalao多多指正 想要实现下面这个界面,包含总价计算.数量增加和移除功能 话不多说代码如下 <!DOCTYPE html> <html> <hea ...

  4. ATMS中去pause Activity A.

    上文写完之后,感觉这个部分写的还是不清晰,本文继续补充一下. 首先还是看堆栈. obtain:78, PauseActivityItem (android.app.servertransaction) ...

  5. Spring Cloud Alibaba(2)---Nacos概述

    Spring Cloud Alibaba(2)---nacos概述 上一篇博客讲了有关 SpringCloudAlibaba的概述,这篇开始讲SpringCloudAlibaba组件之一---Naco ...

  6. 201871030115-康旭 实验二 软件工程个人项目—《D{0-1} KP》项目报告

    项目 内容 课程班级博客连接 课程班级 这个作业要求连接 作业链接 我的课程学习目标 (1)详细阅读<构建之法>第1章.第2章,掌握PSP流程:(2)设计实际程序掌握动态规划算法.回溯算法 ...

  7. 万字长文,带你彻底理解EF Core5的运行机制,让你成为团队中的EF Core专家

    在EF Core 5中,有很多方式可以窥察工作流程中发生的事情,并与该信息进行交互.这些功能点包括日志记录,拦截,事件处理程序和一些超酷的最新出现的调试功能.EF团队甚至从Entity Framewo ...

  8. 如何以源码形式运行Nacos Server

    官方标准运行方式 下载解压可运行包 curl -O https://github.com/alibaba/nacos/releases/download/1.3.2/nacos-server-1.3. ...

  9. Java与Python中的‘%’运算符意义一样么?

    1. 取余与取模 百度百科对于取模运算做了如下定义: 对于整型数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商: c = [a/b]; 2.计算模或者余数: r = a - c*b. 求 ...

  10. Prometheus【node_exporter】+grafana监控云主机

    下面说一下这个开源软件的安装实践过程,目标如下: 在监控服务器上安装prometheus 在被监控环境上安装exporter 安装grafana 在监控服务器上安装prometheus 开始安装pro ...