Lindorm時序引擎支援六種資料寫入方法:Java Native SDK寫入、行協議寫入、標準SQL寫入、時間序列資料庫TSDB介面寫入(多值寫入和單值寫入)、remote write資料寫入、Flink資料寫入。本文介紹資料寫入的六種方法。
Java Native SDK寫入
Java Native SDK適用於Java開發人員,具體操作,請參見教程:通過Java Native SDK串連並使用Lindorm時序引擎。
Java Native SDK寫入主要有以下優勢:
非同步寫入,寫入無需同步等待。
資料自動攢批,簡化開發流程,提高寫入效率。
串連池管理,底層自動管理串連複用,無建立大量串連的風險。
出錯自動重試,無需業務層重試。
使用自訂傳輸編碼協議,實現高效的資料編解碼。
安全執行緒,業務層無需考慮串連的安全執行緒問題。
支援強、弱、無約束的三種Schema約束策略。
樣本
// 串連地址
String url = "http://ld-bp17j28j2y7pm****-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242";
// 建立用戶端,LindormTSDBClient安全執行緒,可以重複使用,無需頻繁建立和銷毀
ClientOptions options = ClientOptions.newBuilder(url).build();
LindormTSDBClient lindormTSDBClient = LindormTSDBFactory.connect(options);
// 建立資料庫和表
lindormTSDBClient.execute("CREATE DATABASE demo");
lindormTSDBClient.execute("demo","CREATE TABLE sensor (device_id VARCHAR TAG,region VARCHAR TAG,time BIGINT,temperature DOUBLE,humidity DOUBLE,PRIMARY KEY(device_id))");
// 寫入資料
int numRecords = 10;
List<Record> records = new ArrayList<>(numRecords);
long currentTime = System.currentTimeMillis();
for (int i = 0; i < numRecords; i++) {
Record record = Record
.table("sensor")
.time(currentTime + i * 1000)
.tag("device_id", "F07A1260")
.tag("region", "north-cn")
.addField("temperature", 12.1 + i)
.addField("humidity", 45.0 + i)
.build();
records.add(record);
}
CompletableFuture<WriteResult> future = lindormTSDBClient.write("demo", records);
// 處理非同步寫入結果
future.whenComplete((r, ex) -> {
// 處理寫入失敗
if (ex != null) {
System.out.println("Failed to write.");
if (ex instanceof LindormTSDBException) {
LindormTSDBException e = (LindormTSDBException) ex;
System.out.println("Caught an LindormTSDBException, which means your request made it to Lindorm TSDB, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Code: " + e.getCode());
System.out.println("SQL State: " + e.getSqlstate());
System.out.println("Error Message: " + e.getMessage());
} else {
ex.printStackTrace();
}
} else {
System.out.println("Write successfully.");
}
});
// 這裡作為樣本, 簡單同步處理寫入結果
System.out.println(future.join());串連地址的擷取方法,請參見查看串連地址。
行協議寫入
Lindorm時序引擎支援通過InfluxDB®行協議寫入資料。建議非Java應用通過行協議寫入資料。行協議寫入支援設定Schema約束策略,預設設定為弱約束。行協議寫入的具體操作,請參見行協議寫入。
通過行協議寫入時,不同時間精度的資料最終都會轉化成毫秒精度儲存。比毫秒精度更高的資料,寫入時會丟失精度。
樣本
curl -X POST \
'http://ld-bp1489gr5t*****-proxy-tsdb.lindorm.rds.aliyuncs.com:8242/api/v2/write?precision=ms&db=default' \
-d '
sensor7,device_id=F07A1260,region=north-cn temperature=12.1,humidity=45i 1619076780000000000
sensor7,device_id=F07A1260,region=north-cn temperature=13.2,humidity=47i 1619076790000000000
sensor7,device_id=F07A1260,region=north-cn temperature=10.6,humidity=46i 1619076800000000000
sensor7,device_id=F07A1260,region=north-cn temperature=18.1,humidity=44i 1619076780000000000
sensor7,device_id=F07A1260,region=north-cn temperature=19.7,humidity=44i 1619076790000000000
'標準SQL寫入
下表為標準SQL寫入支援的兩種寫入方法。
寫入方式 | 適用情境 | 描述 | 操作文檔 |
JDBC Driver | Java語言的應用開發 | 使用JDBC寫入資料時,需要自己管理串連池或使用Druid管理串連池。 | |
HTTP SQL API | 非Java語言的應用開發 | 時序引擎支援基於HTTP協議的API介面實現SQL互動。 |
時間序列資料庫TSDB的介面寫入
對於時間序列資料庫TSDB的遷移使用者,時序引擎支援使用時間序列資料庫TSDB相容的介面寫入資料。下表為時間序列資料庫TSDB介面寫入的兩種方法。
寫入方法 | 描述 | 操作文檔 |
多值寫入 | 多值寫入使用/api/mput介面寫入資料。Schema約束策略預設為無約束,即不會建立時序資料表,也不支援SQL查詢。如果需要使用SQL查詢資料,您可以在資料寫入前或寫入後手動建表,也可以將資料庫約束原則設定為弱約束,開啟自動建表。 說明 修改Schema約束策略,請參見資料寫入方式與Schema約束的選擇。 | |
單值寫入 | 單值寫入同時也是相容OpenTSDB的寫入,Schema約束策略只能為無約束,即不會自動建立時序資料表、也不支援直接使用SQL查詢資料。不再推薦使用。 |
使用remote write資料寫入
時序引擎可以作為Prometheus的遠端儲存,在資料寫入後,可以使用PromQL來查詢資料。具體操作,請參見通過Prometheus訪問時序引擎。
使用Flink資料寫入
時序引擎支援通過整合Native SDK的Sink外掛程式寫入資料。具體操作,請參見使用Flink寫入時序引擎。