其实前面的几篇文档,我根据官方文档有对 Consul压力来源,读写瓶颈因素、读写调优、调优参数等内容做过一些分析,这篇文章主要用来总结下整体思路。
当然大家也可以去看我翻译的官网文档(生产部署、读写调优),效果是一样的。建议阅读前,先简单了解下 Raft协议内容,这样可能收获更多哦。
转载请注明🙂,喜欢请一键三连哦😊
我理解的Consul调优思路,大致分为两种: 性能调优 和 其他表现调优。
一、性能调优
我理解Consul性能调优,可以从以下两个方面见到入手:
-
在达到集群极限阈值前, 分析瓶颈因素,增加硬件规格,比如CPU,内存,磁盘IO,网络
-
根据实际场景,权衡下一致性和性能表现,特别是对于Heavy Read场景,能否牺牲强一致性来提高性能。
我们在压测篇中,分析过Consul几个放面的压力主要来源读、写、同步、通信,分别对应Consul的查询、注册、数据量(服务、KV、数据同步)、健康检查。
我们在Server Perfomance 可以了解到 读压力主要主要受限于CPU, 写压力主要受限于磁盘IO, 同时写的压力导致内存数据增加后, 对内存压力也会增大, 与此同时Gossip协议、Raft协议的通信也受网络延迟影响。
我们可以根据各方面压力的负载情况,适当增加【硬件规格】。 比如增加CPU、内存、选用高性能IO磁盘,增加网络带宽等。
当然除了硬件规格外,我们可以根据负载情况,调整具体配置,来达到性能调优效果。
-
读: 为了权衡读性能和一致性问题, Consul提供了三种一致性模型,允许用户根据实际场景进行修改。 当修改为 Stale模式,允许过时读取,允许所有Server响应查询。
可以通过修改
discovery_max_stale
或allow_stale
配置,允许过时读 。PS: 一般正常来说,虽然数据可能不是实时数据,但是过时时长会在 50ms内。 而且开启这种模式,即使在无主情况下(集群不可用),仍然是可读的 !! 参考: Consul读的一致性模型
另外,对于读能力增强,也可以使用Consul 企业版,企业版允许可以引入了None-Votting-Server节点。
-
写: 对于写比较重的场景(注册、KV存储),可以观测Metrics(比如:
consul.runtime.alloc_bytes
)来确定工作大小,将内存调成 2-4倍。
二、其他调优
前三条调优能力在Consul中文中档—Consul性能调优参数有介绍。
后两个能力在Consul中文文档—服务器性能有详细介绍。
2.1 侦测失败与选主能力
通过raft_multiplier
配置调整Consul集群侦测失败和快速选主的能力,将影响下面的几个时间,(1-10级,默认5, 越小性能越高),如果是 1,那就是 1*1000.
如:
{
"performance": {
"raft_multiplier": 5
}
}
Param | Value | Calculation | 参数含义 |
---|---|---|---|
HeartbeatTimeout | 5000ms | 5 x 1000ms | 发送心跳的指定间隔时间 |
ElectionTimeout | 5000ms | 5 x 1000ms | 选举超时时间,如果此时间内,未收到心跳,则转换为候选人状态 |
LeaderLeaseTimeout | 2500ms | 5 x 500ms | 释放Leader角色时间,此时间端已无法向其他节点提交日志 |
但是注意,不要盲目的调整这个参数,如果你的集群处于网络延迟较高的广域网,还是调大一点比较好。
另外请注意,设置的太小,而你的网络延迟高, CPU性能又不足(选主和心跳依赖CPU能力),会导致 Leader的稳定, 而我们Consul集群需要维护一个稳定 Leader;
所以,我们可以通过consul.raft.leader.lastContact
指标 和 consul.raft.state.candidate
指标, 如果 candidate > 0 或者lastContact > 200, 说明可能是 网络延迟高 或者 CPU调度能力不足。
参考: 监控集群状态
2.2 优雅退出
leave_drain_time
参数,默认为5秒,优雅下线能力,退出期间过来的请求转发到其他Server.
参考: 性能参数
2.3 集群不可用重试
rpc_hold_timeout
参数,默认为7S, 允许 “无主”试下重试请求。
2.4 限流
防止Client Node无限制的强求Server Node,产生峰值,超过Server承受能力, Consul提供了Rate-Limit配置,参考 Rate-Limit
2.5 网络
由于Gossip协议,Raft协议,Watch Catalog/KV, 查询,写入这些操作需要Open Files
, 大规模请求下,可以关注下Linux Open Fils, 避免耗尽文件操作符。
三、总结
-
一般来说,在达到阈值之前,我们提高物理资源规格,会带来更高的性能表现。
-
在定额资源下,我们可以根据实际负载情况,配合Metrics,调整一些配置,如raft_multiplier 配置, 也能实现提高性能的目的。
-
对于其他调优,如提到得优雅退出这些功能,也能提高我们实际场景中的稳定性表现。
其他的优化,欢迎大家补充,随着了解的深入,我也会继续补充更多调优手段。