字节跳动最新开源,最经典的HashMap图文详解,

随时待命 2021-09-15 07:59:25
java 后端 程序员


NO1:说说zookeeper是什么?

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现(Chubby是不开源的),它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户 。

Zookeeper一个最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心,服务生产者将自己提供的服务注册到Zookeeper中心,服务的消费者在进行服务调用的时候先到Zookeeper中查找服务,获取到服务生产者的详细信息之后,再去调用服务生产者的内容与数据,简单示例图如下:

字节跳动最新开源,最经典的HashMap图文详解,_Java

NO2:了解Zookeeper的系统架构吗?

字节跳动最新开源,最经典的HashMap图文详解,_后端_02

ZooKeeper 的架构图中我们需要了解和掌握的主要有:

(1)ZooKeeper分为服务器端(Server) 和客户端(Client),客户端可以连接到整个 ZooKeeper服务的任意服务器上(除非 leaderServes 参数被显式设置, leader 不允许接受客户端连接)。

(2)客户端使用并维护一个 TCP 连接,通过这个连接发送请求、接受响应、获取观察的事件以及发送信息。如果这个 TCP 连接中断,客户端将自动尝试连接到另外的 ZooKeeper服务器。客户端第一次连接到 ZooKeeper服务时,可以接受这个连接的 ZooKeeper服务器会为这个客户端建立一个会话。当这个客户端连接到另外的服务器时,这个会话会被新的服务器重新建立。

(3)上图中每一个Server代表一个安装Zookeeper服务的机器,即是整个提供Zookeeper服务的集群(或者是由伪集群组成);

(4)组成ZooKeeper服务的服务器必须彼此了解。它们维护一个内存中的状态图像,以及持久存储中的事务日志和快照, 只要大多数服务器可用,ZooKeeper服务就可用;

(5)ZooKeeper 启动时,将从实例中选举一个 leader,Leader 负责处理数据更新等操作,一个更新操作成功的标志是当且仅当大多数Server在内存中成功修改数据。每个Server 在内存中存储了一份数据。

(6)Zookeeper是可以集群复制的,集群间通过Zab协议(Zookeeper Atomic Broadcast)来保持数据的一致性;

(7)Zab协议包含两个阶段:leader election阶段和Atomic Brodcast阶段。

  • a) 集群中将选举出一个leader,其他的机器则称为follower,所有的写操作都被传送给leader,并通过brodcast将所有的更新告诉给follower。
  • b) 当leader崩溃或者leader失去大多数的follower时,需要重新选举出一个新的leader,让所有的服务器都恢复到一个正确的状态。
  • c) 当leader被选举出来,且大多数服务器完成了 和leader的状态同步后,leadder election 的过程就结束了,就将会进入到Atomic brodcast的过程。
  • d) Atomic Brodcast同步leader和follower之间的信息,保证leader和follower具有形同的系统状态。

NO3:能说说Zookeeper的工作原理?

Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。

Zab协议有两种模式,它们 分别是恢复模式(选主)和广播模式(同步)。

Zab协议 的全称是 Zookeeper Atomic Broadcast** (Zookeeper原子广播)。Zookeeper 是通过 Zab 协议来保证分布式事务的最终一致性。Zab协议要求每个 Leader 都要经历三个阶段:发现,同步,广播。

当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和 leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。

为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加 上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一 个新的epoch,标识当前属于那个leader的统治时期。第32位用于递增计数。

epoch:可以理解为皇帝的年号,当新的皇帝leader产生后,将有一个新的epoch年号。

每个Server在工作过程中有三种状态:

  • LOOKING:当前Server不知道leader是谁,正在搜寻。
  • LEADING:当前Server即为选举出来的leader。
  • FOLLOWING:leader已经选举出来,当前Server与之同步。

NO4:Zookeeper为什么要这么设计?

ZooKeeper设计的目的是提供高性能、高可用、顺序一致性的分布式协调服务、保证数据最终一致性。

高性能(简单的数据模型)

  1. 采用树形结构组织数据节点;
  2. 全量数据节点,都存储在内存中;
  3. Follower 和 Observer 直接处理非事务请求;

高可用(构建集群)

  1. 半数以上机器存活,服务就能正常运行
  2. 自动进行 Leader 选举

顺序一致性(事务操作的顺序)

  1. 每个事务请求,都会转发给 Leader 处理
  2. 每个事务,会分配全局唯一的递增id(zxid,64位:epoch + 自增 id)

最终一致性

  1. 通过提议投票方式,保证事务提交的可靠性
  2. 提议投票方式,只能保证 Client 收到事务提交成功后,半数以上节点能够看到最新数据

NO5:你知道Zookeeper中有哪些角色?

系统模型:

字节跳动最新开源,最经典的HashMap图文详解,_后端_03

领导者(leader)

Leader服务器为客户端提供读服务和写服务。负责进行投票的发起和决议,更新系统状态。

学习者(learner)

  • 跟随者(follower) Follower服务器为客户端提供读服务,参与Leader选举过程,参与写操作“过半写成功”策略。
  • 观察者(observer) Observer服务器为客户端提供读服务,不参与Leader选举过程,不参与写操作“过半写成功”策略。用于在不影响写性能的前提下提升集群的读性能。

客户端(client):服务请求发起方。

NO6:你熟悉Zookeeper节点ZNode和相关属性吗?

节点有哪些类型?

Znode两种类型:

持久的(persistent):客户端和服务器端断开连接后,创建的节点不删除(默认)。

短暂的(ephemeral):客户端和服务器端断开连接后,创建的节点自己删除。

Znode有四种形式:

  • 持久化目录节点(PERSISTENT):客户端与Zookeeper断开连接后,该节点依旧存在持久化顺序编号目录节点(PERSISTENT_SEQUENTIAL)
  • 客户端与Zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号:临时目录节点(EPHEMERAL)
  • 客户端与Zookeeper断开连接后,该节点被删除:临时顺序编号目录节点(EPHEMERAL_SEQUENTIAL)
  • 客户端与Zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

「注意」:创建ZNode时设置顺序标识,ZNode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护。

最后

光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性

 CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】

Java面试宝典2021版

字节跳动最新开源,最经典的HashMap图文详解,_程序员_04

字节跳动最新开源,最经典的HashMap图文详解,_程序员_05

最常见Java面试题解析(2021最新版)

字节跳动最新开源,最经典的HashMap图文详解,_后端_06

字节跳动最新开源,最经典的HashMap图文详解,_Java_07

2021企业Java面试题精选

字节跳动最新开源,最经典的HashMap图文详解,_Java_08

字节跳动最新开源,最经典的HashMap图文详解,_程序员_09

版权声明
本文为[随时待命]所创,转载请带上原文链接,感谢
https://blog.51cto.com/u_15302413/3888200

  1. 小白也能看懂的dubbo3应用级服务发现详解
  2. SpringBoot异步使用@Async原理及线程池配置
  3. Questions d'entrevue de test avancé de Dachang, liste des compétences de base de l'entrevue Java,
  4. SpringBoot异步使用@Async原理及線程池配置
  5. Springboot utilise asynchrone le principe @ async et la configuration du pool de threads
  6. Détails de la découverte du Service d'application Dubbo 3 que Xiaobai peut également comprendre
  7. Springboot utilise asynchrone le principe @ async et la configuration du pool de threads
  8. 如何强大且优雅的搞定Linux文件系统,算法题 JVM,
  9. 太牛了,阿里P7架构师带你看透maven的来龙去脉,
  10. Oracle central et Oracle décentralisé
  11. java JavaBean
  12. Java wrapper type
  13. Java super keyword
  14. Java static keyword
  15. Java this keyword
  16. Java interface
  17. 太牛了,阿裏P7架構師帶你看透maven的來龍去脈,
  18. C'est génial, l'architecte Ali p7 vous montre à travers Maven.
  19. Comment traiter le système de fichiers Linux avec puissance et élégance, algorithme JVM,
  20. Java + SSM Social Insurance Pension System for Computer Graduation Design
  21. Usage of Java scanner
  22. Java inheritance
  23. Java method review
  24. java JVM
  25. Java Basics
  26. Java file operation object IO stream
  27. Java console reads multi character input and output
  28. Java simple array sorting
  29. In addition to MySQL master-slave, you have another choice, Galera
  30. Configuration standard dockerfile et docker-composer.yml
  31. 字节大神强推千页PDF学习笔记,2021Java开发学习路线,
  32. 字节大牛耗时八个月又一力作,靠这份Java知识点PDF成功跳槽,
  33. 字节大牛教你手撕Java学习,最新大厂程序员进阶宝典,
  34. Comment l'automne est - il beau?Ces 24 ensembles de modèles d'automne et d'hiver sont grands, minces et vieillissants
  35. 字節大牛教你手撕Java學習,最新大廠程序員進階寶典,
  36. 字節大牛耗時八個月又一力作,靠這份Java知識點PDF成功跳槽,
  37. Byte Bull vous apprend à déchiqueter Java à la main, le dernier dictionnaire avancé des programmeurs de grandes usines,
  38. Byte Bull a pris huit mois à travailler dur et a réussi à changer d'emploi avec ce PDF Java Knowledge point.
  39. Byte God Push 1000 pages PDF Learning notes, 2021 Java Development Learning route,
  40. Five minutes to understand MySQL index push down
  41. Spring中@within与@target的一些区别
  42. 力荐:提高千倍效率的一些 Java 代码小技巧
  43. Redis技术专题系列之帮你从底层彻底吃透RDB技术原理(基础篇)
  44. Juan Benet et vitalik buterin discutent des réflexions sur les médias sociaux décentralisés
  45. Ipfs Weekly Report 152 | pinata launched "submarining"
  46. Performance optimization issue 03 - HTTP request optimization
  47. JavaScript genrator generator
  48. 字节跳动Java面试全套真题解析在互联网火了,面试大厂应该注意哪些问题?
  49. 字节跳动Java社招,2021年阿里 腾讯 快手offer都已拿到!
  50. 用Java实现红黑树
  51. 使用Redis Stream来做消息队列和在Asp.Net Core中的实现
  52. 海量列式非关系数据库HBase 架构,shell与API
  53. Redis Technology Topic Series vous aide à comprendre les principes de la technologie rdb du Bas (Basic)
  54. Conseils: quelques conseils pour améliorer l'efficacité du Code Java
  55. Quelques différences entre @ within et @ Target au printemps
  56. 海量列式非關系數據庫HBase 架構,shell與API
  57. Architecture, Shell et API de base de données non relationnelle à grande échelle
  58. Mise en œuvre de l'arbre Rouge et noir en Java
  59. Byte Hopping Java Service Call, 2021 Alibaba Tencent Express offer a été obtenu!
  60. Byte Jump Java interview Full Set of true Problems Analysis in Internet fire, interview Factory should pay attention to what Problems?