介绍

  • 相当于“数据库”,类似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. Flutter Widget中的State

    一.Flutter 的声明式视图开发 在原生系统(Android.iOS)或原生JavaScript 开发的话,应该知道视图开发是命令式的,需要精确地告诉操作系统或浏览器用何种方式去做事情. 比如,如 ...

  2. Istio 网络弹性 实践 之 故障注入 和 调用重试

    网络弹性介绍 网络弹性也称为运维弹性,是指网络在遇到灾难事件时快速恢复和继续运行的能力.灾难事件的范畴很广泛,比如长时间停电.网络设备故障.恶意入侵等. 重试(attempts) Istio 重试机制 ...

  3. Python数据分析入门(十):数据清洗和准备

    数据清洗是数据分析关键的一步,直接影响之后的处理工作 数据需要修改吗?有什么需要修改的吗?数据应该怎么调整才能适用于接下来的分析和挖掘? 是一个迭代的过程,实际项目中可能需要不止一次地执行这些清洗操作 ...

  4. python进阶(3)--条件判断、用户输入

    文档目录: 一.if语句二.检索条件三.用户输入input四.while+inoput(),让用户选择何时退出五.break与continue六.while循环处理字典和列表 ------------ ...

  5. Borrowers UVA - 230

      I mean your borrowers of books - those mutilators of collections, spoilers of the symmetry of shel ...

  6. 使用docker快速安装软件

    安装mysql mkdir /opt/mysql /opt/mysql/etc /opt/mysql/data docker run -itd --name mariadb -e MYSQL_ROOT ...

  7. 1057 Stack

    Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...

  8. 1144 The Missing Number

    Given N integers, you are supposed to find the smallest positive integer that is NOT in the given li ...

  9. WordPress伪静态规则设置

    伪静态:即网站本身是动态网页如.php..asp..aspx等格式,而这类网页还带"?"加参数来读取数据库.开启伪静态后,动态网页即被转换重写成静态网页类型页面. WordPres ...

  10. 【ShardingSphere】ShardingSphere学习(三)-数据分片-分片

    分片键 分片算法 分片策略 SQL Hint 分片键 用于分片的数据库字段,是将数据库(表)水平拆分的关键字段.例:将订单表中的订单主键的尾数取模分片,则订单主键为分片字段. SQL中如果无分片字段, ...