概述:
何为时序型数据库?
什么是时间序列数据库,最简单的定义就是数据格式里包含Timestamp字段的数据,比如某一时间环境的温度,CPU的使用率等。但是,有什么数据不包含Timestamp呢?几乎所有的数据其实都可以打上一个Timestamp字段。时间序列数据的更重要的一个属性是如何去查询它,包括数据的过滤,计算等等。
influxdb作为现在主流的时序型数据库,性能强悍,在NetDevOps中主要是用于监控设备。
lnfluxdb是一个开源的分布式时序、时间和指标数据库,使用go语言编写,无需外部依赖。它有三大特性:
- 时序性(Time Series):与时间相关的函数的灵活使用(诸如最大、最小、求和等);
- 度量(Metrics):对实时大量数据进行计算;
- 事件(Event):支持任意的事件数据,换句话说,任意事件的数据我们都可以做操作。
安装InfluxDB:
使用docker-compose安装:
influxdb.yaml:
version: '3'
services:
# influxdb容器
influxDB:
image: "influxdb"
user: root
environment:
- INFLUXDB_DB=devdb # 数据库
- INFLUXDB_ADMIN_USER=admin
- INFLUXDB_ADMIN_PASSWORD=Cisc0123
- INFLUXDB_USER=devdbuser
- INFLUXDB_USER_PASSWORD=Cisc0123
volumes:
- /influx/influxdb:/var/lib/influxdb # 数据卷
- /network_protocal/practice_work/influx_db/init-influxdb.sh:/docker-entrypoint-initdb.d/init-influxdb.sh # 初始化脚本
networks:
- influx_net # 网络
ports:
- "8086:8086"
restart: always
# 用grafana做图形化界面
grafana:
# 镜像名称
image: "grafana/grafana"
user: root
volumes:
- /influx/grafana:/var/lib/grafana
networks:
- influx_net
# 开放端口
ports:
- "3000:3000"
depends_on:
- "influxDB"
restart: always
# 创建网络
networks:
influx_net:
driver: bridge
init-influxdb.sh:初始化脚本,配置devdb数据库的存放数据的policy,默认数据存放3周
#!/bin/bash
set -e
influx <<-EOSQL
create retention policy "devdb_rp_policy" on "devdb" duration 3w replication 1 default
EOSQL
在influxdb.yaml同一个文件夹下使用命令,创建容器:
docker-compose -f influxdb.yaml up -d
可以在游览器上输出:http://192.168.0.166:3000/,登陆grafana,账号密码默认是admin/admin。登陆后,连接influxdb:
选择influxdb,并填上相关参数:
influxdb基本操作:
注意:建议最好将基本操作在写yaml文件时就定义完成。
-
进入influxdb:
docker exec -it influx_db_influxDB_1(容器名称) influx
-
创建数据库:
create database devdb
-
使用数据库:
use devdb
-
创建普通用户:
CREATE USER "devdbuser" WITH PASSWORD 'Cisc0123'
-
创建管理员:
CREATE USER admin WITH PASSWORD 'Cisc0123' WITH ALL PRIVILEGES
-
删除用户:
drop user admin
-
给与普通用户数据库权限:
grant all on devdb to devdbuser
-
创建retention policies
create retention policy "devdb_rp_policy" on "devdb" duration 3w replication 1 default
-
修改
alter retention policy "devdb_rp_policy" on "devdb" duration 30d default
-
查看retention policies
show retention policies on "devdb"
-
删除retention policies
drop retention policy "devdb_rp_policy" on devdb
python实战:
实验目的:
使用SNMP获取MEM利用率,写入influxdb,然后通过grafana做呈现。
实验设备:
CSR1000v,已经配置好snmp,IP地址为192.168.0.66。
实验步骤:
1.测试与与influxdb的连通性:
influxdb_init_connect.py:
from influxdb import InfluxDBClient
influx_host = '192.168.0.166'
router_ip = "192.168.0.66"
snmp_community = "tcpipro"
if __name__ == '__main__':
# 使用系统管理员来查询信息
client = InfluxDBClient(influx_host, 8086, 'admin', 'Cisc0123')
# 查看数据库
print(client.get_list_database())
# 创建数据库
print(client.create_database('testdb'))
print(client.get_list_database())
# 删除数据库
print(client.drop_database('testdb'))
print(client.get_list_database())
# 使用devdbuser查看信息
client = InfluxDBClient(influx_host, 8086, 'devdbuser', 'Cisc0123', 'devdb')
measurements_result = client.query('show measurements;') # 显示数据库中的表
print(f"Result: {format(measurements_result)}")
retention_result = client.query('show retention policies on "devdb";') # 显示数据库中的表
print(f"Result: {format(retention_result)}")
测试结果:能够连接到influxdb中的devdb。
2.编写snmpv2_get函数:
snmpv2_get.py:
from pysnmp.hlapi import *
def snmpv2_get(ip, community, oid, port=161):
# varBinds是列表,列表中的每个元素的类型是ObjectType(该类型的对象表示MIB variable)
error_indication, error_status, error_index, var_binds = next(
getCmd(SnmpEngine(),
CommunityData(community),
UdpTransportTarget((ip, port)),
ContextData(),
ObjectType(ObjectIdentity(oid)))
)
# 错误处理
if error_indication:
print(error_indication)
elif error_index:
print('%s at %s' % (
error_status,
error_index and var_binds[int(error_index) - 1][0] or '?'
)
)
# 如果返回结果又多行,需要拼接后返回
result = ""
for varBind in var_binds:
# 返回结果
result = result + varBind.prettyPrint()
# 返回的为一个元组,OID与字符串结果
# print(result)
return result.split("=")[0].strip(), result.split("=")[1].strip()
3.组织好数据格式并向influxdb中写入:
influxdb_monior_router.py:
import time
import datetime
from snmpv2_get import snmpv2_get
from influxdb import InfluxDBClient
from influxdb_init_connect import router_ip, snmp_community, influx_host
client = InfluxDBClient(influx_host, 8086, 'devdbuser', 'Cisc0123', 'devdb')
while True:
# ----------------------写入内存数据------------------------
# cpmCPUMemoryUsed
mem_usage = snmpv2_get(router_ip, snmp_community, "1.3.6.1.4.1.9.9.109.1.1.1.1.12.7", port=161)
# cpmCPUMemoryFree
mem_free = snmpv2_get(router_ip, snmp_community, "1.3.6.1.4.1.9.9.109.1.1.1.1.13.7", port=161)
# 对UTC时间做格式化
current_time = datetime.datetime.utcnow().isoformat("T")
# 组织数据信息
cpu_mem_body = [
{
"measurement": "router_monitor",
"time": current_time,
"tags": {
"device_ip": router_ip,
"device_type": "IOS-XE"
},
"fields": {
"mem_usage": int(mem_usage[1]),
"mem_free": int(mem_free[1]),
},
}
]
# 每隔五秒收集数据信息,写入到influxdb中
client.write_points(cpu_mem_body)
time.sleep(5)
这里的数据信息是一个列表,里面可以存放多个JSON数据:
- “measurement”: “router_monitor”,为表名;
- “time”: current_time为时间戳,必须存在;
- "tags"字段方便搜索;
- "fields"字段为记录的数据信息,不能检索。
4.在grafana中创建dashboard:
使用SQL语句,创建dashboard:
语句如下:
SELECT mean("mem_usage")*100/(mean("mem_usage")+mean("mem_free")) FROM "router_monitor" WHERE $timeFilter GROUP BY time($__interval), "device_ip" fill(none)
参考资料:
https://www.bilibili.com/video/BV1SV41127HU?from=search&seid=13988085653859648559