官方资料:
- https://docs.influxdata.com/influxdb3/core/get-started/
- https://docs.influxdata.com/influxdb3/core/visualize-data/
- https://superset.apache.org/docs/intro
- 关于开源版的72小时限制 https://www.influxdata.com/blog/influxdb3-open-source-public-alpha-jan-27/
1. 安装
1.1. 使用docker安装
1.1.1. 拉取镜像
目前dockerhub无该版本镜像,需要使用quay.io的仓库下载
docker pull quay.io/influxdb/influxdb3-core
0623更新:docker pull influxdb:3-core
https://quay.io/repository/influxdb/influxdb3-core?tab=tags
20250423更新
1.1.2. 启动
# FILESYSTEM USING DOCKER
# Create a mount
# Provide the mount path
docker run -d --name influxdb3 \
-p 8181:8181 \
-v /data/influxdb3:/data/influxdb3 \
quay.io/influxdb/influxdb3-core:latest serve \
--node-id local01 \
--object-store file \
--data-dir /data/influxdb3
报错提示PermissionDenied
解决:检查挂载目录是否有足够权限。/data/influxdb3(执行chmod 777 influxdb3)
启动成功,端口为8181
8181 端口,这是 influxdb3 服务器默认的 HTTP 连接端口。也可以映射到其他端口
创建权限token(可选)
influxdb3 create token --admin \
--host http://localhost:8181
记录返回的token
apiv3_TV_Hk_Sf0pC0Hew8oN0774hWu971HVMRChp10hTYK-LWk4gHW-z-igH9lhZztlq0cOIiQz-3HkRbYoF2AtKQhQ
写入数据
influxdb3 write \
--database mydb \
--token apiv3_TV_Hk_Sf0pC0Hew8oN0774hWu971HVMRChp10hTYK-LWk4gHW-z-igH9lhZztlq0cOIiQz-3HkRbYoF2AtKQhQ \
--precision ns \
--accept-partial \
'cpu,host=Alpha,region=us-west,application=webserver val=1i,usage_percent=20.5,status="OK"
cpu,host=Bravo,region=us-east,application=database val=2i,usage_percent=55.2,status="OK"
cpu,host=Charlie,region=us-west,application=cache val=3i,usage_percent=65.4,status="OK"
cpu,host=Bravo,region=us-east,application=database val=4i,usage_percent=70.1,status="Warn"
cpu,host=Bravo,region=us-central,application=database val=5i,usage_percent=80.5,status="OK"
cpu,host=Alpha,region=us-west,application=webserver val=6i,usage_percent=25.3,status="Warn"'
查询数据
influxdb3 query \
--database mydb
--token "apiv3_w-9sdjqe780PfnT5KT0nHaRqDtk8UEze6sMIzEkkvsd273Y1J5QYWQC-cV33ToZ1nb8cUs_INTcABJAgcGMuCQ"
"SELECT * FROM cpu WHERE time >= now() - interval '5 minutes'"
1.2. UI界面-influxdb3-explorer
拉取镜像
docker pull quay.io/influxdb/influxdb3-explorer:latest
创建挂载目录
https://docs.influxdata.com/influxdb3/explorer/
mkdir -m 700 /opt/influxdb3-explorer/db
mkdir -m 755 /opt/influxdb3-explorer/config
mkdir -m 755 /opt/influxdb3-explorer/ssl
docker run --detach \
--name influxdb3-explorer \
--publish 8086:80 \
--publish 8889:8888 \
--volume /opt/influxdb3-explorer/config:/app-root/config:ro \
--volume /opt/influxdb3-explorer/db:/db:rw \
--volume /opt/influxdb3-explorer/ssl:/etc/nginx/ssl:ro \
quay.io/influxdb/influxdb3-explorer:latest \
--mode=admin
--mode参数:
- Query mode (default): 只读
- Admin mode: 允许全部操作
访问http://localhost:8086并配置连接信息
注意:由于是容器部署,localhost是influxdb3-explorer自身所在容器的位置,肯定是访问不到influxdb3 serve服务的。
进入查询页面
通过【view code】可以很方便看到当前查询语句多种不同用法下的样式(记一下:可以考虑开发一个idea插件)
2. 使用
2.1. 查询
还有一种是“使用 InfluxQL 和 HTTP API 查询”具体看官方文档:
https://docs.influxdb.org.cn/influxdb3/core/query-data/execute-queries/influxdb-v3-api/
使用 SQL 和 HTTP API 查询
将 /api/v3/query_sql 端点与 GET 或 POST 请求方法一起使用。
- GET:在 URL 查询字符串中传递参数(用于简单查询)
- POST:在 JSON 对象中传递参数(用于复杂查询和代码可读性)
包括以下参数
- q: (必需) 要执行的 SQL 查询。
- db: (必需) 要对其执行查询的数据库。
- params: 包含要在参数化查询中使用的参数的 JSON 对象。
- format: 响应的格式 (json, jsonl, csv, pretty, 或 parquet)。 JSONL (jsonl) 是首选格式,因为它将结果流式传输回客户端。 pretty 用于人类可读的输出。 默认值为 json。
2.1.1. 使用get
curl --get http://localhost:18181/api/v3/query_sql \
--header "Authorization: Token apiv3_TV_Hk_Sf0pC0Hew8oN0774hWu971HVMRChp10hTYK-LWk4gHW-z-igH9lhZztlq0cOIiQz-3HkRbYoF2AtKQhQ" \
--data-urlencode "db=mydb" \
--data-urlencode "q=SELECT * FROM cpu" \
--data-urlencode "format=jsonl"
注意:format参数用于控制响应格式 (json, jsonl, csv, pretty, 或 parquet)。 JSONL (jsonl) 是首选格式,因为它将结果流式传输回客户端。 pretty 用于人类可读的输出。 默认值为 json。
如下各种不同情况的对比
2.1.2. 使用post
“--data”
curl http://localhost:18181/api/v3/query_sql \
--header "Authorization: Token apiv3_TV_Hk_Sf0pC0Hew8oN0774hWu971HVMRChp10hTYK-LWk4gHW-z-igH9lhZztlq0cOIiQz-3HkRbYoF2AtKQhQ" \
--data '{"db": "mydb", "q": "select * from cpu limit 5", "format": "jsonl"}'
同“--json”
curl http://localhost:18181/api/v3/query_sql \
--header "Authorization: Token apiv3_TV_Hk_Sf0pC0Hew8oN0774hWu971HVMRChp10hTYK-LWk4gHW-z-igH9lhZztlq0cOIiQz-3HkRbYoF2AtKQhQ" \
--json '{"db": "mydb", "q": "select * from cpu limit 5", "format": "jsonl"}'
获得响应结果
2.2. 客户端集成
https://docs.influxdata.com/influxdb3/core/reference/client-libraries/
使用 InfluxDB 3 客户端库
我们建议使用 InfluxDB 3 客户端库 将 InfluxDB 3 与您的应用程序代码集成。客户端库封装了 Apache Arrow Flight 客户端,并为 写入、查询 和处理存储在 InfluxDB 3 Core 中的数据提供了便捷的方法。
2.2.1. Arrow Flight RPC(Java Flight SQL)
https://docs.influxdata.com/influxdb3/core/reference/client-libraries/flight/java-flightsql/
2.2.2. V3 cient libraries(Java客户端库)
https://docs.influxdata.com/influxdb3/core/reference/client-libraries/v3/java/
目前最新为1.0.0
https://github.com/InfluxCommunity/influxdb3-java/
<dependency>
<groupId>com.influxdb</groupId>
<artifactId>influxdb3-java</artifactId>
<version>1.0.0</version>
</dependency>
示例
package com.influxdata.demo;
import com.influxdb.v3.client.InfluxDBClient;
import com.influxdb.v3.client.Point;
import com.influxdb.v3.client.query.QueryOptions;
import com.influxdb.v3.client.query.QueryType;
import java.time.Instant;
import java.util.stream.Stream;
public class HelloInfluxDB {
private static final String HOST_URL = "https://localhost:8181"; // your cluster URL
private static final String DATABASE = "DATABASE_NAME"; // your InfluxDB database name
private static final char[] TOKEN = System.getenv("DATABASE_TOKEN"); // a local environment variable that stores your database token
// Create a client instance that writes and queries data in your database.
public static void main(String[] args) {
// Instantiate the client with your InfluxDB credentials
try (InfluxDBClient client = InfluxDBClient.getInstance(HOST_URL, TOKEN, DATABASE)) {
writeData(client);
queryData(client);
}
catch (Exception e) {
System.err.println("An error occurred while connecting to InfluxDB!");
e.printStackTrace();
}
}
// Use the Point class to construct time series data.
private static void writeData(InfluxDBClient client) {
Point point = Point.measurement("temperature")
.setTag("location", "London")
.setField("value", 30.01)
.setTimestamp(Instant.now().minusSeconds(10));
try {
client.writePoint(point);
System.out.println("Data is written to the database.");
}
catch (Exception e) {
System.err.println("Failed to write data to the database.");
e.printStackTrace();
}
}
// Use SQL to query the most recent 10 measurements
private static void queryData(InfluxDBClient client) {
System.out.printf("--------------------------------------------------------%n");
System.out.printf("| %-8s | %-8s | %-30s |%n", "location", "value", "time");
System.out.printf("--------------------------------------------------------%n");
String sql = "select time,location,value from temperature order by time desc limit 10";
try (Stream<Object[]> stream = client.query(sql)) {
stream.forEach(row -> System.out.printf("| %-8s | %-8s | %-30s |%n", row[1], row[2], row[0]));
}
catch (Exception e) {
System.err.println("Failed to query data from the database.");
e.printStackTrace();
}
}
}
注意:关于arrow和jdk兼容性
https://arrow.apache.ac.cn/docs/java/install.html#id3
java命令中需要添加参数 --add-opens=java.base/java.nio=ALL-UNNAMED
3. 示例数据
https://docs.influxdata.com/influxdb3/core/reference/sample-data/#home-sensor-data
4. Parquet存储文件
当infludb3设置为文件存储模式,会已parquet文件存储数据。到数据目录下,可以看到已经按每10分钟生成了持久化的parquet文件。
4.1. 关于生成parquet的条件和规则
InfluxDB 3 Core 会定期快照 WAL(Write-Ahead Log)并将其持久化为 Parquet 文件。默认情况下,服务器会缓冲最多 900 个 WAL 文件(相当于 15 分钟的数据),并尝试持久化最旧的 10 分钟数据,同时保留最近的 5 分钟数据。如果你写入的数据量非常小,可能不足以触发快照操作。你可以尝试以下方法:
- 增加数据写入量:写入更多的数据,以确保有足够的数据量触发快照操作。
- 调整快照间隔:通过配置 wal-snapshot-size 参数,减少触发快照的 WAL 文件数量。例如,将 wal-snapshot-size 设置为 300,可以更频繁地触发快照
参考:
https://docs.influxdb.org.cn/influxdb3/core/reference/config-options/
https://docs.influxdata.com/influxdb3/core/reference/config-options/