zookeeper注册中心 kerberos_ZooKeeper 并不适合做注册中心
zookeeper 的 CP 模型不适合注册中心
zookeeper 是一个非常优秀的项目,非常成熟,被大量的团队使用,但对于服务发现来讲,zookeeper 真的是一个错误的方案。
在 CAP 模型中,zookeeper 是 CP,意味着面对网络分区时,为了保持一致性,他是不可用的。
因为 zookeeper 是一个分布式协调系统,如果使用最终一致性(AP)的话,将是一个糟糕的设计,他的核心算法是 Zab,所有设计都是为了一致性。
对于协调系统,这是非常正确的,但是对于服务发现,可用性是第一位的,例如发生了短暂的网络分区时,即使拿到的信息是有瑕疵的、旧的,也好过完全不可用。
zookeeper 为协调服务所做的一致性保障,用在服务发现场景是错误的。
注册中心本质上的功能就是一个查询函数:
ServiceList = F(service-name)
以 service-name
为查询参数,得到对应的可用的服务端点列表 endpoints(ip:port)
。
我们假设不同的客户端得到的服务列表数据是不一致的,看看有什么后果。
一个 serviceB 部署了 10 个实例,都注册到了注册中心。
现在有 2 个服务调用者 service1 和 service2,从注册中心获取 serviceB 的服务列表,但取得的数据不一致。
s1 = { ip1,ip2 ... ip9 }s2 = { ip2,ip3 ... ip10 }
这个不一致带来的影响是什么?
就是 serviceB 各个实例的流量不均衡。
ip1 和 ip10 的流量是单份的,ip2-ip9 流量是双份的。
这个不均衡有什么严重影响吗?并没有,完全可以接受,而且,又不会一直这样。
所以,注册中心使用最终一致性模型(AP)完全可以的。
现在我们看一下 CP 带来的不可用的影响。
3个机房部署 5 个 ZK 节点。
现在机房3出现网络分区了,形成了孤岛。
发生网络分区时,各个区都会开始选举 leader,那么节点数少的那个分区将会停止运行,也就是 ZK5 不可用了。
这时,serviceA 就访问不了机房1和机房2的 serviceB 了,而且连自己所在机房的 serviceB 也访问不了了。
不能访问其他机房还可以理解,不能访问自己机房的服务就理解不了了,本机房内部的网络好好的,不能因为你注册中心有问题就不能访问了吧。
因为注册中心为了保障数据一致性而放弃了可用性,导致同机房服务之间无法调用,这个是接受不了的。
所以,注册中心的可用性比数据强一致性更加重要,所以注册中心应该是偏向 AP,而不是 CP。
以上表述的是 zookeeper 的 CP 模型并不适合注册中心的需求场景。
zookeeper 的性能不适合注册中心
在大规模服务集群场景中,zookeeper 的性能也是瓶颈。
zookeeper 所有的写操作都是 leader 处理的,在大规模服务注册写请求时,压力巨大,而且 leader 是单点,无法水平扩展。
还有所有服务于 zookeeper 的长连接也是很重的负担。
zookeeper 对每一个写请求,都会写一个事务日志,同时会定期将内存数据镜像dump到磁盘,保持数据一致性和持久性。
这个动作会降低性能,而且对于注册中心来讲,是不需要的。
小结
从 CP 模型上来讲,zookeeper 并不适合注册中心高可用的需要。
从性能上来讲,zookeeper 也无法满足注册中心大规模且频繁注册写的场景。
你可能会问,zookeeper 既然这么多问题,他咋不改呢?
其实,这并不算是 zookeeper 的问题,是人家本来就不适合做注册中心,非要用他的话,肯定一堆问题。
zookeeper 的特长是做分布式协调服务,例如 kafka、hbase、flink、hadoop 等大项目都在用 zookeeper,用的挺好的,因为是用对了地方。
例如可以看下:kafka 中 zookeeper 具体是做什么的?
你有什么看法,欢迎留言交流。
参考资料:
http://jm.taobao.org/2018/06/13/%E5%81%9A%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0%EF%BC%9F/
https://medium.com/knerd/eureka-why-you-shouldnt-use-zookeeper-for-service-discovery-4932c5c7e764
推荐阅读:
- 架构设计中的 CAP 和 BASE 理论
- 阿里开源的分布式事务框架 Seata
- 高并发的常用策略
- 分布式事务方案 - 最终一致性
- 接口级故障处理策略
zookeeper注册中心 kerberos_ZooKeeper 并不适合做注册中心相关推荐
- 为什么Eureka比ZooKeeper更适合做注册中心?
来源:https://www.cnblogs.com/jieqing/p/8394001.html 刚开始看到Eureka这个单词的时候真心不会念,查了后发现他有一个好听的名字,来,大家一起念 [ j ...
- java注册中心nacos_spring-cloud整合nacos做注册中心
前面讲了spring-cloud整合nacos做配置中心,这节讲一下nacos做注册中心 至于注册中心是什么,我就不讲了,不了解的可以去问度娘 下面我就直接开始了,也是比较简单的: 1.引入依赖 1. ...
- springboot整合dubbo\zookeeper做注册中心
springboot整合dubbo发布服务,zookeeper做注册中心.前期的安装zookeeper以及启动zookeeper集群就不说了. dubbo-admin-2.5.4.war:dubbo服 ...
- springcoud-kubernetes实践之用kubernetes做注册中心(包括负载均衡熔断)
本文是spring-cloud-kubernetes实战,主要内容是在kubernetes上部署两个应用:provider-service和consumer-service,通过spring-clou ...
- 做任务赚钱网站源码,H5全新界面,注册支付测试完美,适合各种做任务赚钱的手机端
源码介绍 一天一精品,深度测试,高度适用商业用途! 做任务赚钱网站源码,H5全新界面,注册支付测试完美,适合各种做任务赚钱的手机端 简单修改了一下原手机首页界面,新增下载app链接和直接h5访问,喜欢 ...
- 客户端启动报错java.lang.IllegalArgumentException: no server available的解决方案 SpringCloud中 Nacos做注册中心
客户端启动报错java.lang.IllegalArgumentException: no server available的解决方案 SpringCloud中 Nacos做注册中心(谷粒) 报错内容 ...
- Nacos 注册中心主要贡献者详解注册中心的设计原理
服务发现是一个古老的话题,当应用开始脱离单机运行和访问时,服务发现就诞生了. 目前的网络架构是每个主机都有一个独立的 IP 地址,那么服务发现基本上都是通过某种方式获取到服务所部署的 IP 地址.DN ...
- 『注册中心』Consul微服务注册中心的使用及相关集群搭建
Consul目录 一.概念篇--注册中心 1. 什么是注册中心 2. 为什么要使用注册中心 3. 注册中心类型 4. 注册中心的优点 二.概念篇--Consul 1. 什么是Consul 2. Con ...
- 如何在注册表里计算机用户名,可以通过注册表修改电脑的密码 ?怎么做的?
可以通过注册表修改电脑的密码 ?怎么做的?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 可以通过注册表修改电脑的密码 ...
最新文章
- MySQL 自增ID
- ASP.NET MVC+HighCharts开发统计图表
- plsql动态的sql
- wpf 修改label值_WPF 获取动态添加控件的值
- html 横屏内容显示不全_“屏”什么喜欢你,车载显示器有哪些新玩法...
- 程序员面试金典 - 面试题 16.13. 平分正方形(数学)
- Java常用接口与类——Math类、Random类、BigDecimal类
- 嵌入式软件设计第九次实验报告-140201235-陈宇
- git branch看不到分支_Git简介及基本用法
- 20190920 On Java8 第二十章 泛型
- SpringMVC返回一个JSON对象到界面
- SpringBoot学习(一)初识SpringBoot、第一个SpringBoot程序
- html5回到顶部代码,返回顶部完整代码
- Android 导出应用的数据库的两种常用方法,db查看器 SQLite Expert Personal下载
- Nacos——Distro一致性协议
- 机器学习——共享单车数据集预测
- InstallShield Premier,复杂的多服务器应用程序
- 在小程序中使用iconfont
- 微信开发相关图书推荐
- 自由人NFT平台,全球首个以NFT+农业+元宇宙项目
热门文章
- 数据结构练手02 双向链表实现
- 黄聪:UEditor如何在wordpress中调用
- 解决U盘无法格式化的问题
- 784. 字母大小写全排列
- 打开html文件图片为什么没有_提高网站打开速度秘诀:压缩html,Javascript和CSS文件...
- vue 点击文字input_vue input实现点击按钮文字增删功能示例
- 酷睿i7cpu适合的linux,[图]英特尔酷睿i7 1165G7和AMD Ryzen 7 Pro 4750U Linux性能对比
- mysql中12e10等于多少_一篇文章看懂mysql中varchar能存多少汉字、数字,以及varchar(100)和varchar(10)的区别...
- VLD(Visual LeakDetector)内存泄露工具的使用
- 镜头的分类及选购指南