zoukankan      html  css  js  c++  java
  • [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)
  • 相关阅读:
    简明python教程 --C++程序员的视角(九):函数式编程、特殊类方法、测试及其他
    "听话"的品格的症状
    PHP中extract()函数的妙用
    分析源码的感悟
    JWT 多网站单点登录,放弃session
    How to use php serialize() and unserialize()
    [转]很好的文章,收藏一下
    Learning from the CakePHP source code
    Learning from the CakePHP source code
    关于PHP的一小段代码求解如下求解"%2$s"
  • 原文地址:https://www.cnblogs.com/cxc1357/p/12709758.html
Copyright © 2011-2022 走看看