2、Zookeeper是怎么写入数据的?

Zookeeper数据写入流程图

zookeeper数据写入流程图

二、要素说明

  1. 色块1:zk集群中的follower服务节点,物理体现为一个java进程
  2. 色块2:zk集群中的leader服务节点,物理体现为一个java进程
  3. 色块3:连接zk服务的客户端,物理体现为一个进程
  4. 色块4:保存在zk服务进程中java堆内存的 数据
  5. 色块5:写操作日志,物理体现为一个文件
  6. 色块6:保存zk服务进程中数据的一个快照文件,在zk服务进程重启时通过读取这个文件还原之前的内存数据
  7. 箭头7:leader的客户端 或者是 follower 转发他们客户端的写请求
  8. 箭头8:leader向所有follower提交 提议
  9. 箭头9:各个follower向leader提交 提议已完成
  10. 箭头0:leader向所有follower提交commit请求

三、Zookeeper数据写入流程

二阶段过半写机制

客户端提交阶段(上图箭头7)

  • 客户端提交写请求到zk server,如果zk server是follower或observer,它们会把写请求转发给leader。如果zk server是leader ,leader会直接处理写请求。

Leader提议阶段(上图箭头8)

  • Leader 向所有follower和自己发起propose(提议)请求。

提议确认阶段(上图箭头9)

  • 所有follower和leader处理propose(提议)请求,把提议写入日志里,并向leader发送propose ack请求,表示已完成propose(提议)请求处理,此时数据对客户端来说还不可见。

数据生效阶段(上图箭头0)

  • leader 收到超过半数(包括自己)propose ack请求,就会向所有follower和自己发送commit请求
  • follower 收到commit请求会把数据写入内存,此时数据就对客户端就可见了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 Java API 将数据写入 ZooKeeper 的示例代码: ```java import org.apache.zookeeper.*; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.data.Stat; import java.io.IOException; import java.util.concurrent.CountDownLatch; public class ZooKeeperWriter implements Watcher { private static final int SESSION_TIMEOUT = 5000; private static final String CONNECTION_STRING = "localhost:2181"; private static final String ZNODE_PATH = "/my_znode"; private static final String ZNODE_DATA = "Hello, ZooKeeper!"; private ZooKeeper zooKeeper; private CountDownLatch connectedSignal = new CountDownLatch(1); public void connect() throws IOException, InterruptedException { zooKeeper = new ZooKeeper(CONNECTION_STRING, SESSION_TIMEOUT, this); connectedSignal.await(); } public void close() throws InterruptedException { zooKeeper.close(); } public void createZNode() throws KeeperException, InterruptedException { byte[] data = ZNODE_DATA.getBytes(); zooKeeper.create(ZNODE_PATH, data, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } public void updateZNode() throws KeeperException, InterruptedException { byte[] data = "Updated data".getBytes(); zooKeeper.setData(ZNODE_PATH, data, zooKeeper.exists(ZNODE_PATH, true).getVersion()); } public void deleteZNode() throws KeeperException, InterruptedException { zooKeeper.delete(ZNODE_PATH, zooKeeper.exists(ZNODE_PATH, true).getVersion()); } public void process(WatchedEvent event) { if (event.getState() == KeeperState.SyncConnected) { connectedSignal.countDown(); } } public static void main(String[] args) throws IOException, InterruptedException, KeeperException { ZooKeeperWriter zooKeeperWriter = new ZooKeeperWriter(); zooKeeperWriter.connect(); zooKeeperWriter.createZNode(); zooKeeperWriter.updateZNode(); zooKeeperWriter.deleteZNode(); zooKeeperWriter.close(); } } ``` 这个示例程序首先创建了一个 ZooKeeper 实例并在 `connect()` 方法中等待连接建立。然后,它使用 `createZNode()` 方法创建了一个数据节点,并使用 `updateZNode()` 方法更新了该节点的数据,最后使用 `deleteZNode()` 方法删除了该节点。在 `process()` 方法中,我们使用 `CountDownLatch` 来等待连接建立完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值