zoukankan      html  css  js  c++  java
  • Zookeeper 的分布式安装部署及客户端测试

    第一章 入梦

    概述

    Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。

    在这里插入图片描述

    特点

    在这里插入图片描述

    数据结构

    在这里插入图片描述

    应用场景

    提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    分布式安装部署

    1. 集群规划,—— 在大数据栏里

    分布式安装

    1. 解压安装等,与hadoop 一样
    2. 采用xsync.sh 同步文件

    配置服务器编号

    1. 在软件目录下,创建zkData
    2. 在目录下,创建myid文件并编辑
    编号 如 234 
    
    1. 拷贝文件到其他服务器上

    配置zoo.cfg文件

    1. 先重命名zoo_sample.cfg-》zoo.cfg
    2. 编辑
      dataDir=/opt/module/zookeeper-3.4.10/zkData
      记得编号对应
      #######################cluster##########################
      server.2=hadoop100:2888:3888
      server.3=hadoop101:2888:3888
      server.4=hadoop102:2888:3888
      
      
    3. 配置参数解读
    A是一个数字,表示这个是第几号服务器;
    集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
    B是这个服务器的ip地址;
    C是这个服务器与集群中的Leader服务器交换信息的端口;
    D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
    
    1. 启动集群,是各个分别启动的
      bin/zkServer.sh start
      (可以写脚本,各个启动)

    客户端命令行操作

    命令基本语法 功能描述
    help 显示所有操作命令
    ls path [watch] 使用 ls 命令来查看当前znode中所包含的内容
    ls2 path [watch] 查看当前节点数据并能看到更新次数等数据
    create 普通创建 -s 含有序列 -e 临时(重启或者超时消失)
    get path [watch] 获得节点的值
    set 设置节点的具体值
    stat 查看节点状态
    delete 删除节点
    rmr 递归删除节点

    API 应用

    环境搭建

    <dependencies>
    		<dependency>
    			<groupId>junit</groupId>
    			<artifactId>junit</artifactId>
    			<version>RELEASE</version>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.logging.log4j</groupId>
    			<artifactId>log4j-core</artifactId>
    			<version>2.8.2</version>
    		</dependency>
    		<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
    		<dependency>
    			<groupId>org.apache.zookeeper</groupId>
    			<artifactId>zookeeper</artifactId>
    			<version>3.4.10</version>
    		</dependency>
    </dependencies>
    
    

    配置log4j.properties

    log4j.rootLogger=INFO, stdout  
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
    log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n  
    log4j.appender.logfile=org.apache.log4j.FileAppender  
    log4j.appender.logfile.File=target/spring.log  
    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout  
    log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n  
    
    

    下面是代码

    
    package com.study.zookeeper;
    
    import org.apache.zookeeper.*;
    
    import java.io.IOException;
    
    /**
     * Created by IntelliJ IDEA.
     *
     * @author : Firewine
     * @version : 1.0
     * @Program Name: DistributeServer
     * @Create : 2020/2/13
     * @Description :
     */
    public class DistributeServer {
    
        public static void main(String[] args) throws Exception {
    
            DistributeServer server = new DistributeServer();
    
            // 1 连接zookeeper集群
            server.getConnect();
    
            System.out.println(args[0]);
            // 2 注册节点
            server.regist(args[0]);
    
            // 3 业务逻辑处理
            server.business();
        }
    
        private void business() throws InterruptedException {
    
            Thread.sleep(Long.MAX_VALUE);
        }
    
        private void regist(String hostname) throws KeeperException, InterruptedException {
    
            String path = zkClient.create("/servers/server", hostname.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
    
            System.out.println(hostname +"is online ");
    
        }
    
        private String connectString="192.168.11.100:2181,192.168.11.101:2181,192.168.11.102:2181";
    
        private int sessionTimeout = 2000;
        private ZooKeeper zkClient;
    
        private void getConnect() throws IOException {
    
            zkClient = new ZooKeeper(connectString , sessionTimeout , new Watcher() {
    
                @Override
                public void process(WatchedEvent event) {
    
    
                }
            });
        }
    }
    
    

    客户端

    package com.study.zookeeper;
    
    import org.apache.zookeeper.KeeperException;
    import org.apache.zookeeper.WatchedEvent;
    import org.apache.zookeeper.Watcher;
    import org.apache.zookeeper.ZooKeeper;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Created by IntelliJ IDEA.
     *
     * @author : Firewine
     * @version : 1.0
     * @Program Name: DistributeClient
     * @Create : 2020/2/13
     * @Description :
     */
    public class DistributeClient {
    
        public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
    
            DistributeClient client = new DistributeClient();
    
            // 1 获取zookeeper集群连接
            client.getConnect();
    
            // 2 注册监听
            client.getChlidren();
    
            // 3 业务逻辑处理
            client.business();
    
        }
    
        private void business() throws InterruptedException {
            Thread.sleep(Long.MAX_VALUE);
        }
    
        private void getChlidren() throws KeeperException, InterruptedException {
    
            List<String> children = zkClient.getChildren("/servers", true);
    
            // 存储服务器节点主机名称集合
            ArrayList<String> hosts = new ArrayList<>();
    
            for (String child : children) {
    
                byte[] data = zkClient.getData("/servers/"+child, false, null);
    
                hosts.add(new String(data));
            }
    
            // 将所有在线主机名称打印到控制台
            System.out.println(hosts);
    
        }
    
        private String connectString="192.168.11.100:2181,192.168.11.101:2181,192.168.11.102:2181";
    
        private int sessionTimeout = 2000;
        private ZooKeeper zkClient;
    
        private void getConnect() throws IOException {
    
            zkClient = new ZooKeeper(connectString , sessionTimeout , new Watcher() {
    
                @Override
                public void process(WatchedEvent event) {
    
                    try {
                        getChlidren();
                    } catch (KeeperException e) {
                        e.printStackTrace();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
    
        }
    }
    
    
    

    期间注意问题:

    1. 注意客户端与服务器的版本的不一致的问题,
    2. 注意代码逻辑,是否服务器有父节点
    3. 运行出错,有可能是报的其他博客说的版本不一样,但是有可能是你的代码问题,
  • 相关阅读:
    516. 最长回文子序列
    NC50493 环形石子合并
    NC16650 采药
    NC16664 合唱队形
    NC51170 石子合并
    148. 合并果子
    NC25138 子串查询
    二维数组对角线 的 规律
    如何讲一个网页转换为jpg?(图片!)
    Java两倍 犯错题
  • 原文地址:https://www.cnblogs.com/YJBlog/p/12337098.html
Copyright © 2011-2022 走看看