influxdb从理论到实战(rust)

目录

  • 前言
  • 一、简介
    • 1、基本概念
    • 2、Series
    • 3、Retention Policies
  • 二、命令操作
    • 1.数据库与表的操作
    • 2.保留策略
    • 3.用户权限管理
    • 4.series/point/tag/field
    • 5.增删改
    • 6.查询
  • 三、api操作
    • 1.连接
    • 2.插入
    • 3.删除
    • 4.查询
  • 四、其他
    • 1.备份
    • 2.恢复

前言

…略

一、简介

…略

1、基本概念

mysql influxdb 说明
database/bucket database 数据库
table measurement 类似mysql中表的概念
record tag + field + timestamp 传统表中的一行数据,映射到influxdb中,可以划分为三个
  • measurement influxdb没有单独的创建measurement的方法,直接新增一条数据时,若measurement不存在,则直接创建并插入一条数据
  • point 在influxDB中,表示每个表中,某个时刻,满足某个条件的filed数据(简单来说就是 timestamp + tag + field + measurement)的组成一个point
    • timestamp : 时间戳,ns单位,每个记录都必然有这个属性,没有显示添加时,默认给一个
    • tag: 标签,kv结构,在database中, tag + measurement 一起构建索引
      • 参与索引创建,因此适合作为查询的过滤条件
      • tag的数据量不要太多,最好能有典型的辨别性(和mysql的建立索引的原则差不多)
      • value为String类型
      • tag是可选的,在measurement不设置tag也是ok的
  • field:存储数据,kv结构
    • 数据类型为: long, String, boolean, float

2、Series

InfluxDB中的series是一种数据源的合的概念,在同一个database中,相同retention policy、相同measurement、相同tag的数据属于一个series集合,标识这条数据来自哪里,同一个series的数据在物理上按照时间顺序排列在一起。
所有每个point是根据 timestamp + series 来保证唯一性

3、Retention Policies

InfluxDB没有提供直接删除Points的方法,但是它提供了Retention Policies。
主要用于指定数据的保留时间:用于决定数据保存多久(意思是数据可以删除),保存几个备份,集群的处理等

二、命令操作

1.数据库与表的操作

# 创建数据库
CREATE DATABASE "db_name"
# 显示所有数据库
SHOW DATABASES
# 删除数据库
DROP DATABASE "db_name"

# 使用数据库
USE mydb

# 显示该数据库中的表
SHOW MEASUREMENTS

# 创建表
# 直接在插入数据的时候指定表名(weather就是表名)
insert weather,altitude=1000,area=北 temperature=11,humidity=-4

# 删除表
DROP MEASUREMENT "measurementName"

2.保留策略

//查看策略
> show retention policies on db_name
name    duration shardGroupDuration replicaN default
----    -------- ------------------ -------- -------
  • name: 名称
  • duration: 保留时间, 0表示永久保存
  • shardGroupDuration: shardGroup的存储时间,shardGroup是InfluxDB的一个基本储存结构,应该大于这个时间的数据在查询效率上应该有所降低。
  • replicaN: 全称是REPLICATION,副本个数
  • default: 是否是默认策略
//新建策略 名称 库 时间 副本数 是否是默认策略
create retention policy "2_hour" on hh_test duration 2h replication 1 default

//修改策略
> alter retention policy "2_hour" on hh_test duration 4h default

//删除策略
> drop retention policy "2_hour" on hh_test

3.用户权限管理

# 显示用户
SHOW USERS

# 创建用户
CREATE USER "username" WITH PASSWORD 'password'

# 删除用户
DROP USER "username"

# 创建管理员权限的用户
CREATE USER "username" WITH PASSWORD 'password' WITH ALL PRIVILEGES

#重设密码
set password for xxx='newpwd'

//授权
GRANT ALL PRIVILEGES TO <username>
GRANT [READ,WRITE,ALL] ON <database_name> TO <username>

//查询授权
show grants for <username>

//回收
REVOKE ALL PRIVILEGES FROM <username>
REVOKE [READ,WRITE,ALL] ON <database_name> FROM <username>

4.series/point/tag/field

//查看tag的keys
show tag keys on <database> from <measurement>
//查看tag的value
show tag values on <database> from <measurement> with KEY [ [<operator> "" | <regular_expression>] | [IN ("",")]] [WHERE <tag_key> <operator> ['' | <regular_expression>]] [LIMIT_clause] [OFFSET_clause]

//例如
show tag values from table_name with key="ty"
  • with key 后面带上查询条件,必须存在,如查询汇率表中,base_symbol有哪些
  • 连接符号可以为:等于 =, 不等于:!=, <>, 正则:=~, !~
//查看field
show field keys on <database> from <measurement>

//查看series
show series on <database> from <measurement>

5.增删改

新增

insert into <retention policy> measurement,tagKey=tagValue fieldKey=fieldValue timestamp
  • retention policy 为空,则为默认策略
  • 时间戳为空,则默认当前,如指定,单位为ns
类型 方式 示例
float 数字 user_id=21
int 数字i age=18i
boolean true/false boy=true
String “” or ‘’ email=”[email protected]

删除

DELETE FROM <measurement_name> WHERE [<tag_key>=''] | [<time interval>]
  • 这里无法指定retention policy,会删除所有retention policy中符合where条件的数据。

修改
在influxdb中没有专门的修改数据的update语句,对于influxdb而言,如果想修改数据,还是得使用我们前面的说到的insert来实现

  • 通过 retention policy + tag + measurement 能够锁定唯一的series
  • 通过 series+timestand 能够找到 point

那么我们大致能够写出如下的语句来命中数据:

//tag 必须完全和之前insert的数据相等
insert into <retention policy> measurement,tagKey=tagValue fieldKey=fieldValue timestamp

通过这条语句可以增量修改field。
如果想修改之前的field,则需要先删除,后插入

6.查询

基础语句

SELECT <field_key>[,<field_key>,<tag_key>] 
FROM <measurement_name>[,<measurement_name>]
WHERE <conditional_expression> [(AND|OR) <conditional_expression> [...]]
GROUP BY [* | <tag_key>[,<tag_key]]
order by time desc/asc
LIMIT <N> OFFSET <N>
SLIMIT <N>


select

  • select * : 表示查询所有的field和tag对应的值
  • select field_key: 表示查询特定的field对应的值
  • select tag_key: 表示查询的特定的tag对应的值
  • SELECT “”::field,""::tag: 注意::field和::tag用来限定这个数据的类型为tag或者是field

from

  • FROM 从指定的measurement中获取数据
  • FROM , 从多个measurement中- 获取数据
  • FROM .. 从某个数据库中某个保留策略中查询measurement中的数据

where

  • 与mysql查询基本一样 操作符含义基本一样
  • 在influxdb中没有in查询,不同的查询条件可以使用and/or来连接,表示同时满足or一个满足即可

group

  • 用来分组的必须是tag
  • group by * 表示根据所有的tag进行分组
  • group by time(2m/2s) 按照2m/2s进行分组
    • 根据时间进行分组时,不允许查询具体的field值

slimit

  • 指定从指定measurement返回的series数 ???

limit offset

  • 简单来讲,就是limit 条数 offset 偏移

三、api操作

1.连接

    let mut client = Client::new("http://123.57.130.20:8086".parse().unwrap(), "takeout").set_authentication("root", "123");
    if client.ping().await {
        wd_log::log_info_ln!("连接数据库成功")
    }else{
        wd_log::log_info_ln!("连接数据库失败")
    }
    let _ = client.switch_database("takeout");

2.插入

pub async fn insert(client:&Client) -> Result<(), Error> {
    let mut point = Point::new("student")
        .add_tag("id",Value::String("2".to_string()))
        .add_field("name",Value::String("我是坏人".to_string()))
        .add_field("age",Value::Integer(21));
    client.write_point(point,None,None).await
}

3.删除

pub async fn delete(client:&Client, id:String) -> Result<Option<Vec<Node>>, Error> {
    let query = format!(r#"delete from student where "id" = '{}'"#,id);
    client.query(query.as_str(),None).await
}

4.查询

pub async fn select(client:&Client, id:String) -> Result<Option<Vec<Node>>, Error> {
    let query = format!(r#"select * from student where "id" = '{}'"#,id);
    client.query(query.as_str(),None).await
}
pub async fn select_time(client:&Client, time:usize) -> Result<Option<Vec<Node>>, Error> {
    let query = format!(r#"select * from student where "time" > {}"#,time);
    client.query(query.as_str(),None).await
}

四、其他

1.备份

备份命令

influxd backup
    [ -database <db_name> ]  --> 指定需要备份的数据库名
    [ -portable ]            --> 表示在线备份
    [ -host <host:port> ]    --> influxdb服务所在的机器,端口号默认为8088
    [ -retention <rp_name> ] | [ -shard <shard_ID> -retention <rp_name> ]  --> 备份的保留策略,注意shard是挂在rp下的;我们需要备份的就是shard中的数据
    [ -start <timestamp> [ -end <timestamp> ] | -since <timestamp> ]   --> 备份指定时间段的数据
    <path-to-backup>   --> 备份文件的输出地址

备份全部

influxd backup -portable /tmp/data/total

2.恢复

恢复命令

influxd restore 
    [ -db <db_name> ]       --> 待恢复的数据库(备份中的数据库名)
    -portable | -online
    [ -host <host:port> ]    --> influxdb 的服务器
    [ -newdb <newdb_name> ]  --> 恢复到influxdb中的数据库名
    [ -rp <rp_name> ]        --> 备份中的保留策略
    [ -newrp <newrp_name> ]  --> 恢复的保留策略
    [ -shard <shard_ID> ]
    <path-to-backup-files>

未完待续

你可能感兴趣的:(rust,架构,influxdb,rust,时序数据库,influx,数据库)