一起来玩了下 InfluxDb 吧

    xiaoxiao2025-12-05  28

    之前有一个需求,运营需要能看到某某功能长连接在线人数是多少,比如发完 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)。

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

    同事说,你这个太 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.64payment,device=mobile,product=Notepad,method=credit billed=33,licenses=3i 1434067467100293230stock,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:101.241.254.176 

    授权账号:mengkang

    密码:123456

    # 进入命令行 /usr/local/bin/influx -host 101.241.254.176 -username mengkang -password 123456  # 创建数据库CREATE DATABASE mydb # 进入 mydbUSE mydb # 插入一条 101.241.254.134 服务器 websocket 在线人数的数据,不需要创建表,直接插入insert websocket,ip=101.241.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 接口,我就直接通过shell往InfluxDb写数据了。

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

    这样就能进入数据库了。

    最新回复(0)