[DB] Zookeeper
介绍
- 相当于“数据库”,类似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的更多相关文章
- Docker 系列七(Dubbo 微服务部署实践).
一.前言 之前我们公司部署服务,就是大家都懂的那一套(安装JDK.Tomcat —> 编译好文件或者打war包上传 —> 启动Tomcat),这种部署方式一直持续了很久,带来的问题也很多: ...
- ActiveMQ 笔记(八)高级特性和大厂常考重点
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.可用性保证 引入消息队列之后该如何保证其高可用性? 持久化.事务.签收. 以及带复制的 Leavel ...
- 分布式锁三种实现方式(DB,redis,zookeeper)比较
先贴出看到的一篇博客,后续补充自己总结分析的. https://blog.csdn.net/u010963948/article/details/79006572
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- ActiveMQ笔记(2):基于ZooKeeper的HA方案
activemq官网给出了3种master/slave的HA方案,详见:http://activemq.apache.org/masterslave.html,基于共享文件目录,db,zookeepe ...
- ZooKeeper之FastLeaderElection算法详解
当我们把zookeeper服务启动时,首先需要做的一件事就是leader选举,zookeeper中leader选举的算法有3种,包括LeaderElection算法.AuthFastLeaderEle ...
- ZooKeeper 笔记(3) 实战应用之【统一配置管理】
大型应用通常会按业务拆分成一个个业务子系统,这些大大小小的子应用,往往会使用一些公用的资源,比如:需要文件上传.下载时,各子应用都会访问公用的Ftp服务器.如果把Ftp Server的连接IP.端口号 ...
- Zookeeper集群的安装和使用
Apache Zookeeper 由 Apache Hadoop 的 Zookeeper 子项目发展而来,现已经成为 Apache 的顶级项目,它是一个开放源码的分布式应用程序协调服务,是Google ...
- 【转】flume+kafka+zookeeper 日志收集平台的搭建
from:https://my.oschina.net/jastme/blog/600573 flume+kafka+zookeeper 日志收集平台的搭建 收藏 jastme 发表于 10个月前 阅 ...
随机推荐
- [Fundamental of Power Electronics]-PART II-8. 变换器传递函数-8.1 Bode图回顾
8.0 序 工程设计过程主要包括以下几个过程: 1.定义规格与其他设计目标 2.提出一个电路.这是一个创造性的过程,需要利用工程师的实际见识和经验. 3.对电路进行建模.变换器的功率级建模方法已经在第 ...
- [面试仓库]HTML面试题汇总
HTML这一块呢,说简单也简单,说难也不是那么容易.但我们在各个面试要求中,大部分都把HTML这一条摆在了第一位,重要性可想而知.这个位置算是有关HTML的一个汇总点了,亦会在这里及时补充. 1, ...
- (八)Struts2中的参数封装
一.静态参数封装 什么是静态参数? 静态参数就是硬编码的,不可随意改变. 例子: (1)我们首先创建一个Action类,里面有两个参数,用来封装请求参数 public class User exten ...
- 理解和解决Java并发修改异常:ConcurrentModificationException
參考文獻:https://www.jianshu.com/p/f3f6b12330c1 文獻来源:简书 关键字: Java Exception遇到异常信息Exception in thread &qu ...
- Mybatis的Dao层实现原理
1.Mybatis的Dao层实现 1.1 传统开发方式 1.1.1编写UserDao接口 public interface UserDao { List<User> findAll() t ...
- 翻译:《实用的Python编程》InstructorNotes
实用的 Python 编程--讲师说明 作者:戴维·比兹利(David Beazley) 概述 对于如何使用我的课程"实用的 Python 编程"进行教学的问题,本文档提供一些通用 ...
- 关于Eclipse Debug断点调试出现 Search not found 页面的解决办法
1. 在代码中鼠标右键 Debug AS ---> Debug Configurations... ----> 找到Source选项 ---> 点击add ---> 选择 j ...
- 从苏宁电器到卡巴斯基第10篇:我在苏宁电器当营业员 II
之所以是主推,其实是有原因的 据我所知,尽管诺基亚卖的很好,但是他们的厂促的待遇却很一般,估计也就一千多两千的样子,撑死两千多.但是呢,记得当时我们的卖场里面还有联想手机,别看卖得相当次,但是他们的厂 ...
- Linux中的防火墙(Netfilter、Iptables、Firewalld)
目录 Netfilter Iptables iptables做本地端口转发 Firewalld Netfilter Netfilter是Linux 2.4内核引入的全新的包过滤引擎,位于Linux内核 ...
- POJ1328贪心放雷达
题意: 有一个二维坐标,y>0是海,y<=0是陆地,然后只能在y=0的岸边上放雷达,有n个城市需要被监控,问最少放多少个雷达. 思路: 贪心去做就行了,其实题目不 ...