开课-zookeeper-5

本文深入探讨了ZooKeeper客户端zKclient与Curator的使用案例,包括节点的创建、读取、修改和监听等操作。同时,介绍了ZooKeeper在分布式环境中的关键应用,如分布式锁、队列和配置管理,以及其在状态收集和热备容灾方案中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

zKclient:

代码:

代码:

import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.serialize.SerializableSerializer;
import org.apache.zookeeper.CreateMode;

import java.util.concurrent.CountDownLatch;

public class zKclientTest {
    private static final String CLUSTER = "192.168.244.130:2181,192.168.244.131:2181,192.168.244.132:2181";
    private static final String PATH = "/fdy";
    final static CountDownLatch latch = new CountDownLatch(1);
    public static void main(String[] args) throws InterruptedException {
        ZkClient zkClient = new ZkClient(CLUSTER);
        // 指定序列化器
        zkClient.setZkSerializer(new SerializableSerializer());
        // 创建节点
        CreateMode mode =CreateMode.PERSISTENT;
        String data = "fdySon";
        String nodeName = zkClient.create(PATH+"/fdySon1",data,mode);
        System.out.println("创建节点成功"+nodeName);
        Object readData = zkClient.readData(PATH);
        System.out.println("获取节点成功"+readData);
        zkClient.writeData(PATH,"new");
        Object readDataNew = zkClient.readData(PATH);
        System.out.println("获取节点成功"+readDataNew);
        zkClient.delete(PATH);
        boolean isExists = zkClient.exists(PATH);
        System.out.println("节点存在"+isExists);

        zkClient.subscribeDataChanges(PATH, new IZkDataListener() {
            @Override
            public void handleDataChange(String s, Object o) throws Exception {
                System.out.println("节点"+s);
                System.out.println("数据"+o);
                latch.countDown();
            }
            @Override
            public void handleDataDeleted(String s) throws Exception {
            }
        });

        System.out.println(777);
        zkClient.writeData(PATH,"new123");
        System.out.println(888);
        latch.await();

    }
}

Curator:

创建临时节点要求父类节点必须要有的。不能创建已经存在的节点。

代码:

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.api.CuratorWatcher;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;

import java.util.List;

public class zkFluentTest {
    private static final String PATH = "/fdyFluent";
    public static void main(String[] args) throws Exception {
        new Person().setName("123").setSex("123");
        // 创建会话
        ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000,3);
        CuratorFramework client = CuratorFrameworkFactory.builder().connectString("192.168.244.130:2181,192.168.244.131:2181,192.168.244.132:2181")
                .sessionTimeoutMs(15000).connectionTimeoutMs(13000).retryPolicy(retryPolicy).namespace("logs")// 客户端 隔离的命名空间
                .build();
        client.start();
        System.out.println(1);
        String nodeName = client.create().creatingParentContainersIfNeeded().withMode(CreateMode.PERSISTENT).forPath(PATH+"/fdySon1/cbbb","flunt".getBytes());
        System.out.println(2);
        System.out.println("创建节点成功"+nodeName);

        // 删除节点
        client.delete().forPath(PATH);
        client.delete().deletingChildrenIfNeeded().forPath(PATH);
        // 获取数据 注册watcher。这个监听是监听PATH的
        byte[] data = client.getData().usingWatcher((CuratorWatcher)event->{
             System.out.println(event.getPath()+"内容变化");
        }).forPath(PATH);
        // 获取子节点列表
        List<String> children = client.getChildren().forPath(PATH);
    }
}

--------------

新的知识点:

zk的顺序节点。在某一个范围里面为服务起一个唯一的标识。

uuid是多少个字符?36个32个字符+4个-。

顺序节点。 

订单编号和支付编号是业务相关的还是唯一的。

---

  域名和指定的ip:端口绑定,通过域名访问主机。

注册中心和DNS的作用是一样的。

app1是一个应用程序,app2是另一个应用程序。每个应用程序有子节点就是域名,域名下有很多主机的ip:port列表。

修改域名就是新增一个节点。

状态收集器是定期的搜集服务提供者的状态,写入到status里面去。

---2019-02-27-1---

分布式同步:分布式不是集群。

都对同一个znode就行监听。

总体的架构是两个组件,元数据的组件,复制组件。复制组件去元数据组件读取元数据,然后把数据从主机复制到从机。

首先在zookeeper注册复制任务。

复制线程启动则复制任务开启。

创建子任务节点,是支付表还是订单表。

热备容灾方案。

多个主机都可以完成复制任务。

同一时间只有一个主机是running的,其他的都是standby的。最小的running,其他的sstandby。

这个是完成复制任务的机器节点,是临时节点,down机要watch的。

status主要是记录了哪个instance是down机了还有进度的(binlog)。

down机了,通过binlog记录消费进度,在status里面维护的。

如果down机马上切换状态。

instances的watcher机制。

status是如何写入的?watch监听主机临时节点的数量,down机器则给status更新。

pay_recode是表。

分布式拦栅:https://blog.csdn.net/weixin_34227447/article/details/91898959

https://www.cnblogs.com/qingfei1994/p/7670326.html

 

分布式拦栅的实现:

代码:

---

集群的主机都注册临时节点。有节点的变化就知道了。

---

---2019-02-27-2---

这是最全的。

zookeeper的分布式锁:

zk的锁,是临时的顺序节点。

读锁可以加多个的。

锁是在方法上加锁,加在对象上的,线程调用方法,如果加锁了,则在集合里面等待的,直到锁释放。

分布式队列:

---2019-02-27-2---

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值