连接并写入数据

最近更新时间:2023-12-14 16:22:01

我的收藏
本章节以 Linux 操作系统为例,协助您通过云服务器 CVM 内网,使用 HTTP 方式连接时序数据库 InfluxDB 版实例。

前提条件

申请与时序数据库 InfluxDB 版在同一地域同一个 VPC 内的 Linux 云服务器 CVM
新建数据库实例,且状态为运行中。
获取实例的内网 IP 地址与网络端口。具体操作,请参见 查看实例
获取实例的访问账号及密码信息。具体操作,请参见 账号管理

操作步骤

步骤1:准备数据

如下为一些关于车辆的时序数据,每行代表一个车辆的信息,包括车辆的 id、所在城市、类型、速度和温度等。时间戳位于每行末尾,表示这些信息是在对应的时间戳时刻记录的。现将这些数据写入已创建的数据库实例中。
car,id=0,city=city_0,type=type_0 speed=100,temp=20 1675236656000000000
car,id=1,city=city_1,type=type_1 speed=101,temp=21 1675236656000000000
car,id=2,city=city_0,type=type_2 speed=102,temp=22 1675236656000000000
car,id=3,city=city_1,type=type_0 speed=103,temp=23 1675236656000000000
car,id=4,city=city_0,type=type_1 speed=104,temp=24 1675236656000000000
car,id=5,city=city_1,type=type_2 speed=105,temp=25 1675236656000000000
car,id=0,city=city_0,type=type_0 speed=106,temp=26 1675236657000000000
car,id=1,city=city_1,type=type_1 speed=107,temp=27 1675236657000000000
car,id=2,city=city_0,type=type_2 speed=108,temp=28 1675236657000000000
car,id=3,city=city_1,type=type_0 speed=100,temp=29 1675236657000000000
car,id=4,city=city_0,type=type_1 speed=101,temp=30 1675236657000000000
car,id=5,city=city_1,type=type_2 speed=102,temp=20 1675236657000000000
car,id=0,city=city_0,type=type_0 speed=103,temp=21 1675236658000000000
car,id=1,city=city_1,type=type_1 speed=104,temp=22 1675236658000000000
car,id=2,city=city_0,type=type_2 speed=105,temp=23 1675236658000000000
car,id=3,city=city_1,type=type_0 speed=106,temp=24 1675236658000000000
car,id=4,city=city_0,type=type_1 speed=107,temp=25 1675236658000000000
car,id=5,city=city_1,type=type_2 speed=108,temp=26 1675236658000000000
car,id=0,city=city_0,type=type_0 speed=100,temp=27 1675236659000000000
car,id=1,city=city_1,type=type_1 speed=101,temp=28 1675236659000000000
car,id=2,city=city_0,type=type_2 speed=102,temp=29 1675236659000000000
car,id=3,city=city_1,type=type_0 speed=103,temp=30 1675236659000000000
car,id=4,city=city_0,type=type_1 speed=104,temp=20 1675236659000000000
car,id=5,city=city_1,type=type_2 speed=105,temp=21 1675236659000000000
car,id=0,city=city_0,type=type_0 speed=106,temp=22 1675236660000000000
car,id=1,city=city_1,type=type_1 speed=107,temp=23 1675236660000000000
car,id=2,city=city_0,type=type_2 speed=108,temp=24 1675236660000000000
car,id=3,city=city_1,type=type_0 speed=100,temp=25 1675236660000000000
car,id=4,city=city_0,type=type_1 speed=101,temp=26 1675236660000000000
car,id=5,city=city_1,type=type_2 speed=102,temp=27 1675236660000000000
car,id=0,city=city_0,type=type_0 speed=103,temp=28 1675236661000000000
car,id=1,city=city_1,type=type_1 speed=104,temp=29 1675236661000000000
car,id=2,city=city_0,type=type_2 speed=105,temp=30 1675236661000000000
car,id=3,city=city_1,type=type_0 speed=106,temp=20 1675236661000000000
car,id=4,city=city_0,type=type_1 speed=107,temp=21 1675236661000000000
car,id=5,city=city_1,type=type_2 speed=108,temp=22 1675236661000000000

步骤2:登录云服务器 CVM

2. 在左侧导航栏,选择实例
3. 在实例管理页面上方,选择地域。
4. 在实例列表中找到已申请的 CVM ,单击右侧操作列中的登录
5. 输入申请 CVM 时设置的用户名密码即可登录云服务器。

步骤3:创建数据库

CREATE DATABASE 的语法格式如下所示:
CREATE DATABASE <database_name> [WITH [DURATION <duration[默认无限制]>]]
database_name:指数据库库名。
DURATION:数据过期删除时间(TTL , Time To Live),单位:天,取值为非零整数,选填参数。如果不启用数据过期,不配置该参数,如需启用数据过期,该数据库中的数据达到过期时间后将被自动删除清理。例如 DURATION 180d,表示该数据库中的数据达到180天即过期自动删除。
创建数据库 time_series_test_db,执行格式如下所示:
curl --get http://${influxdb_ip}:8086/query \\
--user "time_series_test_account":"test_password" \\
--data-urlencode "pretty=true" \\
--data-urlencode 'q=CREATE DATABASE time_series_test_db'
${influxdb_ip}:指数据库实例的内网 IP 地址。其端口默认为8086,请以实际情况进行替换。
user:指访问实例的账号与密码信息,默认账号以实例 ID 命名。您可以在 控制台账号管理页面查看账号信息。具体操作,请参见 账号管理
data-urlencode "pretty=true" :pretty 为 true,将以 JSON Pretty Print 格式返回信息。
data-urlencode:即 CREATE DATABASE 的语法格式 ,如'q=CREATE DATABASE time_series_test_db'、'q=CREATE DATABASE time_series_test_db WITH DURATION 180d'。
返回如下信息,说明在创建中。
{
"code": "invalid",
"message": "Tsdb create database operation is executing, please try again later(maybe failture)."
}
返回如下信息,说明创建成功。
{
"results": [
{
"statement_id": 0
}
]
}
执行show database,查看已经创建的数据库,执行格式如下所示:
curl --get http://${influxdb_ip}:8086/query \\
--user "time_series_test_account":"test_password" \\
--data-urlencode "pretty=true" \\
--data-urlencode 'q=show databases'
执行示例,如下所示:
[root@VM-16-41-centos ~]# curl --get http://10.16.12.8:8086/query \\
> --user "ctsdbi-8ym3****":"test@123" \\
> --data-urlencode "pretty=true" \\
> --data-urlencode 'q=show databases'
{
"results": [
{
"statement_id": 0,
"series": [
{
"name": "databases",
"columns": [
"name"
],
"columns_types": [
"string"
],
"values": [
[
"test0407"
],
[
"time_series_test_db"
],
[
"_internal"
],
[
"TestAlvinDatabase"
],
[
"time_series_test_db0"
]
]
}
]
}
]
}

步骤4:写入数据

给数据库 time_series_test_db 写入数据。
curl -v --data-binary @/tmp/line_protocol_sample.txt \\
--user "time_series_test_account":"test_password" \\
-H "Content-Type: text/plain" \\
-H "Accept: application/json" -X POST \\
"http://${influxdb_ip}:8086/write?db=time_series_test_db&precision=ns"
@/tmp/line_protocol_sample.txt:指写入数据的文件的相对路径。
user:配置实例的访问账号与密码。
influxdb_ip:指实例内网 IP 地址。
db:指数据库库名。
precision:时间数据的精度,可以使用的精度包括 ns(纳秒)、u(微秒)、ms(毫秒)、s(秒)、m(分钟)、h(小时)。
执行示例如下,将/tmp/test.txt文档中的时序数据写入数据库time_series_test_db
[root@VM-16-41-centos tmp]# curl -v --data-binary @/tmp/test.txt \\
> --user "ctsdbi-8ym3****":"test@123" \\
> -H "Content-Type: text/plain" \\
> -H "Accept: application/json" -X POST \\
> "http://10.16.12.8:8086/write?db=time_series_test_db&precision=ns"
* About to connect() to 10.16.12.8 port 8086 (#0)
* Trying 10.16.12.8...
* Connected to 10.16.12.8 (10.16.12.8) port 8086 (#0)
* Server auth using Basic with user 'ctsdbi-8ym3****'
> POST /write?db=time_series_test_db&precision=ns HTTP/1.1
> Authorization: Basic Y3RzZGJpLTh5********************
> User-Agent: curl/7.29.0
> Host: 10.16.12.8:8086
> Content-Type: text/plain
> Accept: application/json
> Content-Length: 2552
> Expect: 100-continue
>
* Done waiting for 100-continue
< HTTP/1.1 204 No Content
< Date: Mon, 10 Apr 2023 03:48:51 GMT
< Content-Type: application/json
< Content-Length: 0
<
* Connection #0 to host 10.16.12.8 left intact
写入数据返回信息中,Date: Mon, 10 Apr 2023 03:48:51 GMT显示写入完成的时间点,无任何错误提示信息,说明写入成功。常见的错误信息,请参见下表。
错误信息
错误含义
处理方式
{     "error": "NotFoundCollection cannot find collections" }
连接失败
排查连接数据库的内网 IP 地址与端口是否正确。
{     "error": "BadParam ERR wrong password.\\r\\n" }
访问数据库的账户密码错误
请检查密码信息是否正确。
{     "error": "NotFoundAccount ERR account id or name not exists: 1nB3pmg==" }
访问数据的账户不存在
请检查账户信息是否输入错误。
{     "error": "InvalidFieldFormat ParsePoint() failed|status=InvalidFieldFormat InvalidBooleanFormat not start with tTfF|line=727|col=14\\ncar id=0,city=city_0,type=type_0 speed=100,temp=20 0\\n              | start here" }
数据写入失败
请检查car id=0,city=city_0,type=type_0 speed=100,temp=20这一行数据的第14个字符是否存在 Line Protocol 格式问题。
使用 show measurements 查看写入的 measurements,执行方式如下所示:
curl --get http://${influxdb_ip}:8086/query \\
--user "time_series_test_account":"test_password" \\
--data-urlencode 'db=time_series_test_db' \\
--data-urlencode "pretty=true" \\
--data-urlencode "q=show measurements"
执行示例,如下所示:
[root@VM-16-41-centos ~]# curl --get http://10.16.12.8:8086/query \\
> --user "ctsdbi-8ym3****":"test@123" \\
> --data-urlencode 'db=time_series_test_db' \\
> --data-urlencode "pretty=true" \\
> --data-urlencode "q=show measurements"
{
"results": [
{
"statement_id": 0,
"series": [
{
"name": "measurements",
"columns": [
"name"
],
"columns_types": [
"string"
],
"values": [
[
"car"
],
[
"d=0"
]
]
}
]
}
]
}

步骤5:查询数据

Select 语法格式如下所示:
select_stmt = "SELECT" fields from_clause [ where_clause ] [ group_by_clause ] [ order_by_clause ] [ limit_clause ] [ offset_clause ] [ slimit_clause ] [ soffset_clause ] [ sql_order_by_clause ]
参数含义,请参见下表。
参数
参数含义
fields
指定需要查询的字段列表,可以是一个或多个字段,用逗号分隔。如果需要查询所有字段,可以使用通配符“*”。
from_clause
指定需要查询的 measurement 名称。
where_clause
指定查询的条件,可以是一个或多个条件,可以使用 AND、OR、NOT 等逻辑运算符组合多个条件。条件包括 tag 和 field,可以使用比较运算符(如=、!=、>、<等)进行比较。
group_by_clause
指定查询结果需要按照哪个 tag 进行分组,可以是一个或多个 tag,用逗号分隔。
order_by_clause
指定查询结果需要按照哪个字段进行排序,可以是一个或多个字段,用逗号分隔。默认情况下,查询结果按照时间戳排序。
limit_clause
指定查询结果的最大行数。
offset_clause
指定查询结果的起始行数。
slimit_clause
类似于 limit_clause,但仅应用于每个分组内部的结果集。
soffset_clause
类似于 offset_clause,但仅应用于每个分组内部的结果集。
sql_order_by_clause
类似于 order_by_clause,但是使用 SQL 语法进行排序。
查询全部数据执行方式,如下所示:
curl --get http://${influxdb_ip}:8086/query \\
--user "time_series_test_account":"test_password" \\
--data-urlencode 'db=time_series_test_db' \\
--data-urlencode "pretty=true" \\
--data-urlencode 'q=select * from car'
分页查询执行方式,如下所示:
curl --get http://${influxdb_ip}:8086/query \\
--user "time_series_test_account":"test_password" \\
--data-urlencode 'db=time_series_test_db' \\
--data-urlencode "pretty=true" \\
--data-urlencode 'q=select * from car limit 3 offset 2'
聚合函数查询执行方式,如下所示:
curl --get http://${influxdb_ip}:8086/query \\
--user "time_series_test_account":"test_password" \\
--data-urlencode 'db=time_series_test_db' \\
--data-urlencode "pretty=true" \\
--data-urlencode 'q=select max(speed) as fun1, min(speed) as fun2 from car group by time(3s), type fill(none)'
聚合函数执行返回结果,如下所示:
{
"results": [
{
"statement_id": 0,
"series": [
{
"name": "car",
"tags": {
"type": "type_0"
},
"columns": [
"time",
"fun1",
"fun2"
],
"columns_types": [
"time",
"float",
"float"
],
"values": [
[
"2023-02-01T07:30:54Z",
103.0,
100.0
],
[
"2023-02-01T07:30:57Z",
106.0,
100.0
],
[
"2023-02-01T07:31:00Z",
106.0,
100.0
]
]
},
{
"name": "car",
"tags": {
"type": "type_1"
},
"columns": [
"time",
"fun1",
"fun2"
],
"columns_types": [
"time",
"float",
"float"
],
"values": [
[
"2023-02-01T07:30:54Z",
104.0,
101.0
],
[
"2023-02-01T07:30:57Z",
107.0,
101.0
],
[
"2023-02-01T07:31:00Z",
107.0,
101.0
]
]
},
{
"name": "car",
"tags": {
"type": "type_2"
},
"columns": [
"time",
"fun1",
"fun2"
],
"columns_types": [
"time",
"float",
"float"
],
"values": [
[
"2023-02-01T07:30:54Z",
105.0,
102.0
],
[
"2023-02-01T07:30:57Z",
108.0,
102.0
],
[
"2023-02-01T07:31:00Z",
108.0,
102.0
]
]
}
]
}
]
}

步骤6:删除数据库

DELETE
删除具体的数据,语法格式如下所示:
DELETE FROM <measurement_name> WHERE [<tag_key>='<tag_value>'] | [<time interval>]
measurement_name:指定需要删除数据的 measurement 名称。
tag_key、tag_value:可选参数,指定需要删除的数据点对应的 tag 键值对。如果指定了 tag_key 和 tag_value,则只会删除符合条件的数据点。如果不指定 tag_key 和 tag_value,则会删除所有 measurement_name 中的数据点。
time interval:可选参数,指定需要删除的时间范围。可以使用以下格式进行指定:
时间戳:删除指定时间戳的数据点,例如:"time >= 1434059627 and time <= 1434060027"
相对时间:删除相对于当前时间一定时间范围内的数据点,例如:"time >= now() - 1h"
时间段:删除指定时间段内的数据点,例如:"time >= '2018-01-01T00:00:00Z' and time <= '2018-01-02T00:00:00Z'"
执行方式,如下所示:
curl --get http://${influxdb_ip}:8086/query \\
--user "time_series_test_account":"test_password" \\
--data-urlencode 'db=time_series_test_db' \\
--data-urlencode "pretty=true" \\
--data-urlencode "q=delete from car where city = 'city_0'"
DROP MEASUREMENT
删除 measurement 语法格式,如下所示:
DROP MEASUREMENT <measurement_name>
执行方式如下所示:
curl --get http://${influxdb_ip}:8086/query \\
--user "time_series_test_account":"test_password" \\
--data-urlencode 'db=time_series_test_db' \\
--data-urlencode "pretty=true" \\
--data-urlencode 'q=drop measurement car'
DROP DATABASE 
删除数据库,语法格式如下所示:
DROP DATABASE <database_name>
执行方式,如下所示:
curl --get http://${influxdb_ip}:8086/query \\
--user "time_series_test_account":"test_password" \\
--data-urlencode "pretty=true" \\
--data-urlencode 'q=DROP DATABASE time_series_test_db'
返回如下信息,说明删除成功。
{
"results": [
{
"statement_id": 0
}
]
}

更多参考

时序数据库 InfluxDB 版与原生的 InfluxDB 使用相同。具体如何管理数据库,请参见 InfluxDB®️官方文档
时序数据库 InfluxDB 版使用了 InfluxDB 原生 SDK。多语言 SDK 的示例,请参见 InfluxDB®️客户端文档