《Zookeeper系列》Zookeeper详细入门教程

在这里插入图片描述

一、Zookeeper入门教程

1 Zookeeper定义

Apache Zookeeper是一个开发和维护开源服务器得框架,它可以实现高度可靠的分布式协调。

2 Zookeeper的特点

  1. 半数以上存活即存活
  2. 搭建奇数台节点
  3. 生产中没有使用单台Zookeeper的情况,也就是至少3台
  4. 集群中只有一个leader,多个follower
  5. 全局数据保持一致,每个server保存一份相同的数据副本,client无论连接到哪一个server,数据都保持一致
  6. 分布式读写,更新请求转发,由leader实施(主从复制,读写分离)
  7. 更新请求顺序进行,来自同一个client的更新请求按照其发送的请求顺序执行(这个特点决定ZK不适合做海量数据的保存)
  8. 数据更新原子性,一次数据更新操作,要么全部成功,要么全部失败
  9. 实时性,在一定时间范围内,client能读到最新数据

3 Zookeeper安装

##1.解压缩
tar -zxvf zookeeper-3.4.5.tar.gz -C /opt/apps/
##2.配置环境变量
vim /etc/profile

export ZK_HOME=/opt/apps/zookeeper-3.4.5
export PATH=$PATH:$ZK_HOME/bin

source /etc/profile
##3.创建zkdata/myid,每个节点myid不同
eg1:192.168.130.110
mkdir zkdata
vim zkdata/myid
1
eg2:192.168.130.111
mkdir zkdata
vim zkdata/myid
2
eg2:192.168.130.112
mkdir zkdata
vim zkdata/myid
3
##4.配置zoo.cfg
mv conf/zoo_sample.cfg conf/zoo.cfg
vim zoo.cfg

dataDir=/opt/apps/zookeeper-3.4.5/zkdata

server.1=192.168.130.110:2888:3888
server.2=192.168.130.111:2888:3888
server.3=192.168.130.112:2888:3888

##5.启动

##服务端
sh zkServer.sh start/stop/status
##客户端
sh zkCli.sh

4 Zookeeper操作

指令作用案例
ls列举指定目录的子目录ls /
ls2列举指定目录的子目录以及元数据ls2 /
create创建新节点
-s 顺序节点
-e 临时节点
-c 容器节点
-t 可以给节点添加过期时间,默认禁用,
可以通过系统参数启用
create /hdfs hdfs
create -e /yarn yarn
create -s /mapreduce mr
get获取指定节点中的数据以及元数据get /hdfs
stat获取节点的元数据stat /hdfs
delete删除指定节点-要求它没有子节点delete /hdfs
rmr递归删除znodermr /hdfs
set修改指定节点的数据set /hdfs hadoop

5 Java API

5.1 导入Pom依赖

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.6</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.10</version>
</dependency>

5.2 配置本地的hosts

C:\Windows\System32\drivers\etc目录下的hosts文件,映射对应的IP

192.168.130.110 ha1

192.168.130.111 ha2

192.168.130.112 ha3

5.3 代码

  • Operation.java
package com.zookeeper;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.junit.Test;

public class Operation {
    private static ZooKeeper zooKeeper = null;
    @Test
    public void init(){
        String connection = "ha1,ha2,ha3";
        int TimeOut = 3000;

        try {
            //操作zookeeper的服务器客户端对象
            zooKeeper = new ZooKeeper(connection, TimeOut, new Watcher() {
                @Override
                public void process(WatchedEvent watchedEvent) {
                    System.out.println("zookeeper");
                }
            });

            CURD.setZooKeeper(zooKeeper);
            /**
             * JavaAPI模拟指令
             */
            CURD curd = new CURD();

            //关闭连接
            zooKeeper.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        //释放资源

    }
}
  • CURD.java
package com.zookeeper;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.Test;

import java.util.List;

public class CURD {
    private static ZooKeeper zooKeeper;

    public static ZooKeeper getZooKeeper() {
        return zooKeeper;
    }

    public static void setZooKeeper(ZooKeeper zooKeeper) {
        CURD.zooKeeper = zooKeeper;
    }
    //查看路径下所有子目录
    @Test
    public void lsAll(){
        try {
            List<String> children = zooKeeper.getChildren("/", true);
            for (String child:children){
                System.out.println(child);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //创建节点
    @Test
    public void create(){
        try {
            zooKeeper.create("/hdfs","hdfs".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //删除节点
    @Test
    public void delete(){
        try {
            zooKeeper.delete("/hadoop",1);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //递归删除节点
    @Test
    public void rmr(){
        rmrs("/hdfs");
    }
    @Test
    public void rmrs(String path){
        try {
            String origin = path;
            //先获取子节点,判断有没有子节点
            List<String> children = zooKeeper.getChildren(path, true);
            //没有节点就删除
            if (children.size() == 0){
                zooKeeper.delete(path,0);
                return;
            }
            //有节点就删除
            for (String child : children){
                path = path + "/" + child;
                rmrs(path);
            }
            //删除自己本身节点
            zooKeeper.delete(origin,0);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //获取指定节点中的数据以及元数据
    @Test
    public void get() {
        try {
            Stat stat = new Stat();//元数据
            byte[] data = zooKeeper.getData("hdfs", true, stat);
            System.out.println(new String(data));
            System.out.println(stat.getCtime());
            System.out.println(stat.getVersion());
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

二、Zookeeper伪分布式安装

1.预备工作

1.一台服务器
2.伪分布式zookeeper 1,2,3
3.创建zookeeper目录结构
	zoo_1/2/3 用于存放节点的快照
	zoo_2_dataLog 用于存放节点的事务日志
4.将zookeeper的压缩包解压到此处并改名为zookeeper-3.6.3
5.配置环境变量:vim /etc/profile
	添加 export ZK_HOME=/zxy/apps/zookeeper/zookeeper-3.6.3
		export PATH=$PATH:$ZK_HOME/bin
	刷新资源 source /etc/profile

在这里插入图片描述

2.分配myid

#server1
echo "1" > /zxy/apps/zookeeper/zoo_1/myid
#server2
echo "2" > /zxy/apps/zookeeper/zoo_1/myid
#server3
echo "3" > /zxy/apps/zookeeper/zoo_1/myid

3.创建不同节点配置文件

[root@hadoop_zxy conf]# cp zoo_sample.cfg zoo1.cfg
[root@hadoop_zxy conf]# cp zoo_sample.cfg zoo2.cfg
[root@hadoop_zxy conf]# cp zoo_sample.cfg zoo3.cfg

[root@hadoop_zxy conf]# ls
configuration.xsl  log4j.properties  zoo1.cfg  zoo2.cfg  zoo3.cfg  zoo_sample.cfg

4.修改配置文件内容

(三个节点的配置文件只有dataDir、dataLogDir、clientPort不同)

vim zoo1.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/zxy/apps/zookeeper/zoo_1
dataLogDir=/zxy/apps/zookeeper/zoo_1_dataLog
clientPort=2181
server.1=hadoop_zxy:2887:3887
server.2=hadoop_zxy:2888:3888
server.3=hadoop_zxy:2889:3889

vim zoo2.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/zxy/apps/zookeeper/zoo_2
dataLogDir=/zxy/apps/zookeeper/zoo_2_dataLog
clientPort=2182
server.1=hadoop_zxy:2887:3887
server.2=hadoop_zxy:2888:3888
server.3=hadoop_zxy:2889:3889

vim zoo3.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/zxy/apps/zookeeper/zoo_3
dataLogDir=/zxy/apps/zookeeper/zoo_3_dataLog
clientPort=2183
server.1=hadoop_zxy:2887:3887
server.2=hadoop_zxy:2888:3888
server.3=hadoop_zxy:2889:3889

5.启动zookeeper

[root@hadoop_zxy zookeeper-3.6.3]#
bin/zkServer.sh start zoo1.cfg
bin/zkServer.sh start zoo2.cfg
bin/zkServer.sh start zoo3.cfg

6.查看进程(zookeeper已正常)

[root@hadoop_zxy zookeeper-3.6.3]# jps
29858 QuorumPeerMain
29715 QuorumPeerMain
19364 Jps
29977 QuorumPeerMain
[root@hadoop_zxy zookeeper-3.6.3]#

7.查看节点的leader和follower(半数原则)


[root@hadoop_zxy zookeeper-3.6.3]# bin/zkServer.sh status conf/zoo1.cfg
ZooKeeper JMX enabled by default
Using config: conf/zoo1.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
[root@hadoop_zxy zookeeper-3.6.3]# bin/zkServer.sh status conf/zoo2.cfg
ZooKeeper JMX enabled by default
Using config: conf/zoo2.cfg
Client port found: 2182. Client address: localhost. Client SSL: false.
Mode: leader
[root@hadoop_zxy zookeeper-3.6.3]# bin/zkServer.sh status conf/zoo3.cfg
ZooKeeper JMX enabled by default
Using config: conf/zoo3.cfg
Client port found: 2183. Client address: localhost. Client SSL: false.
Mode: follower

8.使用脚本管理(拓展)

vim start-zookeeper.sh

#!/bin/bash
# filename:start-zookeeper.sh
# autho:zxy
# date:2022-01-12
# KAFKA的安装路径
ZOOKEEPER_HOME=/zxy/apps/zookeeper/zookeeper-3.6.3
# 接受参数
CMD=$1

## 帮助函数
usage() {
    echo "usage:"
    echo "start-zookeeper.sh z1/z2/z3"
    echo "description:"
    echo "      z1:start zoo_1.cfg"
    echo "      z2:start zoo_2.cfg"
    echo "      z3:stop zoo_3.cfg"
    exit 0
}

if [ ${CMD} == "z1" ];then
        # 启动zookeeper1服务
        sh $ZOOKEEPER_HOME/bin/zkServer.sh start $ZOOKEEPER_HOME/conf/zoo1.cfg
elif [ ${CMD} == "z2" ];then
        # 启动zookeeper2服务
        sh $ZOOKEEPER_HOME/bin/zkServer.sh start $ZOOKEEPER_HOME/conf/zoo2.cfg
elif [ ${CMD} == "z3" ];then
		# 启动zookeeper3服务
        sh $ZOOKEEPER_HOME/bin/zkServer.sh start $ZOOKEEPER_HOME/conf/zoo3.cfg
else
        usage
fi

整个zookeeper打包文件,包含脚本

三、Zookeeper连接超时问题,与拒绝连接问题解决

  • 代码异常
    在这里插入图片描述
  • 处理方式

1.检查并关闭防火墙
2.检查vim /etc/hosts
端口冲突
删除第一行的127.0.0.1

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 头歌zookeeper是一个分布式协调服务,用于管理和协调分布式系统中的各个节点。在搭建分布式环境时,可以使用头歌zookeeper来实现节点之间的通信和同步。 搭建头歌zookeeper分布式环境的步骤如下: 1. 下载并安装头歌zookeeper。 2. 配置zookeeper的配置文件,包括zookeeper的端口号、数据存储路径等。 3. 在每个节点上启动zookeeper服务。 4. 在每个节点上配置zookeeper的集群信息,包括集群中其他节点的IP地址和端口号。 5. 测试zookeeper集群的连接和同步功能。 需要注意的是,在搭建分布式环境时,要确保各个节点之间的网络连接稳定,并且zookeeper的配置文件和集群信息要保持一致。 ### 回答2: Zookeeper是一个分布式协调服务,可以为分布式应用程序提供一致性、可靠性和高效性。在分布式系统中,通常需要协调各个节点之间的任务分配、状态同步等,Zookeeper就是实现这个目的的工具之一。 要搭建分布式环境,首先需要在多台机器上安装ZookeeperZookeeper的安装可以采用源码编译安装或者直接使用二进制包安装。在安装时需要注意配置Zookeeper的数据目录、日志目录等信息,还需要创建一个Zookeeper的配置文件,用于指定端口、数据目录等参数。 安装完成后,需要启动每个Zookeeper实例。在启动时,需要指定Zookeeper的配置文件和服务器ID。服务器ID应该在每台机器上是唯一的,并且应该落在1~255之间。启动时可以输入命令“./zkServer.sh start”启动。 搭建完分布式环境后,需要在Zookeeper中创建znodes。znode是Zookeeper中的数据节点,是分布式环境中数据交换、同步的基本单位。可以使用Zookeeper提供的命令行工具或者编写Java程序实现znode的创建、读取、更新、删除等操作。 创建完znode后,就可以在分布式应用程序中使用Zookeeper实现分布式协调了。例如,可以使用Zookeeper实现分布式锁、分布式任务分配等功能。在使用Zookeeper时,需要注意Zookeeper的一致性协议,避免出现数据不一致的情况。 总之,Zookeeper的分布式环境搭建需要注意配置文件和服务器ID的设置,在使用中需要注意一致性问题,才能发挥出其实现分布式协调的能力。 ### 回答3: Zookeeper是一个分布式协调服务,为分布式应用提供一致性服务。对于分布式 系统来说,Zookeeper用于解决如何协调和管理各种分布式服务的问题,有效提 高了分布式系统的可靠性和可用性。 搭建Zookeeper分布式环境,需要以下步骤: 1. 下载和安装Zookeeper软件 从官方网站下载Zookeeper软件包,并解压到想要安装的目录。安装完成后,还可 以配置环境变量,使Zookeeper命令可以全局访问。 2. 配置Zookeeper 在安装Zookeeper后,需要对Zookeeper进行配置。在Zookeeper主目录下创建con f目录,并在其中创建zoo.cfg文件。在zoo.cfg文件中设置Zookeeper服务器的 参数,例如服务器的数量、端口号、数据目录位置等。 3. 启动Zookeeper集群 在配置完Zookeeper后,可通过启动Zookeeper集群来实现对分布式应用程序的协 调和管理。启动Zookeeper集群需要在各个节点主机上运行Zookeeper服务,不同节 点的id必须唯一,并且节点间需要配置相应的IP地址和端口号。 4. 验证Zookeeper集群 启动Zookeeper集群后,需要验证其是否正常工作。可以通过使用客户端连接到 Zookeeper服务器,执行相关的Zookeeper命令来验证Zookeeper集群的工作是否正 常。例如,可以使用"ls /"来列出Zookeeper根节点上的所有子节点,使用"create /temp "hello""创建一个名为temp的节点,并将其值设置为hello。 5. 集成Zookeeper 将程序集成到Zookeeper中需要进行三项基本工作:连接Zookeeper、注册/订阅 节点和断开连接。连接Zookeeper是第一步,每个节点都需要在启动时尝试连接到 一个或多个Zookeeper服务器。注册/订阅节点需要在连接到Zookeeper后进行,以确 保在每个节点上正确维护应用程序运行的状态。断开连接是最后一步,确保在程 序退出之前,关闭与Zookeeper的所有连接。 搭建Zookeeper分布式环境需要仔细配置和验证,确保可以正常工作。通过搭建 分布式环境,可以更好地实现对分布式应用程序的协调和管理,提高系统的可靠性 和可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DATA数据猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值