目录
ZooKeeper是以Fast Paxos算法为基础的,Paxos 算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fast Paxos做了一些优化,通过选举产生一个leader (领导者),只有leader才能提交proposer,具体算法可见Fast Paxos。因此,要想弄懂ZooKeeper首先得对Fast Paxos有所了解。
1、选举Leader。
2、同步数据。
3、选举Leader过程中算法有很多,但要达到的选举标准是一致的。
4、Leader要具有最高的执行ID,类似root权限。
5、集群中大多数的机器得到响应并接受选出的Leader。
在Zookeeper中,znode是一个跟Unix文件系统路径相似的节点,可以往这个节点存储或获取数据。如果在创建znode时Flag设置为EPHEMERAL,那么当创建这个znode的节点和Zookeeper失去连接后,这个znode将不再存在在Zookeeper里,Zookeeper使用Watcher察觉事件信息。当客户端接收到事件信息,比如连接超时、节点数据改变、子节点改变,可以调用相应的行为来处理数据。Zookeeper的Wiki页面展示了如何使用Zookeeper来处理事件通知,队列,优先队列,锁,共享锁,可撤销的共享锁,两阶段提交。
那么Zookeeper能做什么事情呢,简单的例子:假设我们有20个搜索引擎的服务器(每个负责总索引中的一部分的搜索任务)和一个总服务器(负责向这20个搜索引擎的服务器发出搜索请求并合并结果集),一个备用的总服务器(负责当总服务器宕机时替换总服务器),一个web的cgi(向总服务器发出搜索请求)。搜索引擎的服务器中的15个服务器提供搜索服务,5个服务器正在生成索引。这20个搜索引擎的服务器经常要让正在提供搜索服务的服务器停止提供服务开始生成索引,或生成索引的服务器已经把索引生成完成可以提供搜索服务了。使用Zookeeper可以保证总服务器自动感知有多少提供搜索引擎的服务器并向这些服务器发出搜索请求,当总服务器宕机时自动启用备用的总服务器。
ZooKeeper是一个分布式协调服务,它提供了一个可靠的分布式协调服务框架,用于构建分布式应用程序和服务。ZooKeeper可以用于实现诸如配置管理、命名服务、分布式同步、组服务等功能。在Java中,使用ZooKeeper通常需要引入ZooKeeper客户端库。
- import org.apache.zookeeper.WatchedEvent;
- import org.apache.zookeeper.Watcher;
- import org.apache.zookeeper.ZooKeeper;
-
- import java.io.IOException;
-
- public class ZooKeeperConnection {
- private ZooKeeper zooKeeper;
-
- public ZooKeeper connect(String host) throws IOException {
- zooKeeper = new ZooKeeper(host, 2000, new Watcher() {
- @Override
- public void process(WatchedEvent event) {
- // 处理ZooKeeper事件
- }
- });
- return zooKeeper;
- }
-
- public void close() throws InterruptedException {
- zooKeeper.close();
- }
- }
上面的代码展示了如何连接到ZooKeeper服务器。在这个例子中,我们创建了一个ZooKeeper
对象,并指定了ZooKeeper服务器的主机地址和会话超时时间。同时,我们还传入了一个Watcher
对象,用于处理ZooKeeper事件。
- import org.apache.zookeeper.CreateMode;
- import org.apache.zookeeper.ZooDefs;
- import org.apache.zookeeper.ZooKeeper;
- import org.apache.zookeeper.data.Stat;
-
- public class ZooKeeperExample {
- public static void main(String[] args) throws Exception {
- ZooKeeperConnection connection = new ZooKeeperConnection();
- ZooKeeper zooKeeper = connection.connect("localhost:2181");
-
- String path = "/example";
- byte[] data = "example data".getBytes();
-
- // 创建持久节点,并设置数据
- zooKeeper.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
-
- // 获取节点数据
- Stat stat = new Stat();
- byte[] receivedData = zooKeeper.getData(path, false, stat);
- System.out.println(new String(receivedData));
-
- connection.close();
- }
- }
在这个示例中,我们创建了一个名为"/example"的持久节点,并设置了节点的数据为"example data"。然后,我们使用getData
方法获取节点的数据,并打印出来。
以上是一个简单的ZooKeeper使用示例,涵盖了连接到ZooKeeper服务器、创建节点并设置数据、获取节点数据等操作。当然,在实际项目中,你可能还需要处理更多复杂的情况,比如节点监听、ACL权限控制、会话管理等。希望这些示例能够帮助你快速入门ZooKeeper的基本用法。