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
相关推荐
斯普信专业组8 分钟前
Kafka集群数据迁移方案
分布式·kafka·数据迁移
CopyLower1 小时前
Redis 分布式锁:原理、实现及最佳实践
数据库·redis·分布式
一條狗2 小时前
隨便 20241028 ISR 和 OSR 在 Kafka 中的详细解析
分布式·kafka
Hello.Reader2 小时前
Istio 服务网格深度解析
云原生·istio
少陽君2 小时前
k8s之调动pod到指定节点与创建多容器pod并查找pod日志
云原生·容器·kubernetes
阿里-于怀2 小时前
API网关
后端·云原生
Algorithm15764 小时前
关于使用K8s实现容器化作业的总时效最优调度
云原生·容器·kubernetes
ACRELKY6 小时前
分布式储能监控系统在某5MW分布式储能项目中的应用
分布式
FakeOccupational8 小时前
【p2p、分布式,区块链笔记 IPFS】go-ipfs windows系统客户端节点实现 kubo试用
分布式·区块链·p2p