嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2016-10-21 8428 次浏览 标签 : influxdb

之前有一个需求,运营需要能看到某某功能长连接在线人数是多少,比如发完 push 之后是多少,能够实时得到运营手段的反馈。

我比较懒,能用简单的办法搞定,就不喜欢习惯用开源的东西,因为觉得自己学习的也比较慢,但是不得不说这种快速上手一个陌生产品的能力很重要,我很缺乏这种能力。

我们提供一个长连接服务,占用端口8080,我最初的方式通过 shell 脚本做一个简单的监控,数据都直接写在了日志文件里。

while :; do sleep 1;netstat -lanp|grep 8080|grep ESTABLISHED|awk '{print $5}'|awk -F ':' '{print $1}'|sort|uniq|wc -l|awk 'BEGIN{a="'$(date +%H:%M:%S)'";}{printf "%s,%d\n",a,$1}' >> access_num.log;done

上面的命令输出两列,第一列是时间,第二列是在线人数。

然后以时间作为横坐标,在线人数作为纵坐标,绘制了下面的图表(前端用的百度的echarts)。

比较简陋,不过用起来我觉得还是蛮轻便的。

搭同事的车一起玩了下influxdb

同事说,你这个太 low 了,现在比较流行Grafana+telegraf+InfluxDb来搭建。

Grafana 负责 UI 界面的展示

telegraf 做数据的收集,比如服务器集群的性能监控

InfluxDb 是现在流行的时间序列数据库

我马上搜这些关键字,全是英文呢,可视化效果真不错,github star 也上千。怎么安装了就不说了,直接上官网就有。InfluxDb数据库的定义比较新颖,下面就说说它了。

InfluxDb数据库里series对应的是我们常规认识的表,而表里面的一行数据一般都来表示一个对象,而series里面一行数据则是描述的一个point。(没错,就是坐标系里的一个真实的点,所以这个数据库的业务场景就是专门针对这种时间线的数据监控而创作的。)

那么这个点有哪些属性来描述它呢?

timestamp,point的时间戳,

measurement,可以理解为表名,

field,以1~n个key-value来表示,point的值,

tags,以0~n个key-value来表示,point 的属性。

以一个具体的例子来说,现在需要监控1服务器的负载,那么负载(load)就是measurement,此刻的负载值,就是field,该服务器的 ip 就可以作为tags中的一个,也可以不记 ip,因为此时我们的需求只是记录一台服务器而已。

那么命令行如何插入一条数据呢?下面是其写入协议。适用于InfluxDb的命令行和 Api 接口

<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]

以你老司机多年的经验,一看上面的表达式便知,[]里面的内容表示可选,所以插入数据库的时候,可以不用带时间戳,默认为当前时间戳。

官方的例子送给大家

cpu,host=serverA,region=us_west value=0.64
payment,device=mobile,product=Notepad,method=credit billed=33,licenses=3i 1434067467100293230
stock,symbol=AAPL bid=127.46,ask=127.48
temperature,machine=unit42,type=assembly external=25,internal=37 1434067467000000000

nice,看到了么,还可以用在交易记录哟。

说了这么多,下面加快速度一条路,快上车,带你迅速解决战斗。

假设 InfluxDb 

bin 文件路径是:/usr/local/bin/influx

绑定的 ip:10.24.254.176 

授权账号:mengkang

密码:123456

# 进入命令行
/usr/local/bin/influx -host 10.24.254.176 -username mengkang -password 123456

# 创建数据库
CREATE DATABASE mydb

# 进入 mydb
USE mydb

# 插入一条 10.24.254.134 服务器 websocket 在线人数的数据,不需要创建表,直接插入
insert websocket,ip=10.24.254.134 num=100

那么数据怎么查询呢?这才是它的强大之处,不然就是数据库了。

比如官方的这个例子

SELECT MEAN("water_level") FROM "h2o_feet" WHERE time > now() - 2w GROUP BY "location",time(6h)

查询过去两周各个地方的每6小时的水平平均值变化情况,是不是功能很强大呢?

支持的查询语句 https://docs.influxdata.com/influxdb/v1.0/query_language/data_exploration/

顺便提一句,在使用telegraf,我感觉配置文件太复杂啦,同事在用,我太笨了研究了半天玩不转。而InfluxDb提供了 api 接口,我就直接通过shellInfluxDb写数据了。

curl -i -XPOST -u username:password "http://10.24.254.176:8086/write?db=my_monitor" --data-binary 'websocket,host=10.24.254.134 value=120'

这样就能进入数据库了。

最后Grafana+InfluxDb的效果如下,不过不用自己写前端代码了。样式什么的在控制面板可配。不过没有百度的前端工具有聚焦缩放功能。

分享到

评论列表

如果填写邮箱了,当我我回复您的时候会给您邮箱发送消息提醒,方便交流
提交 可以使用`xxxx`来插入简短的代码碎片
1楼 Lynn 2016-11-11 10:47:52

"最后Grafana+InfluxDb的效果如下..."

哈哈,下边并没有图哦~

回复
2楼 mengkang 2016-11-14 16:19:18

回复Lynn: 哎,郁闷,前几天手误,给 rm -rf 了全。。。郁闷。一直没有重视博客的数据。

回复