Sentinel一体化监控解决方案
Sentinel是什么?
Sentinel是阿里巴巴在今年7月下旬开源的限流组件,该组件能依照动态配置的规则对服务进行限流熔断和降级操作。sentinel-dashboard作为该组件的核心控制台目前具有实时监控、规则配置、应用服务器列表查看等功能。
使用过程中遇到的问题
- dashboard实时监控仅能查看5分钟内的metric数据
- 图表显示有那么一点点问题
- 监控数据分散,无法和公司其他监控数据统一
解决问题的办法
以上提出的3个问题,处理的办法无非就是数据落地和统一监控。
思路:首先我们要将之前缓存在内存中的metric数据进行持久化, 然后在Grafana上绑定数据源,制作对应的监控图表。
使用到的工具
工具名称 | 作用 |
---|---|
CrateDB | NO SQL数据库 |
Druid | 数据库连接池 |
Grafana | 监控数据UI展示 |
动手实践
接下来我会一步步介绍如何将metric数据进行持久化并在Grafana上进行展示
第一步:新建表
新建metric
分区表,为什么建分区表而不是普通表?因为监控数据体量很大,而且很多天以前的数据没用了就要删掉,如果不建分区表,删除数据的时候想死的心都有。
CREATE TABLE IF NOT EXISTS "doc"."metric" (
"app" STRING,
"blocked_qps" LONG,
"count" LONG,
"day" TIMESTAMP GENERATED ALWAYS AS date_trunc('day', '+08:00', "timestamp"),
"exception" LONG,
"gmt_create" TIMESTAMP,
"gmt_modified" TIMESTAMP,
"id" LONG,
"passed_qps" LONG,
"resource" STRING,
"resource_code" LONG,
"rt" DOUBLE,
"success_qps" LONG,
"timestamp" TIMESTAMP
)
CLUSTERED INTO 6 SHARDS
PARTITIONED BY ("day")
表建好以后在CrateDB Admin上看到的大概就是这样的
第二步:持久化数据
在我自己的GitHub分支上,已经完成了数据持久化的代码。当时这个代码是基于mysql实现的,修改成CrateDB实现也是非常简单的,只需要做好如下几点:
1. 将mysql的JDBC驱动包换成CrateDB的JDBC驱动包,具体操作包下载地址请见CrateDB官网
2. 将mysql的驱动类改为CrateDB的驱动类
3. 将mysql的url地址改为你CrateDB的地址
4. 去掉MetricRepository.xml
文件中的useGeneratedKeys="true" keyProperty="id"
因为CrateDB不支持自增主键
第三步:在Grafana上制图
这里不会详细讲Grafana如何制作图表,新手请见官网快速入门。
注意:配置CrateDB数据源需要事先安装好Crate插件。
Grafana有模板的概念,只要配置了模板,然后动态传入参数即可快速生成多个使用相同模板的不同指标数据的图表。
首先添加模板
然后配置SQL执行查询,即时可看到效果
配置好以后使用模板功能查看多个接口的流控指标监控
遗留问题
- sentinel-dashboard目前每隔一秒从所有的客户端同步一次数据, 集群庞大的情况下效率很低且不稳定
- sentinel-dashboard收集到数据以后直接插入数据库没有缓冲,存在安全隐患
改进点
- sentinel客户端间隔固定时间自动推送metric数据到sentinel-server(分布式部署)
- sentinel-server将数据缓冲到kafka等消息中间件中
- sentinel-server将数据从kafka中取出然后进行持久化
- dashboard移除metric相关feature只做规则配置和分发相关工作
- 或者直接将dashboard规则配置分发功能移植到公司内部配置管理系统中,形成统一管理
最后
本文仅展示了基于JDBC协议的存储方案,其实还有很多存储方案可以选择,例如Elasticsearch, influxDB,Prometheus等。实现的思路都是将数据落地,然后结合grafana进行展示,只是具体的实现细节有些许差异而已。