ZooKeeper学习笔记

2023-09-17 22:02:08

1 概述

  • zk是基于观察者模式设计的;(观察者模式)
  • zk是一个服务管理框、协调框架;
  • zk服务本身也是一个集群,有一个leader,多个follower,类似于一主多从;
  • 集群有超过半数节点存活,zk就能对外提供服务,所以适合奇数服务器;
  • zk的一个节点默认只能存储1MB数据,所以不建议存储海量数据;
  • 一个zk集群所有节点的数据结构可以理解为一棵树;
  • zk的功能:
    • 统一命名服务:访问集群不直接通过ip,而是通过自定义的命名;
    • 统一配置管理:希望修改配置对集群内所有机器有效;
    • 统一集群管理:监控集群某个节点状态;
    • 服务节点动态上下线:节点上下线;
    • 软负载均衡:集群每个机器能力不一样,可以动态调整;

2 安装

可以直接安装也可以docker安装

3 zoo.cfg配置

  • tickTime:心跳时间,zk服务端和客户端的心跳时间,单位毫秒;
  • initLimit:Leader和follower初始连接时能容忍的最多心跳数;
  • syncLimit:日常Leader和follower能容忍的最多心跳数;
  • dataDir:存储zk的数据;
  • clientPort:客户端连接的端口,默认2181,通常不做修改;

4 zk集群配置

  • 在dataDir目录下创建myid的文件,内容为节点对应的id;
  • 在zoo.cfg新增配置:server.A=B:C:D
    • A是myid的值;
    • B是这个服务器的地址;
    • C是该服务器follower和集群Leader服务器交换信息的端口;
    • D是万一集群Leader挂了,需要一个端口重新选举,选出新的Leader;
  • 各自启动,自动选举leader和follower;

5 客户端

5.1 节点类型

  • 持久:客户端和服务端断开连接后,创建的节点不删除;
  • 短暂:客户端和服务端断开连接后,创建的节点自动删除;
  • 带序号:创建节点带有序号;
  • 不带序号:创建节点无序号;

5.2 节点数据操作

  • create /my_server/server1 "192.168.0.1":my_server是集群,server1是机器名字,值为机器的ip地址;
  • get /my_server/server1:返回server1的ip地址;
  • create -e /my_server/server1 "192.168.0.1" 短暂创建;
  • set * *修改值;
  • delete /my_server/server1 :删除节点

5.3 监听器

利用观察者模式,zk客户端在服务端注册,如果节点数据有变化,就通知所有客户端的场景。

  • 可以监听节点数据的变化;
  • 监听子节点增删的变化;

6 springboot客户端

导入ZooKeeper客户端的maven依赖

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

使用api

package com.chengdugay.service;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.Before;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;

@Slf4j
@SpringBootTest
public class ZKTest {

    /**
     * 地址
     */
    private static final String ZK_SERVER_ADDRESS = "*.*.*.*:2181";

    /**
     * 客户端
     */
    ZooKeeper zooKeeper;

    /**
     * 初始化
     *
     * @throws IOException
     */
    @Before
    public void init() throws IOException {
        zooKeeper = new ZooKeeper(ZK_SERVER_ADDRESS, 2000, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {

            }
        });
    }

    @Test
    public void demo() throws InterruptedException, KeeperException {
        // 创建,返回key值
		String s = zooKeeper.create("/server4", "192.168.1.4".getBytes(StandardCharsets.UTF_8), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

        // 获取子节点变化
        List<String> children = zooKeeper.getChildren("/", true);
        log.info(JSON.toJSONString(children));

        // 获取节点的值
        byte[] data = zooKeeper.getData("/server1", false, zooKeeper.exists("/server1", false));
        log.info(new String(data));
    }
}

7 服务注册与发现

7.1 zk集群端

创建一个分布式服务的签名create /servers "servers"

7.2 业务服务端

// 获取向zk注册
zooKeeper.create("/servers/"+hostname, hostname, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);

// 其他业务逻辑

7.3 业务客户端

// 监听zk的变化
zooKeeper = new ZooKeeper(ZK_SERVER_ADDRESS, 2000, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
            	// 监听有服务有哪些机器的key
				List<String> children = zooKeeper.getChildren("/servers", true);
		        // 获取节点的值
		        for (String child : children) {
		            byte[] data = zooKeeper.getData("/"+child, false, null);
		            log.info(new String(data));
		        }
				// 业务逻辑
            }
        });

8 分布式锁

原理:利用“临时顺序节点”的功能,约定只有最小序号的节点才能操作业务。
实现:执行业务逻辑前先去zk注册“临时顺序节点”,然后获取最新的注册列表,如果就是自己刚才注册的,说明自己拿了锁,执行业务逻辑;如果没有,说明自己在排队,就需要监听,看自己什么时候能拿到锁,监听的事件就是“排在我前面的那个请求完成了他的业务逻辑”。

9 Curator框架

curator是一个分布锁的框架。

更多推荐

RockyLinux9.2 网卡配置和nmcli、nmtui命令的使用

NetworkManagerNetworkManager是一个标准的Linux网络配置工具套件,支持服务器,也支持桌面环境,发展到如今,绝大多数流行的发行版都支持它。这套网络配置工具适用于RockyLinux8及更高版本。nmcli是nm的命令行工具、nmtui是nm的ui工具nmcli查看网络信息ipa或者nmcli

Linux文件内容查看和编辑指南:cat、less、grep等常用命令详解

文章目录Linux文件内容查看和编辑1.查看文件内容cat用法cat详解概要主要用途参数选项返回值例子注意lessless详解补充说明语法选项参数实例moremore详解补充说明语法选项参数实例2.文件搜索和过滤grepgrep详解语法选项参数实例findfind详解语法选项参数实例awkawk详解语法选项参数实例3.

深入浅出之数组

深入浅出之数组文章目录:深入浅出之数组一、数组的基本语法1.1数组声明1.2数组初始化二、多维数组2.1多维数组的基本语法2.2多维数组的适用场景三、数组的实际练习(传智杯真题为例)一、数组的基本语法1.1数组声明数组声明通常为valuename[number]的形式。value是值得数据类型,name是数组名称,nu

物联网如何助力乡村数字经济发展

在当今移动互联网时代,信息化数字化已经渗透了我们生活的方方面面,数字物联网转型也成为各个产业的重要动力。对于广大乡村来说,得益于网络基础设施的全面建成覆盖,乡村各产业也迎来数字化新业态转型,创新诞生了基于物联网的数字农业、数字养殖、数字文旅、数字农村电商等一系列新模式,本篇就为大家简答介绍一下物联网如何打造乡村数字经济

Ingress Controller

什么是IngressController?在云原生生态中,通常来讲,入口控制器(IngressController)是Kubernetes中的一个关键组件,用于管理入口资源对象。Ingress资源对象用于定义来自外网的HTTP和HTTPS规则,以控制进入集群内服务的流量。而IngressController则是真正实现

图解直接映射(Direct mapped)、全相联(Fully-associative)和组相联(Set-associative)cache缓存基本原理

图解直接映射(Directmapped)、全相联(Fully-associative)和组相联(Set-associative)cache一,直接映射缓存(Directmappedcaches)1.1直接映射示例1.2直接映射原理1.3cache颠簸(cachethrashing)二,全相联映射(Fully-assoc

强化学习从基础到进阶–案例与实践[8]:近端策略优化(proximal policy optimization,PPO)算法

【强化学习原理+项目专栏】必看系列:单智能体、多智能体算法原理+项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现专栏详细介绍:【强化学习原理+项目专栏】必看系列:单智能体、多智能体算法原理+项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现对于深度强化学习这块规划为:基础单智能算法教学(g

爬虫入门基础与Selenium反爬虫策略

目录一、爬虫入门基础1、什么是爬虫?2、爬虫的分类3、爬虫的基本流程二、Selenium简介1、Selenium是什么?2、Selenium的用途三、应对反爬虫的Selenium策略1、使用代理IP2、模拟用户行为3、设置合理的请求间隔时间4、随机化请求参数5、使用JavaScript渲染引擎四、Selenium的局限

【LLM模型篇】LLaMA2 | Vicuna | EcomGPT等

文章目录一、LLM模型chatglm2模型Vicuna模型LLaMA2模型1.训练细节2.EvaluationResults3.更多参考alpaca模型百川大模型其他大模型和peft高效参数微调二、行业垂直领域大模型度小满的轩辕2.0模型微调1.模型介绍2.混合微调MedicalGPT:医疗大模型ChatLaw:法律大

Firefox火狐浏览器显示你的连接不安全,是什么意思?

当Firefox连接到一个安全的网站时(网址最开始为“https://”),它必须确认该网站出具的证书有效且使用足够高的加密强度,以充分保护您的隐私。如果证书无法通过验证,或加密强度过低,Firefox会中止连接到这个网站,并向您显示SSL证书错误信息页面:“你的连接不安全”。什么情况下出现“你的连接不安全”?出现“你

一文掌握cshell编程(概念、案例双管齐下)

前言相信在IC行业中不少公司使用cshell作为脚本语言之一,很不幸的是目前网络上cshell的中文介绍少之又少,绝大部分是bash的介绍。近期有幸阅读了一本cshellcookbook,故将个人的学习心得发布于此,也希望志同道合的朋友一起探讨一番。(从看cookbook到博文的发表历时4个月,每天下完班就瞌睡的很,i

热文推荐