一、Zookeeper和Nacos区别
Zookeeper和Nacos都是分布式协调服务,它们的核心功能非常相似:注册中心、配置中心、分布式锁。但是Zookeeper和Nacos有一些明显的区别:
1、Zookeeper是Apache早期的一个开源项目,基于Paxos协议实现,稳定性非常高;Nacos是阿里巴巴开发的最新一代服务发现和配置管理中心,除了支持CAP理论之外,还支持docker/k8s环境下的动态配置。
2、Zookeeper只支持java客户端的api接口,其他语言调用需要通过ZkClient等第三方库;Nacos支持多语言的客户端接口(支持Java, .NET Core, Go等)。
3、Zookeeper配置和数据都是存储在内存中,需要从磁盘加载,启动时间需要几分钟到十多分钟;Nacos的数据存储使用了Mysql和RockDB,支持高并发、容错、持久化,启动时间比Zookeeper快很多。
二、Zookeeper干嘛的
Zookeeper可以用于构建高可用、高可靠的分布式应用程序,底层使用ZAB协议,可以提供数据发布/订阅、服务发现、负载均衡、分布式锁、分布式队列等功能。
在分布式应用程序中,节点之间需要调用、协调和发送消息。Zookeeper的作用就是为这些节点提供一个相对稳定的中心点,它可以对这些节点进行统一的管理和控制。Zookeeper用来保证分布式系统中各个节点之间的数据一致性,是一种典型的发布/订阅模型。
Zookeeper的一个非常重要的作用就是对分布式锁的支持,可以应用在分布式事务、分布式协调等场景中。它可以确保在一个时刻只有一个客户端对一个共享资源进行修改,从而防止数据混乱。
此外,Zookeeper还支持分布式的队列,允许在分布式的环境中同时在线下进行发布和消费的数据。
三、Zookeeper使用场景
1、分布式锁:Zookeeper可以为分布式系统提供分布式锁,实现多个应用实例对共享资源的并发安全访问。
public class DistributedLock{
private static final int sessionTimeout = 5000;//比较合理的超时时间
private static final String CONNECTION_STRING = "localhost:2181,localhost:2182,localhost:2183";//zookeeper地址
private static ZooKeeper zooKeeper;
private static CountDownLatch connectedSemaphore = new CountDownLatch(1);//计数器对象
public static boolean acquire(String lockPath) throws Exception {
zooKeeper = new ZooKeeper(CONNECTION_STRING, sessionTimeout, new Watcher() {
public void process(WatchedEvent event) {
}
});
connectedSemaphore.await();
zooKeeper.create(lockPath, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
return true;
}
}
2、配置中心:Zookeeper可以保存应用程序的配置文件,实现动态配置,当配置变化时,可以热加载生效。
private String initConfig() {
byte[] data = new byte[0];
try {
data = zooKeeper.getData(CONFIG_PATH, null, null);
} catch (Exception e) {
e.printStackTrace();
}
return new String(data);
}
3、服务发布与发现:Zookeeper提供了分布式的服务注册与发现服务,可以实现服务动态扩容、负载均衡等功能。
public class ServiceDiscovery {
private ZooKeeper zooKeeper;
public void watchNode (String serviceName) {
try {
List<String> nodeList = zooKeeper.getChildren(Constant.ZK_REGISTRY_PATH + "/" serviceName, true);
List<String> dataList = new ArrayList<String>();
for (String node : nodeList) {
byte[] bytes = zooKeeper.getData(Constant.ZK_REGISTRY_PATH + "/" + serviceName + "/" + node, false, null);
String data = new String(bytes);
dataList.add(data);
}
ServiceDiscoveryUtil.updateServiceList(serviceName, dataList);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
四、Zookeeper是做什么的
Zookeeper主要用于解决分布式应用程序中的一些共性问题,如应用程序的配置数据、命名服务、集群管理、分布式锁、分布式队列等问题。通过实现这些功能,Zookeeper可以让分布式系统中的各个节点之间更加稳定、可靠、安全、高效地通信。
五、Zookeeper能干什么
Zookeeper最大的用途是为分布式系统提供分布式应用程序的一些共性问题的解决方案,如配置管理、服务注册、分布式锁等功能。这些功能的实现可以让分布式系统中的各个节点之间更加稳定、可靠、安全、高效地通信。
Zookeeper还可以应用在如下场景中:
1、分布式的队列:使用Zookeeper实现分布式的队列,可以在分布式环境中同时在线下进行发布和消费的数据。
2、集中式协调服务:通过Zookeeper可以构建分布式协调服务,提供诸如领导选举、分布式锁、分布式数据存储等功能。
3、配置中心:可以通过Zookeeper实现应用程序的配置中心,实现动态配置。
六、Zookeeper是什么框架
Zookeeper是一个分布式的协调框架,它为分布式应用程序中的节点提供统一的管理和控制,提高应用程序的可靠性和可用性。
Zookeeper的特点:
1、高可用性:Zookeeper可以构建高可用、高可靠的分布式应用程序,在主节点故障的情况下,从节点可以接手工作,保障分布式应用程序的正常运行。
2、高性能:Zookeeper采用ZAB协议,在数据一致、可用性和延迟之间做了很好的平衡。
3、易于使用:Zookeeper提供简便的api接口,可以快速的进行分布式开发。
七、Zookeeper面试题及答案
1、Zookeeper是什么?
Zookeeper是一个分布式的协调框架,它为分布式应用程序中的节点提供统一的管理和控制,提高应用程序的可靠性和可用性。
2、Zookeeper提供哪些功能?
Zookeeper提供命名服务、分布式锁、分布式队列、服务发现、配置中心等功能。
3、Zookeeper的数据模型是什么?
Zookeeper的数据模型是一个树形结构,节点名由斜杠分隔的字符串构成。
4、Zookeeper如何实现分布式锁?
Zookeeper的实现方式是创建有序节点,等待序号最小的节点释放锁。
八、简述Zookeeper的功能
Zookeeper是一个分布式协调框架,提供了分布式应用程序的共性问题解决方案,如命名服务、分布式锁、分布式队列、配置中心等功能。通过这些功能,可以让分布式系统中的各个节点之间更加稳定、可靠、安全、高效地通信。
九、Zookeeper和Kafka的关系
Zookeeper在Kafka中扮演着非常重要的角色,主要用于保存Kafka的元数据,如Broker的信息、Topic的信息、Partition的信息等。在Kafka中,每当一个Broker加入或离开集群,或者一个Topic被创建或删除,Zookeeper都需要进行相应的更新,以便Kafka Cluster能够更新它的元数据。