发布网友 发布时间:2022-04-24 22:34
共8个回答
懂视网 时间:2022-04-10 13:52
最近在搞容器的监控,遇到influxdb这个库,搞了两天,些许明白了些套路,做个记录,备忘....
小结如下:
influxdb go语言编写
默认情况influxdb创建的库关联autogen的RP(存储策略),即数据会保留永久
最近搞监控,所谓监控就是监控服务肉体是否健康(还活着/生病? 各项指标是否正常?)
区分日志搜集: 分析服务的精神状态是健康(服务的一个履历/日记)
参考: https://segmentfault.com/a/1190000011082379
回想到如果是你自己去做一个监控, 能够做到记录每分钟 CPU 的空闲率是多少, 要怎么做?
搞一个数据库, 用来放数据的
写一个脚本, 用来获取 CPU 的相关数据, 加上时间戳, 然后保存到数据库
创建一个定时任务, 一分钟运行一次脚本
写一个简单的程序, 从数据库查到数据, 然后根据时间戳, 绘制成图表.
telegraf搜集器 + influxdb(存储) + grafana(展示) grafana 的套路基本上跟 kibana 差不多,都是根据查询条件设置聚合规则,在合适的图表上进行展示,多个图表共同组建成一个 dashboard,熟悉 kibana 的用户应该可以非常容易上手。另外 grafana 的可视化功能比 kibana 强得多,而且 4 以上版本将集成报警功能。
grafana主机监控效果图:
之前用metricbeat做的主机监控效果图-进程级别
特性对比
参考: http://gitbook.cn/books/59395d3d5863cf478e6b50ba/index.html
influxdb集成已有的概念,比如查询语法类似sql,引擎从LSM优化而来,学习成本相对低。
influxdb支持的类型有float,integers,strings,booleans,prometheus目前只支持float。
influxdb的时间精度是纳秒,prometheus的则是毫秒。
influxdb仅仅是个数据库,而prometheus提供的是整套监控解决方案,当然influxdb也提供了整套监控解决方案。
influxdb支持的math function比较少,prometheus相对来说更多,influxdb就目前使用上已经满足功能。
influxdb支持event log,prometheus不支持。
注: 已上对比的是普罗v1 ,现在普罗有v2版本了,听说比influxdb更强悍了. 而且influxdb集群方案已闭源.
influxdb中文翻译官方的文档,感觉很棒 https://jasper-zhang1.gitbooks.io/influxdb/content/ https://jasper-zhang1.gitbooks.io/influxdb/content/Concepts/key_concepts.html
参考: http://www.ttlsa.com/monitor-safe/monitor/distributed-time-series-database-influxdb/
1. Time Series (时间序列):你可以使用与时间有关的相关函数(如最大,最小,求和等)
2. Metrics(度量):你可以实时对大量数据进行计算
3. Eevents(事件):它支持任意的事件数据
时序性(Time Series):与时间相关的函数的灵活使用(例如最大、最小、求和等);
度量(Metrics):对实时大量数据进行计算;
事件(Event):支持任意的事件数据,换句话说,任意事件的数据我们都可以做操作。
schemaless(无结构),可以是任意数量的列
无特殊依赖,几乎开箱即用(如ElasticSearch需要Java)
自带数据过期功能;
自带权限管理,精细到“表”级别;
原生的HTTP支持,内置HTTP API
强大的类SQL语法,支持min, max, sum, count, mean, median 等一系列函数,方便统计。
1.登录 建库 查询
参考: https://jasper-zhang1.gitbooks.io/influxdb/content/Introduction/getting_start.html
influx -precision rfc3339 # -precision参数表明了任何返回的时间戳的格式和精度,针对查询时候显示的时间格式
CREATE DATABASE mydb
SHOW DATABASES
USE mydb
INSERT cpu,host=serverA,region=us_west value=0.64
SELECT "host", "region", "value" FROM "cpu"
INSERT temperature,machine=unit42,type=assembly external=25,internal=37
SELECT * FROM "temperature"
> SELECT * FROM /.*/ LIMIT 1
> SELECT * FROM "cpu_load_short"
> SELECT * FROM "cpu_load_short" WHERE "value" > 0.9
2.了解influxdb基本概念
参考: http://dbaplus.cn/news-73-1291-1.html
InfluxDB中的名词 | 传统数据库中的概念 |
---|---|
database | 数据库 |
measurement | 数据库中的表 |
points | 表里面的一行数据 |
Point相当于传统数据库里的一行数据,如下表所示: Point由时间戳(time)、数据(field)、标签(tags)组成。
<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
INSERT temperature,machine=unit42,type=assembly external=25,internal=37
更多如:
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
Tag: 被索引
上面的location和server就是tag key,us和host1是tag value,tag是可选的。不过写入数据时最好加上tag,因为它可以被索引。tag的类型只能是字符串。
Field: value支持的类型floats,integers,strings,booleans
上面的temperature是field key,82是field value。field value会用于展示,value支持的类型有floats,integers,strings,booleans。
Timestamp
格式是:RFC3339 UTC。默认精确到纳秒,可选。
Series:
measurement, tag set, retention policy相同的数据集合算做一个 series。理解这个概念至关重要,因为这些数据存储在内存中,如果series太多,会导致OOM
Retention Policy:
保留策略包括设置数据保存的时间以及在集群中的副本个数。默认配置是:RP是autogen,保留时间是永久,副本为1。这些配置在创建数据库时可以修改。
Continuous Query:
CQ是预先配置好的一些查询命令,定期自动执行这些命令并将查询结果写入指定的measurement中,这个功能主要用于数据聚合。具体参考:CQ。
Shard:
存储一定时间间隔的数据,每个目录对应一个shard,目录的名字就是shard id。每一个shard都有自己的cache、wal、tsm file以及compactor,目的就是通过时间来快速定位到要查询数据的相关资源,加速查询的过程,并且也让之后的批量删除数据的操作变得非常简单且高效。
向库中插入如下数据:
属性 | 值 |
---|---|
库名 | my_database |
measurement | census |
field key | butterflies和honeybees |
tag key | location和scientist |
name: census
-————————————
time butterflies honeybees location scientist
2015-08-18T00:00:00Z 12 23 1 langstroth
2015-08-18T00:00:00Z 1 30 1 perpetua
2015-08-18T00:06:00Z 11 28 1 langstroth
2015-08-18T00:06:00Z 3 28 1 perpetua
2015-08-18T05:54:00Z 2 11 2 langstroth
2015-08-18T06:00:00Z 1 10 2 langstroth
2015-08-18T06:06:00Z 8 23 2 perpetua
2015-08-18T06:12:00Z 7 22 2 perpetua
sql语句如下
‘INSERT census,location=1,scientist=langstroth butterflies=12,honeybees=23‘
‘INSERT census,location=1,scientist=perpetua butterflies=1,honeybees=30‘
‘INSERT census,location=1,scientist=langstroth butterflies=11,honeybees=28‘
‘INSERT census,location=1,scientist=perpetua butterflies=3,honeybees=28‘
‘INSERT census,location=2,scientist=langstroth butterflies=2,honeybees=11‘
‘INSERT census,location=2,scientist=langstroth butterflies=1,honeybees=10‘
‘INSERT census,location=2,scientist=perpetua butterflies=8,honeybees=23‘
‘INSERT census,location=2,scientist=perpetua butterflies=7,honeybees=22‘
$ cat fake_data.sh
arr=(
‘INSERT orders,website=30 phone=10‘
‘INSERT orders,website=39 phone=12‘
‘INSERT orders,website=56 phone=11‘
)
#while :;do
for((i=0;i<${#arr[*]};i++));do
/usr/bin/influx -database ‘my_food‘ -execute "${arr[i]}"
sleep 10
# echo "${arr[i]}"
done
#done
$ cat data.sh
#!/bin/bash
function rand(){
min=$1
max=$(($2-$min+1))
num=$(date +%s%N)
echo $(($num%$max+$min))
}
while :;do
/usr/bin/influx -database ‘my_database‘ -execute "INSERT census,location=2,scientist=perpetua butterflies=$(rand 1 50),honeybees=$(rand 1 50)"
sleep 2;
# echo "INSERT orders,website=$(rand 1 50) phone=$(rand 1 50)"
# break
done
field value就是你的数据,它们可以是字符串、浮点数、整数、布尔值,因为InfluxDB是时间序列数据库,所以field value总是和时间戳相关联。 在示例中,field value如下:
12 23
1 30
11 28
3 28
2 11
1 10
8 23
7 22
在上面的数据中,每组field key和field value的集合组成了field set,在示例数据中,有八个field set:
butterflies = 12 honeybees = 23
butterflies = 1 honeybees = 30
butterflies = 11 honeybees = 28
butterflies = 3 honeybees = 28
butterflies = 2 honeybees = 11
butterflies = 1 honeybees = 10
butterflies = 8 honeybees = 23
butterflies = 7 honeybees = 22
注意,field是没有索引的。如果使用field value作为过滤条件来查询,则必须扫描其他条件匹配后的所有值。因此,这些查询相对于tag上的查询(下文会介绍tag的查询)性能会低很多。
在上面的数据中,tag set是不同的每组tag key和tag value的集合,示例数据里有四个tag set:
location = 1, scientist = langstroth
location = 2, scientist = langstroth
location = 1, scientist = perpetua
location = 2, scientist = perpetua
现在你已经熟悉了measurement,tag set和retention policy,那么现在是讨论series的时候了。 在InfluxDB中,series是共同retention policy,measurement和tag set的集合。 以上数据由四个series组成:
理解series对于设计数据schema以及对于处理InfluxDB里面的数据都是很有必要的。 最后,point就是具有相同timestamp的相同series的field集合。例如,这就是一个point:
name: census
-----------------
time butterflies honeybees location scientist
2015-08-18T00:00:00Z 1 30 1 perpetua
例子里的series的retention policy为autogen,measurement为census,tag set为location = 1, scientist = perpetua。point的timestamp为2015-08-18T00:00:00Z。
Continuous Query (CQ)是在数据库内部自动周期性跑着的一个InfluxQL的查询,CQs需要在SELECT语句中使用一个函数,并且一定包括一个GROUP BY time()语句。+
Retention Policy (RP)是InfluxDB数据架构的一部分,它描述了InfluxDB保存数据的时间。InfluxDB会比较服务器本地的时间戳和你数据的时间戳,并删除比你在RPs里面用DURATION设置的更老的数据。单个数据库中可以有多个RPs但是每个数据的RPs是唯一的。
实例数据: db: food_data mesurement: orders
name: orders
------------
time phone website
2016-05-10T23:18:00Z 10 30
2016-05-10T23:18:10Z 12 39
2016-05-10T23:18:20Z 11 56
目标:
自动删除1h以上的原始2秒间隔数据 --> rp实现
自动删除超过5min的30s间隔数据 --> rp实现
自动将2秒间隔数据聚合到30s的间隔数据 ---> cq实现
2s中插入一次数据:(脚本参考上面fake数据)
create databaes food_data
CREATE RETENTION POLICY "a_hour" ON "food_data" DURATION 1h REPLICATION 1 DEFAULT
CREATE RETENTION POLICY "a_week" ON "food_data" DURATION 1w REPLICATION 1
CREATE CONTINUOUS QUERY "cq_10s" ON "food_data" BEGIN SELECT mean("website") AS "mean_website",mean("phone") AS "mean_phone" INTO "a_week"."downsampled_orders" FROM "orders" GROUP BY time(10s) END
在步骤1里面创建数据库时,InfluxDB会自动生成一个叫做autogen的RP,并作为数据库的默认RP,autogen这个RP会永远保留数据。在输入上面的命令之后,a_hours会取代autogen作为food_data的默认RP。
验证:
select * from "a_week"."downsampled_orders";
select * from "orders";
参考
表名都可以正则
select * from /.*/ limit 1
查询一个表里面的所有数据
select * from cpu_idle
查询数据大于200的。
select * from response_times where value > 200
查询数据里面含有下面字符串的。
select * from user_events where url_base = ‘friends#show’
约等于
select line from log_lines where line =~ /paul@influx.com/
按照30m分钟进行聚合,时间范围是大于昨天的 主机名是server1的。
select mean(value) from cpu_idle group by time(30m) where time > now() – 1d and hostName = ‘server1′
select column_one from foo where time > now() – 1h limit 1000;
select reqtime, url from web9999.httpd where reqtime > 2.5;
select reqtime, url from web9999.httpd where time > now() – 1h limit 1000;
url搜索里面含有login的字眼,还以login开头
select reqtime, url from web9999.httpd where url =~ /^/login//;
还可以做数据的merge
select reqtime, url from web9999.httpd merge web0001.httpd;
参考 参考: http://stedolan.github.io/jq/
#!/bin/bash
function parse_options {
function usage() {
echo -e >&2 "Usage: $0 dump DATABASE [options...]
-u USERNAME (default: root)
-p PASSWORD (default: root)
-h HOST (default: localhost:8086)
-s (use HTTPS)"
}
if [ "$#" -lt 2 ]; then
usage; exit 1;
fi
username=root
password=root
host=localhost:8086
https=0
shift
database=$1
shift
while getopts u:p:h:s opts
do case "${opts}" in
u) username="${OPTARG}";;
p) password="${OPTARG}";;
h) host="${OPTARG}";;
s) https=1;;
?) usage; exit 1;;
esac
done
if [ "${https}" -eq 1 ]; then
scheme="https"
else
scheme="http"
fi
}
function dump {
parse_options $@
curl -s -k -G "${scheme}://${host}/db/${database}/series?u=${username}&p=${password}&chunked=true" --data-urlencode "q=select * from /.*/" | jq . -c -M
exit
}
function restore {
parse_options $@
while read -r line
do
echo >&2 "Writing..."
curl -X POST -d "[${line}]" "${scheme}://${host}/db/${database}/series?u=${username}&p=${password}"
done
exit
}
case "$1" in
dump) dump $@;;
restore) restore $@;;
*) echo >&2 "Usage: $0 [dump|restore] ..."
exit 1;;
esac
utils/db.py
# - * - coding: utf-8 - * -
from influxdb import InfluxDBClient
def get_db_connection():
db_conn = InfluxDBClient(host="192.168.x.x", database="pachongdb")
return db_conn
main.py
#!/home/ansible/.venv/bin/python
# - * - coding: utf-8 - * -
from influxdb.exceptions import InfluxDBClientError, InfluxDBServerError
from utils import db
def insert_success_point_2db():
db_conn = db.get_db_connection()
# 写入成功记录,success字段值约定为1
success_point = [{
"measurement": "wake",
"tags": {
"isp": "mobile",
"region": "上海",
},
"fields": {
"mobile": 159123456xx,
"success": 1,
}
}]
try:
db_conn.write_points(success_point)
except InfluxDBClientError as e:
print("influxdb db client error: {0}".format(e))
except InfluxDBServerError as e:
print("influxdb db server error: {0}".format(e))
except Exception as e:
print("influxdb error: {0}".format(e))
finally:
if db_conn is not None:
db_conn.close()
def insert_fail_point_2db():
db_conn = db.get_db_connection()
# 写入失败记录,fail字段值约定为0
fail_point = [{
"measurement": "wake",
"tags": {
"isp": "mobile",
"region": "上海",
},
"fields": {
"mobile": 1591234xxxx,
"fail": 0,
}
}]
try:
db_conn.write_points(fail_point)
except InfluxDBClientError as e:
print("influxdb db client error: {0}".format(e))
except InfluxDBServerError as e:
print("influxdb db server error: {0}".format(e))
except Exception as e:
print("influxdb error: {0}".format(e))
finally:
if db_conn is not None:
db_conn.close()
def main():
insert_success_point_2db()
insert_fail_point_2db()
if __name__ == ‘__main__‘:
main()
requirements.txt
certifi==2017.11.5
influxdb==5.0.0
[svc]influxdb最佳实战-监控对比
标签:host tag 主机名 实例 数据保存 hang 日记 数据架构 生成
热心网友 时间:2022-04-10 11:00
SVG和SVC的区别:
1、响应时间不同,SVC需要20ms,而SVG只需要10ms。
2、谐波不同,SVC受系统谐波的影响大,自身产生大量谐波。SVG受谐波影响小,可抑制系统谐波。
3、损耗不同,SVC的损耗相对较大,而SVG的损耗相对较小。
4、体积不同,SVC相对较大,SVG则相对较小。
5、基本作用不同,SVC是静止无功补偿器,而SVG是电力电子设备,基本功能好作用不同。
SVC是一种静止无功补偿器。静止无功补偿器是由晶闸管所控制投切电抗器和电容器组成,由于晶闸管对于控制信号反应极为迅速,而且通断次数也可以不受*。包括:TSC、TCR等,“静止”是与同步调相机对应,一般来说将使用晶闸管进行控制的补偿装置成为“SVC"。
SVG是典型的电力电子设备,由三个基本功能模块构成:检测模块、控制运算模块及补偿输出模块。
参考资料:SVG—百度百科 SVC—百度百科
热心网友 时间:2022-04-10 12:18
SVG和SVC的区别:
首先说SVG,它可分为电压型和电流型两种,其既可提供滞后的无功功率,又可提供超前的无功功率。简单地说,SVG的基本原理就是将自换相桥式电路通过电抗器或者直接并联在电网上,适当调节桥式电路交流侧输出电压的相位和幅值,或者直接控制其交流侧电流,就可以使该电路吸收或者发出满足要求的无功电流,实现功率无功补偿的目的。
然后说SVC,它是用于无功补偿典型的电力电子装置,它是利用晶闸管作为固态开关来控制接入系统的电抗器和电容器的容量,从而改变输电系统的导纳。按控制对象和控制方式不同,分为晶闸管控制电抗器(TCR)和晶闸管投切电容器(FC)配合使用的静止无功补偿装置(FC+TCR)和TCR与机械投切电容器(MSC)配合使用的装置。
扩展资料:
静止无功补偿器是由晶闸管所控制投切电抗器和电容器组成,由于晶闸管对于控制信号反应极为迅速,而且通断次数也可以不受*。当电压变化时静止补偿器能快速、平滑地调节,以满足动态无功补偿的需要,同时还能做到分相补偿。
对于三相不平衡负荷及冲击负荷有较强的适应性;但由于晶闸管控制对电抗器的投切过程中会产生高次谐波,为此需加装专门的滤波器。目前,中国电网的建设和运行中长期存在的一个问题是无功补偿容量不足和配备不合理,特别是可调节的无功容量不足,快速响应的无功调节设备更少。
近年来,随着大功率非线性负荷的不断增加,电网的无功冲击和谐波污染呈不断上升的趋势,无功调节手段的缺乏使得母线电压随运行方式的改变而变化很大。
参考资料:百度百科——svc
热心网友 时间:2022-04-10 13:52
目前来说,SVG和SVC均可以称为动态无功补偿装置,这里的动态是指对无功的实时动态调节。两者的本质区别在于:SVC依靠传统的无源器件(电容、电抗)来实现对容感性无功的调节;SVG是通过对电力电子器件构成的变流器来实现对容感性无功的调节。
扩展资料
SVG即可缩放矢量图形是基于可扩展标记语言(标准通用标记语言的子集),用于描述二维矢量图形的一种图形格式。它由万维网联盟制定,是一个开放标准。
SVG可缩放矢量图形(Scalable Vector Graphics)是基于可扩展标记语言(XML),用于描述二维矢量图形的一种图形格式。
SVG是W3C("World Wide Web ConSortium" 即 " 国际互联网标准组织")在2000年8月制定的一种新的二维矢量图形格式,也是规范中的网络矢量图形标准。SVG严格遵从XML语法,并用文本格式的描述性语言来描述图像内容,因此是一种和图像分辨率无关的矢量图形格式。
SVC是Switching Virtual Circuit的缩写,意思是交换虚拟电路。信息包交换虚拟线路(节点之间只在需要传送数据时才建立逻辑连结) 面向连接的网络中,从一台计算机到另一台计算机的连接。
SVC是虚拟的,因为路径是从路由表中得到的,而不是建立物理线路。SVC是交换的,因为它能按需要建立,类似于一次电话呼叫。
参考资料
百度百科。SVG
百度百科。SVC
热心网友 时间:2022-04-10 15:44
浅析SVC与SVG的异同点热心网友 时间:2022-04-10 17:52
目前来说,SVG和SVC均可以称为动态无功补偿装置,这里的动态是指对无功的实时动态调节。两者的本质区别在于:SVC依靠传统的无源器件(电容、电抗)来实现对容感性无功的调节;SVG是通过对电力电子器件构成的变流器来实现对容感性无功的调节。热心网友 时间:2022-04-10 20:16
SVC是静止式动态无功补偿装置,分TCR和TSC两种。SVG是SVC的升级版,在很多方面优于SVC。热心网友 时间:2022-04-10 22:58
SVC是静止式动态无功补偿装置,分TCR和TSC两种。SVG是SVC的升级版,在很多方面优于SVC。