Zookeeper

官网:Apache ZooKeeper

Zookeeper是基于观察者模式设计的分布式服务协调管理框架,Zookeeper = 文件系统 + 通信机制

文件系统 : 管理前是不是要先登记信息呀,所以它有服务注册发现功能(注册中心),存储服务之间的数据;

通信机制 : 管理肯定涉及一些操作,当记录的数据发生变化时,是不是要调用相应的回调函数;

因为服务一般是集群部署,有时候不需要所有机器同时触发某逻辑,是不是需要分布式锁支持,所以Zookeeper自己也实现一套分布式锁。。。。。。比如Kafka集群得Controller选举机制,"先到先得"

Zookeeper集群只要有大于半数的节点存活,才能正常工作,所以Zookeeper集群一般是奇数部署

其它功能:

1.域名解析www.xxxx.com --> 192.168.208.111,192.168.208.112 ...

2.配置中心:上面说了注册中心,zk还有统一配置的功能

  1. 健康检测: zk的客户端(被管理的微服务)是否处于正常工作状态,发送警告短信给运维人员

  2. 动态路由:因为有健康检测,如果请求访问了zk下线的客户端,会将请求转发到健康的zk客户端

  3. 分布式锁:序号越小优先级越高,代表获取到锁(公平锁),Client1操作完 或者 挂掉了将msg1清除(释放锁);扩展一下利用Mysql 的主键唯一索引和行级锁机制(并发操作同一行数据,会自动加锁)也可以实现分布式锁

javascript 复制代码
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.3.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.3.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-client -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-client</artifactId>
            <version>4.3.0</version>
        </dependency>
java 复制代码
package com.ldj.lockdemo;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.framework.state.ConnectionState;
import org.apache.curator.framework.state.ConnectionStateListener;
import org.apache.curator.retry.ExponentialBackoffRetry;

/**
 * User: ldj
 * Date: 2024/10/13
 * Time: 3:03
 * Description: ZK客户端Demo
 */
public class DistributedLock {

    public static void main(String[] args) throws Exception {

        InterProcessMutex lock1 = new InterProcessMutex(getConnection(), "/lock_test");

        new Thread(() -> {
            try {
                lock1.acquire();
                System.out.println("[" + Thread.currentThread().getId() + "] >>>>>>>> 获取锁");

                lock1.acquire();
                System.out.println("[" + Thread.currentThread().getId() + "] >>>>>>>> 再次获得锁,说明是可重入锁");

                lock1.release();
                System.out.println("[" + Thread.currentThread().getId() + "] >>>>>>>> 释放锁");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }).start();
    }

    private static CuratorFramework getConnection() {
        // 设置超时策略
        ExponentialBackoffRetry policy = new ExponentialBackoffRetry(3000, 3);

        CuratorFramework curatorFramework = CuratorFrameworkFactory.builder()
                .connectString("192.168.208.200:2181")
                .connectionTimeoutMs(60000) // 一般在30~45秒
                .sessionTimeoutMs(60000)
                .retryPolicy(policy)
                .authorization("digest", "user:password".getBytes())
                .build();

        ConnectionStateListener listener = (client, newState) -> {
            if (newState == ConnectionState.CONNECTED) {
                System.out.println(">>>>>>>> zookeeper successfully connected!");
            }
        };

        // 设置监听回调
        curatorFramework.getConnectionStateListenable().addListener(listener);
        curatorFramework.start();
        System.out.println(">>>>>>>> zookeeper is connecting...");

        return curatorFramework;
    }
}

单机安装:

复制代码
# 解压
tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz
mv apache-zookeeper-3.5.7-bin zookeeper-3.5.7

# 数据目录
cd zookeeper-3.5.7/
mkdir data
java 复制代码
# 改配置
cd conf/
touch zoo.cfg
cp zoo_sample.cfg zoo.cfg
y

vim zoo.cfg
java 复制代码
# 进入/bin 启动服务

sh zkServer.sh start
jps

# 进入/bin 启动客户端
sh zkCli.sh

# 退出
quit
java 复制代码
# 补充:
# 查看状态
sh zkServer.sh status

# 停止服务
sh zkServer.sh stop
相关推荐
阿里云云原生3 天前
阿里云获评 Agentic AI 开发平台领导者,函数计算 AgentRun 赢下关键分!
云原生
初次攀爬者3 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
阿里云云原生4 天前
MSE Nacos Prompt 管理:让 AI Agent 的核心配置真正可治理
微服务·云原生
阿里云云原生4 天前
当 AI Agent 接管手机:移动端如何进行观测
云原生·agent
阿里云云原生4 天前
AI 原生应用开源开发者沙龙·深圳站精彩回顾 & PPT下载
云原生
阿里云云原生4 天前
灵感启发:日产文章 100 篇,打造“实时热点洞察”引擎
云原生
~莫子4 天前
Haproxy七层负载详解+实验详细代码
云原生
阿里云云原生4 天前
OpenTelemetry + 云监控 2.0:打造你的云原生全栈可观测
云原生
阿狸猿4 天前
云原生数据库
云原生·软考
至此流年莫相忘4 天前
Kubernetes实战篇之配置与存储
云原生·容器·kubernetes