[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 }
View Code

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 }
View Code

  ...

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

posted @ 2020-04-16 23:06  cxc1357  阅读(145)  评论(0编辑  收藏  举报