玩转CONSUL(3)–大规模部署的性能开销定量分析
1. 引言
今天有朋友问萌叔,consul能否在大规模生产环境下进行应用。场景是总计大约10w+台机器,分为3 ~ 4个机房,单个机房最多3w万+机器。这个问题大的,可把萌叔吓了跳,部门里面consul集群的规模也就是1k+, 还分好几个机房。
不过他的问题确实也让我十分好奇,consul是否有能力支撑这么规模,我决定针对每个可能性能瓶颈进行定量分析
2. 分析
在进行分析前,我们来看看可能遇到瓶颈有哪些?
下图是consul在多DC情况下的体系架构图
2.1 明确一些概念
- consul agent分2种模式server模式和client模式。在每个机房
consul server(以下简称为server)会部署3 ~ 5台, 其余的consul节点都是consul client(以下简称为server)。server的数量不宜过多,否则选主的速度会变慢 - 数据(包括kv数据,service信息,node信息)都是分机房存储的,由所在机房的
server负责。如果需要请求其它机房的数据,则server会将请求转发到对应的机房。
比如dc1的某个应用app1想要获取dc2中key “hello”对应的值
过程如下
app1 --> client --> server(dc1) --> server(dc2)
如果读者仔细观察会发现,consul中,很多api都是可以加上dc参数的
consul kv get hello -datacenter dc2
- 每个dc的所有
server构成一个raft集群,client不参与选主。注意上图的leader和follower标识。 - 单个机房内部consul节点之间有gossip(端口8301)
- 机房与机房之间
server节点之间有gossip(端口8302)
2.2 可能的瓶颈
2.2.1 client对server的RPC请求
client使用server的TCP/8300端口发起RPC请求, 管理service、kv都要通过这个端口,它们之间是长连接。
1个机房如果有3w+机器,则client和server至少要建立3w+长连接。
不过萌叔观察了一下,3w+长连接是相对均匀的分布在多个server上的,也就是说如果你有6台consul server, 那么每个server最多处理5k个长连接。还是可以接收的。
对于server的处理能力我简单压测了一下。大约是15k qps
Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz
4核CPU 8G内存
╰─$ wrk -t10 -c500 -d30s http://dev2:8500/v1/health/service/consul
Running 30s test @ http://dev2:8500/v1/health/service/consul
10 threads and 500 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 33.15ms 17.65ms 209.29ms 77.50%
Req/Sec 1.56k 330.91 2.46k 66.33%
464810 requests in 30.03s, 1.06GB read
Requests/sec: 15476.11
Transfer/sec: 36.31MB
如果只是把consul作为注册中心,client与server主要是long polling,假定1分钟1个请求、1000个微服务、3w台机器、5个server
30000 * 1000 / 60 / 5 = 100,000
server如果不做扩容,可能有风险
2.2.2 Lan Gossip
很多人会担心局域网内部的Gossip带来的网络风暴。
- 笔者抓包看了一下,虽然consul节点同时监听TCP和UDP的8301端口,但实际上Gossip的数据包都是UDP包。每秒只有几个。
- Gossip包分为2类,一类是probe探针用于探活,一类是push/pull 用于交换信息
- 来看一下Gossip的默认参数
GossipLANGossipInterval 200ms // push/pull间隔
GossipLANGossipNodes 3 // push/pull选择的node数量
GossipLANProbeInterval 1s // probe间隔,其实probe node数量为1
GossipWANGossipInterval 500ms
GossipWANGossipNodes 3
所以QPS是各位数,对性能没有影响
参考笔者的文章 聊聊GOSSIP的一个实现
2.2.3 跨DC的RPC请求
这个可能是大问题,每个跨DC的RPC请求,将会导致本机房的server和目标机房的server各处理一个请求,请求压力相当于翻倍。不过还好可以通过水平扩展server来解决
玩转CONSUL(3)–大规模部署的性能开销定量分析的更多相关文章
- [CB]IPv6 在中国 - 大规模部署进行中 进展明显
IPv6 在中国 - 大规模部署进行中 进展明显 2019年02月04日 08:21 3078 次阅读 稿源:solidot 0 条评论 中国有着世界上最大的网民人口,但它的 IPv6 普及度却处于世 ...
- OpenStack大规模部署详解
https://blog.csdn.net/karamos/article/details/80130443 0.前言今年的2月22日,OpenStack发布了15个版本Ocata. 走过了7年的发展 ...
- 使用ARM模板在Azure中国大规模部署DCOS集群
容器技术是目前非常流行的技术,尤其是在以Docker作为容器引擎的推动下,让容器的轻量级,可移植,自包含,隔离性等的上了一个新的台阶,目前谈及Dev/Ops,CI/CD很少能够绕过Docker的. A ...
- 玩转spring boot——war部署
前言 之前部署spring boot应用是通过直接输入命令“java -jar”来实现的.而有些情况,由于部署环境的制约,只能把项目从jar转换成war才能部署,如新浪云sae的java环境容器.那怎 ...
- **测试某系统切换成docker部署之后性能的下降情况**
###分析 * 对比:某系统/docker* A:某系统性能情况* B:dockers部署的性能情况* 求出A&B两者之间的差异* 确定性能指标(tps)* 测试报告里体现:tps的变化 ## ...
- 高性能web服务器(热死你)Resin Linux的安装、配置、部署,性能远超Nginx支持Java、PHP等
高性能web服务器(热死你)Resin Linux的安装.配置.部署,性能远超Nginx支持Java.PHP等 一. 安装resin 1. 下载resin: 下载地址:http://cauch ...
- MySQL的SSL加密连接与性能开销
本文转载自:http://www.innomysql.net/article/23959.html(只作转载, 不代表本站和博主同意文中观点或证实文中信息) Contents [hide] 1 前言 ...
- [转]比较Jmeter、Grinder和JAVA多线程本身压力测试所带来的性能开销
1. 测试环境 jmeter版本 :jmeter 2.4 grinder的版本 : Grinder 3 JAVA的版本:JDK 1.6 2. 测试代码 Jmeter测试代码 public class ...
- Java异常知识整理_处理异常时的性能开销
1.首先列两个从别的地方看到的说法: try-catch代码段会产生额外的性能开销,或者换个角度说,它往往会影响JVM对代码进行优化,所以建议仅捕获有必要的代码段,尽量不要一个大的try包住整段的代码 ...
随机推荐
- python数据可视化(一)——绘制随机漫步图
数据可视化指的是通过可视化表示来探索数据,它与数据挖掘紧密相关. python有一系列的可视化和分析工具,最流行的工具之一是matplotlib,它是一个数学绘图库. 实现绘制随机漫步图 利用ra ...
- Echo团队Alpha冲刺随笔 - 第九天
项目冲刺情况 进展 已经进入测试阶段,正在消除系统的bug 问题 通过测试,找出了系统中存在的较多bug...... 体会 测试太重要了,很多原本以为没什么bug,一测就能找到好几个,而且改个bug真 ...
- Java中String、LocalDateTime、LocalDate、Date互转
String 转LocalDate和LocalDateTime LocalDate startDate = LocalDate.parse("2019-12-05", DateTi ...
- B/S大附件上传,支持断点续传
核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...
- learning java 实例序列化
对Person类实例进行序例化及反序例化: Person.java public class Person implements java.io.Serializable { private Stri ...
- C++函数声明后面加throw()的作用
原文地址:https://blog.csdn.net/to_baidu/article/details/53763683 C++里面为什么有时候在函数声明的时候在后面加throw()关键字? 解释: ...
- LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力
二次联通门 : LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 /* LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 叫做计算几 ...
- 洛谷P3620 [APIO/CTSC 2007] 数据备份
题目 贪心+堆. 一般贪心题用到堆的时候都会存在一种反悔操作,因此这个题也不例外. 首先电缆一定是连接两个相邻的点的,这很好证明,其次一个点只能被一条电缆连接,所以我们通过选这个电缆,不选相邻电缆和选 ...
- 浅谈 Miller-Robbin 与 Pollard Rho
前言 $Miller-Robbin$ 与 $Pollard Rho$ 虽然都是随机算法,不过用起来是真的爽. $Miller Rabin$ 算法是一种高效的质数判断方法.虽然是一种不确定的质数判断法, ...
- SQLSERVER根据提成比率区间计算业绩提成
USE [Employee] GO /****** Object: Table [dbo].[Commission] Script Date: 2019/11/17 14:10:21 ******/ ...