ZooKeeper原理解读
通过优锐课核心java学习笔记中,我们可以看到,码了很多专业的相关知识, 分享给大家参考学习。
让我们讨论一下分布式系统以及ZooKeeper如何适应图片。
在本系列的后续文章中,我们将讨论将由集群中的HBase和OpenTSDB使用的ZooKeeper。
在谈论ZooKeeper之前,让我们解释一下分布式系统以及对ZooKeeper的需求。
分布式系统
当由通过计算机网络链接在一起的独立计算实体组成的软件系统及其组件相互通信和协调以实现共同目标时,这称为分布式系统。 (例如:多人在线游戏,例如《部落冲突》)
分布式系统的优势
- 可扩展性:我们可以通过在集群中添加更多计算机来轻松扩展分布式系统。
- 冗余:群集中的所有机器都提供相同的服务,因此,如果其中任何一台机器不可用,则不会停止工作。
这些系统中的过程需要某种类型的协议才能正确有效地运行。这种协议也称为分布式协调。
我们可以建立自己的协调系统,但是,这将需要大量的工作,而且并不是一件容易的事。 问题在于实施正确的容错解决方案。
那么,有什么可以替代的选择吗?
我们可以使用诸如ZooKeeper之类的强大协调服务。
什么是ZooKeeper?
ZooKeeper是一项集中式服务,用于维护配置信息,命名,提供分布式同步和提供组服务。 ZooKeeper简单,分布式,可靠且快速。
- 维护配置信息:它维护集群配置信息,该信息在集群中的所有节点之间共享。
- 命名:Zookeeper可以用作命名服务,以便集群中的一个节点可以在大型集群中找到另一个节点,例如:1000个节点集群
- 提供分布式同步:我们还可以使用Zookeeper通过使用锁,队列等来解决集群中的分布式同步问题。
- 提供群组服务:Zookeeper还可以通过选择集群中的主机来帮助进行群组服务(领导者选举过程)。
ZooKeeper可以在复制模式和独立模式下工作。
复制模式
在复制模式下,涉及多个服务器。 选择其中一台服务器作为领导者,其他服务器作为跟随者。 如果领导者失败,则跟随者之一将被选为大师。
群集中的服务器必须彼此了解。 它们在持久存储中维护内存中的状态图像以及事务日志和快照。 只要大多数服务器可用,ZooKeeper服务将可用。
客户端可以连接到单个ZooKeeper服务器。 但是,当客户端启动时,会为它们提供服务器列表,因此当与已连接服务器的连接失败时,客户端可以连接到群集中的任何其他服务器。
读取操作可以从群集中的任何服务器执行读取操作,但是写入操作必须经过领导者。
独立模式
ZooKeeper也可以独立运行。 在这种模式下,所有客户端都连接到单个Zookeeper服务器。
在这种模式下,我们将失去复制和高可用性的优势。
ZooKeeper数据模型
ZooKeeper具有层次结构的名称空间。 名称空间可以具有与其关联的数据以及子级。 到节点的路径始终表示为规范的,绝对的,斜杠分隔的路径。 没有相对参考。 这些名称空间的组织方式非常类似于Linux中的文件系统。
Znode:
ZooKeeper树中的每个节点都称为znode。 Znodes维护一个统计信息结构,其中包括用于数据更改,acl(访问控制列表)更改的版本号。 数据存储在znode中。
部署 ZooKeeper:
要部署Zookeeper,我们将使用官方Zookeeper Docker映像
在Server1中
version: '3.1'
services:
zoo1:
image: zookeeper:latest
restart: always
hostname: zoo1
ports:
- 2181:2181
- 2888:2888
- 3888:3888
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=server2IP:2888:3888 server.3=server3IP:2888:3888-
查看要点上的代码。
运行给定的yml server1 docker-compose -f zoo1.yml up -d
在 Server2中
version: '3.1'
services:
zoo2:
image: zookeeper:latest
restart: always
hostname: zoo2
ports:
- 2181:2181
- 2888:2888
- 3888:3888
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=server1IP:2888:3888 server.2=0.0.0.0:2888:3888 server.3=server3IP:2888:3888
查看要点上的代码.
运行给定的yml server2 docker-compose -f zoo2.yml up -d
在Server3中
version: '3.1'
services:
zoo2:
image: zookeeper:latest
restart: always
hostname: zoo2
ports:
- 2181:2181
- 2888:2888
- 3888:3888
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=server1IP:2888:3888 server.2=server2IP:2888:3888 server.3=0.0.0.0:2888:3888
查看要点上的代码.
在server3中运行给定的yml docker-compose -f zoo3.yml up -d
要检查Zookeeper的状态:
root@host:~# nc localhost 2181
stats
你可以在所有服务器上尝试给定的命令,然后在输出中检查模式,以查找领导者和跟随者。
*注意:将所有yml中的server1IP,server2IP和server3IP替换为其各自的值。
> 喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等
> 如果你对java技术很感兴趣也可以交流学习,共同学习进步。
> 不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代
文章写道这里,欢迎完善交流。最后奉上近期整理出来的一套完整的java架构思维导图,分享给大家对照知识点参考学习。有更多JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git等Java干货