[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个月前 阅 ...
随机推荐
- Flutter Widget中的State
一.Flutter 的声明式视图开发 在原生系统(Android.iOS)或原生JavaScript 开发的话,应该知道视图开发是命令式的,需要精确地告诉操作系统或浏览器用何种方式去做事情. 比如,如 ...
- Istio 网络弹性 实践 之 故障注入 和 调用重试
网络弹性介绍 网络弹性也称为运维弹性,是指网络在遇到灾难事件时快速恢复和继续运行的能力.灾难事件的范畴很广泛,比如长时间停电.网络设备故障.恶意入侵等. 重试(attempts) Istio 重试机制 ...
- Python数据分析入门(十):数据清洗和准备
数据清洗是数据分析关键的一步,直接影响之后的处理工作 数据需要修改吗?有什么需要修改的吗?数据应该怎么调整才能适用于接下来的分析和挖掘? 是一个迭代的过程,实际项目中可能需要不止一次地执行这些清洗操作 ...
- python进阶(3)--条件判断、用户输入
文档目录: 一.if语句二.检索条件三.用户输入input四.while+inoput(),让用户选择何时退出五.break与continue六.while循环处理字典和列表 ------------ ...
- Borrowers UVA - 230
I mean your borrowers of books - those mutilators of collections, spoilers of the symmetry of shel ...
- 使用docker快速安装软件
安装mysql mkdir /opt/mysql /opt/mysql/etc /opt/mysql/data docker run -itd --name mariadb -e MYSQL_ROOT ...
- 1057 Stack
Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...
- 1144 The Missing Number
Given N integers, you are supposed to find the smallest positive integer that is NOT in the given li ...
- WordPress伪静态规则设置
伪静态:即网站本身是动态网页如.php..asp..aspx等格式,而这类网页还带"?"加参数来读取数据库.开启伪静态后,动态网页即被转换重写成静态网页类型页面. WordPres ...
- 【ShardingSphere】ShardingSphere学习(三)-数据分片-分片
分片键 分片算法 分片策略 SQL Hint 分片键 用于分片的数据库字段,是将数据库(表)水平拆分的关键字段.例:将订单表中的订单主键的尾数取模分片,则订单主键为分片字段. SQL中如果无分片字段, ...