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. 运行出错,有可能是报的其他博客说的版本不一样,但是有可能是你的代码问题,
原文地址:https://www.cnblogs.com/YJBlog/p/12337098.html