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
相关推荐
阿里云云原生15 小时前
LLM 不断提升智能下限,MCP 不断提升创意上限
云原生
阿里云云原生15 小时前
GraalVM 24 正式发布阿里巴巴贡献重要特性 —— 支持 Java Agent 插桩
云原生
数据智能老司机18 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机18 小时前
CockroachDB权威指南——开始使用
数据库·分布式·架构
云上艺旅19 小时前
K8S学习之基础七十四:部署在线书店bookinfo
学习·云原生·容器·kubernetes
数据智能老司机19 小时前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构
IT成长日记19 小时前
【Kafka基础】Kafka工作原理解析
分布式·kafka
州周21 小时前
kafka副本同步时HW和LEO
分布式·kafka
爱的叹息1 天前
主流数据库的存储引擎/存储机制的详细对比分析,涵盖关系型数据库、NoSQL数据库和分布式数据库
数据库·分布式·nosql
千层冷面1 天前
RabbitMQ 发送者确认机制详解
分布式·rabbitmq·ruby