1. cp zoo_sample.cfg zoo.cfg 配置集群 server.1 = ip1:端口号:选举端口号
2.创建zookeeper文件夹 创建myid文件 存入编号 3
3.zkServer.sh start 启动
jps查看启动 QuorumPeerMain
zkServer.sh status 查看状态 leader follower 自动选举
客户端连接到leader自动转发, 连接到follower会先转接到leader上 集群数量低于一半就挂掉了
ZooKeeper 是一个开源的分布式协调服务,分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协 调/通知、集群管理、Master 选举、配置维护,名字服务、分布式同步、分布式锁和分布式队列 等功能。
Zookeeper 中 有三种角色
Leader(1) Follower(n) Observer(peerType=observer)
private CountDownLatch latch = new CountDownLatch(1); ZooKeeper zk = null; try { zk = new ZooKeeper(registryAddress, Constant.ZK_SESSION_TIMEOUT, new Watcher() { @Override public void process(WatchedEvent event) { if (event.getState() == Event.KeeperState.SyncConnected) { latch.countDown(); } } }); latch.await(); //连接成功后往下执行 //创建节点 String path = zk.create(Constant.ZK_PROVIDER_PATH, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); //消费节点 byte[] data = zk.getData(Constant.ZK_REGISTRY_PATH + "/" + node, false, null); // 获取 /registry 的子节点中的数据
三 .ZooKeeper应用的典型场景
ZooKeeper 是一个高可用的分布式数据管理与协调框架。基于对ZAB算法的实现,该框架 能够很好地保证分布式环境中数据的一致性。也是基于这样的特性,使得 ZooKeeper 成为了 解决分布式一致性问题的利器
1 . 数据发布与订阅(配置中心)
ZooKeeper 采用的是推拉相结合的方式: 客户端想服务端注册自己需要关注的节点,一旦该节点的数据发生变更,那么服务端就会向相应 的客户端发送Watcher事件通知,客户端接收到这个消息通知后,需要主动到服务端获取最新的数据
2 . 命名服务
其中较为常见的就是一些分布式服务框架(如RPC)中的服务地址列表。通过在ZooKeepr里 创建顺序节点,能够很容易创建一个全局唯一的路径,这个路径就可以作为一个名字。 ZooKeeper 的命名服务即生成全局唯一的ID。
3 . 分布式协调服务/通知
ZooKeeper 中特有 Watcher 注册与异步通知机制,能够很好的实现分布式环境下不同机器, 甚至不同系统之间的通知与协调,从而实现对数据变更的实时处理。使用方法通常是不同的客户端 如果 机器节点 发生了变化,那么所有订阅的客户端都能够接收到相应的Watcher通知,并做出相应 的处理。 ZooKeeper的分布式协调/通知,是一种通用的分布式系统机器间的通信方式。
4 . Master选举
5 . 分布式锁
分布式锁又分为排他锁和共享锁两种
排它锁
ZooKeeper如何实现排它锁?
定义锁
ZooKeeper 上的一个 机器节点 可以表示一个锁,获得锁 把ZooKeeper上的一个节点看作是一个锁,获得锁就通过创建临时节点的方式来实现。 ZooKeeper 会保证在所有客户端中,最终只有一个客户端能够创建成功,那么就可以 认为该客户端获得了锁。同时,所有没有获取到锁的客户端就需要到/exclusive_lock 节点上注册一个子节点变更的Watcher监听,以便实时监听到lock节点的变更情况。因为锁是一个临时节点,释放锁有两种方式
当前获得锁的客户端机器发生宕机或重启,那么该临时节点就会被删除,释放锁
正常执行完业务逻辑后,客户端就会主动将自己创建的临时节点删除,释放锁。