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. mac 终端高亮显示~

    针对terminal采用bash模式: 编辑 ~/.bash_profile, 加入以下代码: export CLICOLOR=1 export LSCOLORS=gxfxaxdxcxegedabag ...

  2. 腾讯视频缓存 tdl 转 mp4

    找到腾讯视频->设置,看下缓存文件的目录地址,然后cmd,通过命令进行转化.  copy/b *.tdl 1.mp4

  3. tabBarItem是模型,只有控件才有textColor属性

    如果通过模型设置控件的文字颜色,只能通过文本属性(富文本:颜色,字体,图文混排,空心)

  4. mysql客户端 navicat 本地导入sql文件出错

    以前遇到过这个问题,找了半天度娘没解决,然后就放弃了. 因为是自己 demo 的项目 所以就自己手动建表了. 现在实习了,去到公司下载下代码来,拿上sql 导入发现还是报错, 根本没法整,然后自己都不 ...

  5. Linux常用基本命令 (逐步添加)

    Linux jobs命令 fg , bg , jobs , & , ctrl + z都是跟系统任务有关 一.&命令 用在一个命令的最后,可以把这个命令放到后台执行 二.Ctrl + z ...

  6. 【LiteOS】STM32F103-LiteOS移植教程(详细篇)

    总览 本文基于STM32F103C8T6,详细讲述华为LiteOS的移植过程.开发工具是MDK5.LiteOS官方已经适配过cortex M系列内核的单片机,因此移植过程非常简单. LiteOS有两种 ...

  7. 上手spring boot项目(一)之如何在controller类中返回到页面

    题记:在学习了springboot和thymeleaf之后,想完成一个项目练练手,于是使用springboot+mybatis和thymeleaf完成一个博客系统,在完成的过程中出现的一些问题,将这些 ...

  8. 09-Python-Socket编程

    一.Python-Socket编程 1.1.弄懂HTTP.Socket.TCP这几个概念 什么是HTTP协议?浏览器的本质就是一个socket客户端遵循HTTP协议,HTTP协议的本质:通过\r\n分 ...

  9. 自学python中的心得

    以后的日子里我将与可爱的亲们一起度过我自学python的岁月,请博客园里的大佬们监督与见证.

  10. uglify-js 和uglify-es

    uglify-js 它不支持压缩 es6,参考github的issue It seems like uglify-js does not support es6? uglify-js在压缩代码时,遇到 ...