背景
一般来讲 Influxdb的数据是无法更新的。 当tags与time 相同的时候。 原有filed域数据会被覆盖。 这里采用插入前 Field域中的数据整合 来达到更新的目的
Influxdb的概念
首先 这里讲一下Influxdb的几个概念
1、与传统数据库中的名词做比较
InfluxDB中的名词 | 传统数据库中的概念 |
---|---|
database | 数据库 |
measurement | 数据库中的表 |
points | 表里面的一行数据 |
Point
Point由时间戳(time)、数据(field)、标签(tags)组成。
Point相当于传统数据库里的一行数据,如下表所示:
Point属性 | 传统数据库中的概念 |
---|---|
time | 每个数据记录时间,是数据库中的主索引(会自动生成) |
fields | 各种记录值(没有索引的属性)也就是记录的值 |
tags | 各种有索引的属性 |
series
所有在数据库中的数据,都需要通过图表来展示,而这个series表示这个表里面的数据,可以在图表上画成几条线:通过tags排列组合算出来。series(一般由:retention policy, measurement, tagset就共同组成),其含义如下:
- 所有在数据库中的数据,都需要通过图表来展示,而这个series表示这个表里面的数据,可以在图表上画成几条线:通过tags排列组合算出来。
insert mytest, server=serverA count=1,name=5 //自动创建表
“mytest”,“server” 是 tags,“count”、“name” 是 fields
fields 中的 value 基本不用于索引
Influxdb更新数据的workaround
json格式举例
json_body = [
{
"measurement": "cpu_load_short",
"tags": {
"host": "server01",
"region": "us-west"
},
"time": "2009-11-10T23:00:00Z",
"fields": {
"value": 0.64
}
}
]
Influxdb数据更新Demo示例
def parse_data(tag):
while len(MySSHClient.data_queue):
host_for_data, run_time, data_group_list = data_queue.popleft() # 不能popleft空队列
db_name = 'db_' + host_for_data
# 获取要创建的表名称、表前缀
json_body = []
for data_group in data_group_list:
if re.findall(data_group_regex, data_group): # 找到目标数据组(比如CPU统计,内存统计报告等)
row_list = data_group.split('\n') # 获取组里的每条数据 形如 18:39:11 CPU %usr %nice %sys %iowait %steal %irq %soft %guest %idle
row_item_list = re.split('\s+', row_list[0]) # 获取由空格隔开的每项数据
if row_item_list:
if row_item_list[1:2] == ['CPU']:
flag = 'cpu'
field_list = row_item_list[2:] # 获取表字段
else:
continue
for row in row_list[1:]:
row_item_list = re.split('\s+', row.strip()) # 获取由空格隔开的每项数据
data_time = row_item_list[0]
if run_time == '': # 数据来源docker容器 data_time 格式形如 22:42:30-2018-06-18
data_time, runtime = data_time.split('@')
date_time = '%s %s' % (runtime, data_time)
else:
date_time = '%s %s' % (run_time, data_time)
timetuple = time.strptime(date_time, '%Y-%m-%d %H:%M:%S')
second_for_localtime_utc = int(time.mktime(timetuple)) - 8 * 3600 # UTC时间(秒)
timetuple = time.localtime(second_for_localtime_utc)
date_for_data = time.strftime('%Y-%m-%d', timetuple)
time_for_data = time.strftime('%H:%M:%S', timetuple)
datetime_for_data = '%sT%sZ' % (date_for_data, time_for_data)
if flag in ('cpu', 'cpu_limit', 'dev', 'netdev', 'enetdev'):
measurement = flag + '_' + row_item_list[1]
row_item_list = row_item_list[2:]
else:
measurement = flag
row_item_list = row_item_list[1:]
temp_dic = {}
for i in range(0, len(field_list)):
temp_dic[field_list[i]] = float(row_item_list[i])
json_body.append({
"measurement": measurement,
"tags": {
"stuid": tag
},
"time": datetime_for_data,
"fields":temp_dic
})
if json_body:
result = self.influx_db_client.write_points(json_body, database=db_name)
if result:
logger.info('往数据库:db_%s 成功写入数据' % host_for_data)
else:
logger.error('获取influxdb json数据为空')
总结
influxdb 的数据读写 可以先集合field域 然后统一写入