Zookeeper 的分布式安装部署及客户端测试

文章目录

    • 第一章 入梦
      • 概述
      • 特点
      • 数据结构
      • 应用场景
  • 分布式安装部署
    • 分布式安装
      • 配置服务器编号
      • 配置zoo.cfg文件
    • 客户端命令行操作
    • API 应用
      • 环境搭建
      • 配置log4j.properties
      • 下面是代码
    • 期间注意问题:

第一章 入梦

概述

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

Zookeeper 的分布式安装部署及客户端测试_第1张图片

特点

Zookeeper 的分布式安装部署及客户端测试_第2张图片

数据结构

Zookeeper 的分布式安装部署及客户端测试_第3张图片

应用场景

提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。
Zookeeper 的分布式安装部署及客户端测试_第4张图片
Zookeeper 的分布式安装部署及客户端测试_第5张图片

Zookeeper 的分布式安装部署及客户端测试_第6张图片
Zookeeper 的分布式安装部署及客户端测试_第7张图片
Zookeeper 的分布式安装部署及客户端测试_第8张图片

分布式安装部署

  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>junitgroupId>
			<artifactId>junitartifactId>
			<version>RELEASEversion>
		dependency>
		<dependency>
			<groupId>org.apache.logging.log4jgroupId>
			<artifactId>log4j-coreartifactId>
			<version>2.8.2version>
		dependency>
		
		<dependency>
			<groupId>org.apache.zookeepergroupId>
			<artifactId>zookeeperartifactId>
			<version>3.4.10version>
		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. 运行出错,有可能是报的其他博客说的版本不一样,但是有可能是你的代码问题,

你可能感兴趣的:(大数据)