面试连环炮系列(六):Dubbo应用为什么要部署Zookeeper
Dubbo应用为什么要部署Zookeeper?
Zookeeper用来注册和发现服务,简单说就是提供端注册接口信息到Zookeeper,调用端在Zookeeper上查找接口对应的服务IP和端口。由于Zookeeper集群的高可用性,Dubbo推荐采用Zookeeper作为服务治理的基础组件。Zookeeper怎么做到高可用的?
ZooKeeper集群解决了单点和容灾的问题,满足CAP理论中的CP特性,即一致性和分区容错性。ZooKeeper集群基于过半设计原则,至少有过半的机器保存了最新的数据,只要超过半数的机器正常工作,整个集群就能够对外提供服务。集群有leader、follower、observer三种角色,当leader宕机时,follower选举出新的leader继续提供服务。解释一下Zookeeper过半原则?
集群中半数以上的机器处于可用状态,它就能够提供服务。例如在一个有5个节点的集群中,每个Follower节点的数据都是Leader节点数据的副本,每个节点的数据视图都是一样的。任意2台机器出现故障,都可以保证继续服务,剩下的3台机器超过了半数。6个节点的集群也只能够容忍2台机器出现故障,如果3台机器出现故障,剩下的3台没有超过集群的半数。所以建议集群里搭建奇数个节点。- 那你说说leader的选举机制
- 选举阶段 Leader election
最大ZXID也就是节点本地的最新事务编号,包含epoch和计数两部分。epoch是纪元的意思,相当于Raft算法选主时候的term,标识当前leader周期,每次选举一个新的Leader服务器后,会生成一个新的epoch。
所有节点处于Looking状态,各自依次发起投票,投票包含自己的服务器ID和最新事务ID(ZXID)。
如果发现别人的 ZXID比自己大,也就是数据比自己新,那么就重新发起投票,投票给目前已知最大的 ZXID所属节点。
每次投票后,服务器都会统计投票数量,判断是否有某个节点得到半数以上的投票。如果存在这样的节点,该节点将会成为准Leader,状态变为 Leading,其他节点的状态变为Following。 - 发现阶段 Discovery
为了防止某些意外情况,比如因网络原因在上一阶段产生多个Leader的情况。Leader集思广益,接收所有 Follower发来各自的最新 epoch值。Leader从中选出最大的 epoch,基于此值加1,生成新的 epoch分发给各个 Follower。
各个 Follower收到全新的epoch后,返回ACK给Leader,带上各自最大的ZXID和历史事务日志。 Leader选出最大的ZXID,并更新自身历史日志。 - 同步阶段 Synchronization
Leader刚才收集得到的最新历史事务日志,同步给集群中所有的Follower。只有当半数Follower同步成功,这个准Leader才能成为正式的Leader。
- 选举阶段 Leader election
- 什么情况下触发选举呢?
- 集群刚刚启动的时候
- 服务器处于寻找Leader状态
- 当服务器处于LOOKING状态时,表示当前没有Leader,需要进入选举流程
- Leader宕机
- 网络原因导致过半节点与Leader心跳中断
- 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的更多相关文章
- 面试连环炮系列(二十三): StringBuffer与StringBuild的区别
StringBuffer与StringBuild的区别 频繁修改字符串时,建议使用StringBuffer和StringBuilder类.StringBuilder相较于StringBuffer有速度 ...
- 面试连环炮系列(二十一):你们的项目怎么使用kafka
你们的项目怎么使用kafka? 我们采用kafka进行日志采集,准确点说是ELK方案,即elasticsearch + logstash + kibana + kafka.通过Spring AOP的方 ...
- 面试连环炮系列(二十):TCP的滑动窗口协议是什么
TCP的滑动窗口协议是什么 滑动窗口协议,用于网络数据传输时的流量控制,以避免拥塞的发生.该协议允许发送方在停止并等待确认前发送多个数据分组.由于发送方不必每发一个分组就停下来等待确认,因此该协议可以 ...
- 面试连环炮系列(十五):说说Eureka的高可用方案
说说Eureka的高可用方案 至少3个Eureka实例才能满足高可用,配置方法如下: 准备三个节点node1,node2,node3. 在每个实例的application.xml文件里加入 eurek ...
- 面试连环炮系列(十四): HTTP状态码302的跳转逻辑
HTTP状态码302的跳转逻辑 302状态码表示重定向,浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地 ...
- 面试连环炮系列(三):synchronized怎么用的
synchronized怎么用的? 用过,synchronized是常用的并发控制关键字,简单的说就是访问加锁.它可以修饰静态方法或者一个类的class对象,这叫类锁:可以修饰普通方法或者代码块,这叫 ...
- 面试连环炮系列(七):HashMap的put操作做了什么
HashMap的put操作做了什么? HashMap的是由数组和链表构成的,JDK7之后加入了红黑树处理哈希冲突.put操作的步骤是这样的: 根据key值计算出哈希值作为数组下标.如果数组的这个位置是 ...
- 面试连环炮系列(八):服务器CPU飙升100%怎么排查
服务器CPU飙升100%怎么排查 执行"top"命令,查看当前进程CPU占用的实时情况,PID列是进程号,确定是哪个应用程序的问题. 如果是Java应用导致的,怎么定位故障原因 执 ...
- 面试连环炮系列(九):为什么ConcurrentHashMap是线程安全的
为什么ConcurrentHashMap是线程安全的 JDK1.7中,ConcurrentHashMap使用的锁分段技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一 ...
随机推荐
- 使用python删除N天前的文件
python版本为:2.7 import os import sys import time # Sets how many days old files are deleted DAYS_N = 7 ...
- 【数据结构】之栈(Java语言描述)
在前面的[这篇文章]中,我简单介绍了栈这种数据结构的操作功能,并使用C语言对其进行了代码的编写. Java的JDK中默认为我们提供了栈这种数据结构的API—— Stack . Java中的Stack类 ...
- PAT(甲级)2017年秋季考试
PAT(甲级)2017年秋季考试 D题红黑树待补21/30 大佬的代码,看着想哭,这才是艺术啊 A Cut Integer 模拟题 #include<bits/stdc++.h> usin ...
- 什么是API文档?--斯科特·马文
有时候,软件开发人员想要的是自己的软件被其他应用软件所应用,而不是让人来操作.API使各种应用软件互相通信成为了可能. 从事API文档写作15年,我亲眼见证了API产品的崛起.各个公司开始搭建平台,希 ...
- elk的搭建
一:准备工作 1.准备一台虚拟机 192.168.175.222 elk-node2 2.关闭防火墙以及selinux 命令:systemctl stop firewalld # ...
- luogu P2824 [HEOI2016/TJOI2016]排序
题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行 ...
- 数据库Oracle函数之单行函数的介绍
函数介绍: 函数:是数据库产品中提供的能够处理查询结果的方法. 函数能够用于下面的目的: • 执行数据计算 • 修改单个数据项 • 格式化显示的日期和数字 • 转换列数据类型 • 函数有输入参数,并且 ...
- Python学习笔记—自动化部署【新手必学】
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:唯恋殊雨 目录 pexpect fabric pexpect P ...
- 用tensorflow求偏导
# coding:utf-8 from __future__ import absolute_import from __future__ import unicode_literals from _ ...
- 使用笛卡尔积生成sku
/// <summary> /// 生成SKU价格表 /// </summary> /// <param name="model"></p ...