Zookeeper

目录

第 1 章 Zookeeper 入门

1.1 概述

 1.2特点

1.3 数据结构

1.4 应用场景

第 2 章 Zookeeper 安装

2.1 本地模式安装

启动zookeeper


1 Zookeeper 入门

1.1 概述

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

 1.2特点

1 Zookeeper :一个领导者( Leader ),多个跟随者( Follower )组成的集群。
2 )集群中只要有 半数以上 节点存活, Zookeeper 集群就能正常服务。所 以 Zookeeper 适合安装奇数台服务器。
3 )全局数据一致:每个 Server 保存一份相同的数据副本, Client 无论连接到哪个 Server ,数据都是一致的。
4 )更新请求顺序执行,来自同一个 Client 的更新请求按其发送顺序依次执行。
5 )数据更新原子性,一次数据更新要么成功,要么失败。
6 )实时性,在一定时间范围内, Client 能读到最新数据。
Version:0.9 StartHTML:0000000105 EndHTML:0000002307 StartFragment:0000000141 EndFragment:0000002267

1.3 数据结构

ZooKeeper 数据模型的结构与 Unix 文件系统很类似 ,整体上可以看作是一棵树,每个
节点称做一个 ZNode 。每一个 ZNode 默认能够存储 1MB 的数据,每个 ZNode 都可以 通过
其路径唯一标识。

1.4 应用场景

提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下
线、软负载均衡等。

 Version:0.9 StartHTML:0000000105 EndHTML:0000002869 StartFragment:0000000141 EndFragment:0000002829

统一命名服务

统一配置管理

Version:0.9 StartHTML:0000000105 EndHTML:0000000339 StartFragment:0000000141 EndFragment:0000000299

统一集群管理

 Version:0.9 StartHTML:0000000105 EndHTML:0000000345 StartFragment:0000000141 EndFragment:0000000305

服务器动态上下线

软负载均衡

第 2 Zookeeper 安装

2.1 本地模式安装

进入 https://archive.apache.org/dist/zookeeper/ 下载

将安装包放在 /opt/software下,学习前部分配置在hadoop章节下

 解压到制定目录

tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module/
修改名称
mv apache-zookeeper-3.5.7-bin/ zookeeper-3.5.7

进入文件夹并创建数据文件夹

 cd /opt/module/zookeeper-3.5.7/
mkdir zkData

修改配置文件名

mv conf/zoo_sample.cfg zoo.cfg

将文件夹路径配置到zoo.cfg中

启动zookeeper

/opt/module/zookeeper-3.5.7/bin/zkServer.sh start

/opt/module/zookeeper-3.5.7/bin/zkCli.sh

 输入 quit便可退出,在bin目录下执行 ./zkServer.sh status可查看当前状态为本地模式

停止

/opt/module/zookeeper-3.5.7/bin/zkServer.sh stop

2.2配置解读

1 tickTime = 2000 :通信心跳时间, Zookeeper 服务器与客户端心跳时间,单位毫秒
2 initLimit = 10 LF 初始通信时限
Leader Follower 初始连接 时能容忍的最多心跳数( tickTime 的数量)
3 syncLimit = 5 LF 同步通信时限
Leader Follower 之间通信时间如果超过 syncLimit * tickTime Leader 认为 Follwer
掉,从服务器列表中删除 Follwer
4 dataDir 保存 Zookeeper 中的数据
注意:默认的 tmp 目录,容易被 Linux 系统定期删除,所以一般不用默认的 tmp 目录。
5 clientPort = 2181 :客户端连接端口,通常不做修改。

3 Zookeeper 集群操作

3.1.1 集群安装

1、在102服务器创建myid文件,并输入2

vim /opt/module/zookeeper-3.5.7/zkData/myid

2、将zookeeper分发给103和104服务器,并编辑myid为3,4

 cd /opt/module/
 xsync zookeeper-3.5.7/

3、将zoo.cfg增加配置,并分发给103、104 

#######################cluster##########################
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
xsync zoo.cfg 

分别启动102、103、104服务器zookeeper,并查看102zookeeper状态

 zookeeper选举机制------非第一次启动

3.2 客户端命令行操作

1)本地启动客户端

/opt/module/zookeeper-3.5.7/bin/zkCli.sh 

服务启动

/opt/module/zookeeper-3.5.7/bin/zkCli.sh -server hadoop102:2181

3.2.2 znode 节点数据信息  

1 )查看当前 znode 中所包含的内容
ls /
2 )查看当前节点详细数据
ls -s /

1 czxid :创建节点的事务 zxid
每次修改 ZooKeeper 状态都会产生一个 ZooKeeper 事务 ID 。事务 ID ZooKeeper 中所
有修改总的次序。每次修改都有唯一的 zxid ,如果 zxid1 小于 zxid2 ,那么 zxid1 zxid2
前发生。
(2 ctime znode 被创建的毫秒数(从 1970 年开始)
(3 mzxid znode 最后更新的事务 zxid
(4 mtime znode 最后修改的毫秒数(从 1970 年开始)
(5 pZxid znode 最后更新的子节点 zxid
 
(6 cversion znode 子节点变化号, znode 子节点修改次数
(7 dataversion znode 数据变化号
(8 aclVersion znode 访问控制列表的变化号
(9 ephemeralOwner :如果是临时节点,这个是 znode 拥有者的 session id 。如果不是
临时节点则是 0
10 dataLength znode 的数据长度
11 numChildren znode 子节点数量

3.2.3 节点类型(持久/短暂/有序号/无序号)

1 )分别创建 2 个普通节点(永久节点 + 不带序号)
 create /sanguo "diaochan"
 create /sanguo/shuguo "liubei"

2)获得节点的值

3 )创建带序号的节点(永久节点 + 带序号)

 

再次创建发现如果原来没有序号节点,序号从 0 开始依次递增。如果原节点下已有 2 个节点,则再排 序时从 2 开始,以此类推。

4 )创建短暂节点(短暂节点 + 不带序号 or 带序号)

 

 退出后进入,短暂节点被删除

修改节点数据值

3.2.4 监听器原理

客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、节点删除、子目
录节点增加删除)时, ZooKeeper 会通知客户端。监听机制保证 ZooKeeper 保存的任何的数
据的任何改变都能快速的响应到监听了该节点的应用程序。

 

1 )节点的值变化监听
1 )在 hadoop104 主机上注册监听 /sanguo 节点数据变化
 get -w /sanguo
(2 )在 hadoop103 主机上修改 /sanguo 节点的数据
[zk: localhost:2181(CONNECTED) 1] set /sanguo "xisi"
(3 )观察 hadoop104 主机收到数据变化的监听
注意:在 hadoop103 再多次修改 /sanguo 的值, hadoop104 上不会再收到监听。因为注册
一次,只能监听一次。想再次监听,需要再次注册
 
3.2.5 节点删除与查看
1 )删除节点

2)递归删除节点

3.3 客户端 API 操作

1 在IDEA下创建maven项目,并添加pom依赖

    <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>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.5.7</version>
        </dependency>
    </dependencies>
2)新建日志配置文件 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 

3)创建 ZooKeeper 客户端

import org.apache.zookeeper.*;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * @Author sxd
 * @create 2023/1/22 10:29
 */
public class zkClient {

    // 注意:逗号前后不能有空格
    private static String connectString =
            "hadoop102:2181,hadoop103:2181,hadoop104:2181";
    private static int sessionTimeout = 2000;
    private ZooKeeper zkClient = null;

    @Before
    public void init() throws Exception {
        zkClient = new ZooKeeper(connectString, sessionTimeout, new
                Watcher() {
                    @Override
                    public void process(WatchedEvent watchedEvent) {
// 收到事件通知后的回调函数(用户的业务逻辑)
                        System.out.println(watchedEvent.getType() + "--"
                                + watchedEvent.getPath());
                        System.out.println("-----------");
                        List<String> children = null;
// 再次启动监听
                        try {
                            children = zkClient.getChildren("/",
                                    true);
                            for (String child : children) {
                                System.out.println(child);
                            }
                            System.out.println("-----------");
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
    }
//    创建节点
    @Test
    public void create() throws InterruptedException, KeeperException {
        String nodeCreated = zkClient.create("/study", "tests".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

    }

    @Test
    public void getChildren() throws InterruptedException, KeeperException {
        List<String> children = zkClient.getChildren("/", true);
        for (String child : children) {
            System.out.println(child);
        }
        //延时
        Thread.sleep(Long.MAX_VALUE);
    }
}

运行 create,节点被创建,并开启监听

 

  zookeeper创建节点和删除节点,控制台显示已有节点

4.1 选举机制

半数机制,超过半数的投票通过,即通过。
1 )第一次启动选举规则:
投票过半数时,服务器 id 大的胜出
2 )第二次启动选举规则:
EPOCH 大的直接胜出
EPOCH 相同,事务 id 大的胜出
③事务 id 相同,服务器 id 大的胜出

4.2 生产集群安装多少 zk 合适?

安装奇数台。
生产经验:
10 台服务器: 3 zk
20 台服务器: 5 zk
100 台服务器: 11 zk
200 台服务器: 11 zk
服务器台数多:好处,提高可靠性;坏处:提高通信延时
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ONLYYD

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

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

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

打赏作者

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

抵扣说明:

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

余额充值