1. Dubbo应用为什么要部署Zookeeper?
    Zookeeper用来注册和发现服务,简单说就是提供端注册接口信息到Zookeeper,调用端在Zookeeper上查找接口对应的服务IP和端口。由于Zookeeper集群的高可用性,Dubbo推荐采用Zookeeper作为服务治理的基础组件。

  2. Zookeeper怎么做到高可用的?
    ZooKeeper集群解决了单点和容灾的问题,满足CAP理论中的CP特性,即一致性和分区容错性。ZooKeeper集群基于过半设计原则,至少有过半的机器保存了最新的数据,只要超过半数的机器正常工作,整个集群就能够对外提供服务。集群有leader、follower、observer三种角色,当leader宕机时,follower选举出新的leader继续提供服务。

  3. 解释一下Zookeeper过半原则?
    集群中半数以上的机器处于可用状态,它就能够提供服务。例如在一个有5个节点的集群中,每个Follower节点的数据都是Leader节点数据的副本,每个节点的数据视图都是一样的。任意2台机器出现故障,都可以保证继续服务,剩下的3台机器超过了半数。6个节点的集群也只能够容忍2台机器出现故障,如果3台机器出现故障,剩下的3台没有超过集群的半数。所以建议集群里搭建奇数个节点。

  4. 那你说说leader的选举机制
    1. 选举阶段 Leader election
      最大ZXID也就是节点本地的最新事务编号,包含epoch和计数两部分。epoch是纪元的意思,相当于Raft算法选主时候的term,标识当前leader周期,每次选举一个新的Leader服务器后,会生成一个新的epoch。
      所有节点处于Looking状态,各自依次发起投票,投票包含自己的服务器ID和最新事务ID(ZXID)。
      如果发现别人的 ZXID比自己大,也就是数据比自己新,那么就重新发起投票,投票给目前已知最大的 ZXID所属节点。
      每次投票后,服务器都会统计投票数量,判断是否有某个节点得到半数以上的投票。如果存在这样的节点,该节点将会成为准Leader,状态变为 Leading,其他节点的状态变为Following。
    2. 发现阶段 Discovery
      为了防止某些意外情况,比如因网络原因在上一阶段产生多个Leader的情况。Leader集思广益,接收所有 Follower发来各自的最新 epoch值。Leader从中选出最大的 epoch,基于此值加1,生成新的 epoch分发给各个 Follower。
      各个 Follower收到全新的epoch后,返回ACK给Leader,带上各自最大的ZXID和历史事务日志。 Leader选出最大的ZXID,并更新自身历史日志。
    3. 同步阶段 Synchronization
      Leader刚才收集得到的最新历史事务日志,同步给集群中所有的Follower。只有当半数Follower同步成功,这个准Leader才能成为正式的Leader。
  5. 什么情况下触发选举呢?
    • 集群刚刚启动的时候
    • 服务器处于寻找Leader状态
    • 当服务器处于LOOKING状态时,表示当前没有Leader,需要进入选举流程
    • Leader宕机
    • 网络原因导致过半节点与Leader心跳中断
  6. Zookeeper有什么缺点?
    • zookeeper的选举流程通常耗时30到120秒,由于没有master,选举期间都是不可用的。
    • zookeeper的性能是有限的,典型的zookeeper的TPS大概是一万多。
    • zookeeper的权限控制非常薄弱。

参考(部分摘抄的文字版权属于原作者):

https://www.cnblogs.com/shuaiandjun/p/9383655.html
https://blog.csdn.net/liuhaiabc/article/details/70771322
https://blog.51cto.com/13550113/2318147
https://blog.csdn.net/qqqq0199181/article/details/80865828
https://www.cnblogs.com/AndyAo/p/8299317.html
https://www.jianshu.com/p/57fecbe70540
https://www.jianshu.com/p/26f73fe23b79
https://blog.51cto.com/welcomeweb/2103292?utm_source=oschina-app

毒鸡汤:日子一天一天的过去,是不是离梦想更远了?

面试连环炮系列(六):Dubbo应用为什么要部署Zookeeper的更多相关文章

  1. 面试连环炮系列(二十三): StringBuffer与StringBuild的区别

    StringBuffer与StringBuild的区别 频繁修改字符串时,建议使用StringBuffer和StringBuilder类.StringBuilder相较于StringBuffer有速度 ...

  2. 面试连环炮系列(二十一):你们的项目怎么使用kafka

    你们的项目怎么使用kafka? 我们采用kafka进行日志采集,准确点说是ELK方案,即elasticsearch + logstash + kibana + kafka.通过Spring AOP的方 ...

  3. 面试连环炮系列(二十):TCP的滑动窗口协议是什么

    TCP的滑动窗口协议是什么 滑动窗口协议,用于网络数据传输时的流量控制,以避免拥塞的发生.该协议允许发送方在停止并等待确认前发送多个数据分组.由于发送方不必每发一个分组就停下来等待确认,因此该协议可以 ...

  4. 面试连环炮系列(十五):说说Eureka的高可用方案

    说说Eureka的高可用方案 至少3个Eureka实例才能满足高可用,配置方法如下: 准备三个节点node1,node2,node3. 在每个实例的application.xml文件里加入 eurek ...

  5. 面试连环炮系列(十四): HTTP状态码302的跳转逻辑

    HTTP状态码302的跳转逻辑 302状态码表示重定向,浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地 ...

  6. 面试连环炮系列(三):synchronized怎么用的

    synchronized怎么用的? 用过,synchronized是常用的并发控制关键字,简单的说就是访问加锁.它可以修饰静态方法或者一个类的class对象,这叫类锁:可以修饰普通方法或者代码块,这叫 ...

  7. 面试连环炮系列(七):HashMap的put操作做了什么

    HashMap的put操作做了什么? HashMap的是由数组和链表构成的,JDK7之后加入了红黑树处理哈希冲突.put操作的步骤是这样的: 根据key值计算出哈希值作为数组下标.如果数组的这个位置是 ...

  8. 面试连环炮系列(八):服务器CPU飙升100%怎么排查

    服务器CPU飙升100%怎么排查 执行"top"命令,查看当前进程CPU占用的实时情况,PID列是进程号,确定是哪个应用程序的问题. 如果是Java应用导致的,怎么定位故障原因 执 ...

  9. 面试连环炮系列(九):为什么ConcurrentHashMap是线程安全的

    为什么ConcurrentHashMap是线程安全的 JDK1.7中,ConcurrentHashMap使用的锁分段技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一 ...

随机推荐

  1. 为什么服务器突然回复RST——小心网络中的安全设备

    RST产生原因 一般情况下导致TCP发送RST报文的原因有如下3种:    1. SYN数据段指定的目的端口处没有接收进程在等待.        2.TCP想放弃一个已经存在的连接.    3.TCP ...

  2. 最全最新🇨🇳中国【省、市、区县、乡镇街道】json,csv,sql数据

    中华人民共和国行政区划代码 中华人民共和国行政区划(五级):省级.地级.县级.乡级和村级. 来自中华人民共和国民政部,用于查询中国省,市和区数据的网站. 中华人民共和国行政区划代码,更新时间:2019 ...

  3. int main (int argc, const char * argv[0]) 中参数的含义;指针数组和数组指针

    恩,有的编译器初始化时候会产生这样的参数 argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数是程序的全名 1. 几种C++ 常见的参数种类 int main(void); in ...

  4. java程序员面试答题技巧

    答题时,先答是什么,再答有什么作用和要注意什么(这部分最重要,展现自己的心得) 答案的段落分别,层次分明,条理清晰都非常重要,从这些表面的东西也可以看出一个人的 习惯.办事风格.条理等. 要讲你做出答 ...

  5. MySQL 库、表、记录、相关操作(3)

    MySQL 库.表.记录.相关操作(3) 单表查询 """ 增: insert [into] [数据库名.]表名[(字段1[, ..., 字段n])] values (数 ...

  6. Mac配置Gradle环境

    下载Gradle 下载地址:https://gradle.org/install 下载最新版本:gradle-3.3 (当前最新版2017年2月8日) 配置Gradle环境 我的本机Gradle存放路 ...

  7. 【Java】Java中的final关键字和static

    0.概述 final关键字表示是不可变的: 下面分别从属性(字段).方法.类中进行说明: 1.属性(or字段),表示常量 final声明在属性(or字段)中,表示常量,有两种初始化方法,1是在声明时直 ...

  8. CMSdede后台登陆界面设计

    1 在这里我就公布 css 和jq  也就是dede文件下templets的login.htm页面:代码如下      $(function () {             $(".tex ...

  9. ruby2.2 DevKit 安装后无法使用解决方案

    windows 系统下,Ruby 的某些 gem 包需要 DevKit 才能正常安装,2.4 以后的版本可以一键安装 DevKit,之前的版本只能手动安装. 2.4 以后的可以到官网下载:https: ...

  10. .Net Core的API网关Ocelot的使用(二)[负载,限流,熔断,Header转换]

    网关的负载均衡 当下游拥有多个节点的时候,我们可以用DownstreamHostAndPorts来配置 { "UpstreamPathTemplate": "/Api_A ...