InfluxDB 與 HTTP 協議交互進階(一)

引言

在當今數字化時代,數據處理的高效性和準確性成為了眾多領域關注的焦點。InfluxDB 作為一款開源的時序數據庫,憑借其高性能、易擴展等特性,在時間序列數據處理中占據了重要地位。而 HTTP 協議作為互聯網應用層的核心協議之一,以其簡單、靈活的特點,為 InfluxDB 與外部系統的交互提供了便利的通道。

通過 HTTP 協議與 InfluxDB 進行交互,我們能夠輕松地實現數據的寫入、查詢、管理等操作 ,這在物聯網、監控系統、金融數據分析等諸多場景中都有著廣泛的應用。例如,在物聯網場景下,大量傳感器產生的實時數據可以通過 HTTP 協議快速寫入 InfluxDB 進行存儲和分析;在監控系統中,通過 HTTP 協議從 InfluxDB 獲取數據,能夠實時展示系統的運行狀態,及時發現潛在問題。

然而,僅僅掌握基礎的交互方式往往難以滿足復雜業務場景的需求。隨著數據量的不斷增長和業務邏輯的日益復雜,深入探究 InfluxDB 與 HTTP 協議交互的進階技巧顯得尤為重要。本文將帶你深入探索這一領域,從優化數據寫入效率到復雜查詢的構建,再到安全與性能的保障,全方位提升你在這方面的能力,助力你在數據處理的道路上更進一步。

InfluxDB 與 HTTP 協議交互基礎回顧

InfluxDB 簡介

InfluxDB 是一款由 InfluxData 公司開發的開源時序數據庫,采用 Go 語言編寫 。它專為處理時間序列數據而設計,在數據的存儲、查詢和分析方面具有顯著優勢。

InfluxDB 具備高性能的讀寫能力,其獨特的 TSM(Time-Structured Merge Tree)存儲引擎,能夠實現高效的數據寫入和查詢,在處理大規模時間序列數據時表現出色。例如,在物聯網場景下,面對海量傳感器產生的高頻數據,InfluxDB 能夠快速地將這些數據寫入數據庫,并在需要時迅速查詢出所需數據。同時,它還支持水平擴展,用戶可以通過增加節點輕松應對不斷增長的數據量,保障系統的高可用性。

此外,InfluxDB 提供了豐富的查詢語言,支持多種強大的查詢操作,如聚合、過濾、時間窗口等,方便用戶對數據進行深入分析。它還允許對 tag 建立索引,實現快速有效的數據查詢,這在需要根據特定標簽篩選數據時非常實用。而且,InfluxDB 支持多種數據采集協議,包括 HTTP、UDP 等,還能與其他數據采集組件良好通訊,并且可以與 Grafana、Prometheus 等數據可視化工具和監控系統集成,為用戶創建監控儀表盤和分析數據提供便利。

由于這些特性,InfluxDB 在多個領域有著廣泛的應用。在物聯網領域,它可以存儲和分析各類傳感器產生的時間序列數據,助力實現設備狀態的實時監控和智能控制;在運維監控方面,能夠有效地處理服務器、網絡設備等產生的監控數據,幫助運維人員及時發現并解決潛在問題,保障系統的穩定運行;在金融領域,可用于存儲和分析交易數據、市場行情數據等,為風險評估、交易策略制定等提供數據支持。

HTTP API 基礎接口回顧

InfluxDB 提供了 HTTP API,允許用戶通過發送 HTTP 請求來與 InfluxDB 進行交互,這使得與外部系統的集成變得輕松便捷。以下是幾個常用接口的回顧:

  • Ping 接口:該接口主要用于檢查 InfluxDB 的狀態或版本信息。使用 GET 或 HEAD 請求方式,URL 為http://<influxdb-host>:8086/ping。例如,當我們想要確認 InfluxDB 服務是否正常運行時,可以向該 URL 發送 GET 請求,如果服務正常,將返回表示服務狀態的響應,這有助于我們快速判斷數據庫服務的可用性,方便在系統集成或日常運維中進行健康檢查。
  • Query 接口:用于查詢數據、管理數據庫、保留策略(Retention Policy,RP)、用戶等操作。支持 GET 和 POST 請求方式,URL 為http://<influxdb-host>:8086/query 。其中,參數db指定數據庫名,這是必選參數,明確了操作所針對的數據庫;q為查詢語句,同樣是必選參數,且需要使用 URL 編碼 。例如,使用curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'",這條命令中,通過 GET 請求向query接口發送查詢,指定了數據庫為mydb,查詢語句是從cpu_load_short測量中篩選出region為us-west的value字段數據。此外,還有其他可選參數,如rp可指定查詢的保留策略,u和p分別用于指定用戶名和密碼進行認證(當 InfluxDB 開啟認證時),precision用于指定時間戳的精度。
  • Write 接口:負責向數據庫中寫入數據,請求方式為 POST,URL 是http://<influxdb-host>:8086/write。參數db指定要寫入的數據庫名,這是必選的;precision指定時間戳的精度,可選,默認是納秒。要寫入的數據格式可以是行協議(Line Protocol)或 JSON 格式 ,當使用 JSON 格式時,需要設置Content-Type: application/json。例如,通過行協議寫入數據,數據格式可能類似cpu_usage,server_id=server001 value=0.75 1620000000000000000,將這樣的數據作為 POST 請求的 body 發送到write接口,就能將數據寫入到指定數據庫中。

這些基礎接口是與 InfluxDB 進行交互的基石,通過它們,我們能夠完成對 InfluxDB 中數據的基本操作,為后續更復雜的業務邏輯和數據處理奠定基礎。

InfluxDB 與 HTTP 協議交互進階操作

復雜數據查詢技巧

在實際應用中,我們常常需要進行復雜的數據查詢,以滿足各種業務需求。下面介紹幾種常見的復雜查詢技巧:

  • 多條件組合查詢:通過WHERE子句組合多個條件進行數據篩選。例如,從temperature測量中篩選出city為Beijing且humidity大于 60 的數據,查詢語句如下:
 

SELECT * FROM "temperature" WHERE "city" = 'Beijing' AND "humidity" > 60

在這個查詢中,AND連接了兩個條件,只有同時滿足city為Beijing和humidity大于 60 的數據才會被返回。如果要表示多個條件中的任意一個滿足即可,可以使用OR關鍵字 。比如,查詢city為Beijing或者city為Shanghai的數據:

 

SELECT * FROM "temperature" WHERE "city" = 'Beijing' OR "city" = 'Shanghai'

  • 跨時間段查詢:使用BETWEEN...AND或者直接比較時間戳來實現跨時間段的數據查詢。假設我們要查詢2024-01-01T00:00:00Z到2024-01-02T00:00:00Z之間的temperature測量數據,查詢語句可以這樣寫:
 

SELECT * FROM "temperature" WHERE time BETWEEN '2024-01-01T00:00:00Z' AND '2024-01-02T00:00:00Z'

也可以使用比較運算符來實現同樣的效果:

 

SELECT * FROM "temperature" WHERE time >= '2024-01-01T00:00:00Z' AND time < '2024-01-02T00:00:00Z'

在實際應用中,還可以結合函數來動態指定時間范圍,比如使用now()函數獲取當前時間,查詢最近 1 小時的數據:

 

SELECT * FROM "temperature" WHERE time >= now() - 1h

  • 使用函數和聚合操作查詢:InfluxDB 提供了豐富的函數用于數據處理和聚合。比如,使用SUM函數計算某個字段的總和,AVG函數計算平均值,COUNT函數統計數據點數量等。以計算temperature測量中value字段的平均值為例,查詢語句如下:
 

SELECT AVG("value") FROM "temperature"

如果要按照city標簽進行分組計算平均值,可以使用GROUP BY子句:

 

SELECT AVG("value") FROM "temperature" GROUP BY "city"

還可以使用FILL函數處理缺失數據,例如將缺失值填充為 0:

 

SELECT AVG("value") FROM "temperature" GROUP BY "city" FILL(0)

此外,還可以嵌套使用函數,實現更復雜的計算。比如,先計算每個city的value總和,再計算所有city總和的平均值:

 

SELECT AVG(subquery.sum_value) FROM (SELECT SUM("value") AS sum_value FROM "temperature" GROUP BY "city") AS subquery

高效數據寫入策略

隨著數據量的不斷增加,優化數據寫入策略對于提高 InfluxDB 的性能至關重要。以下是一些高效的數據寫入策略:

  • 批量寫入:將多個數據點組合成一個批次進行寫入,可以顯著減少網絡傳輸次數和數據庫操作次數,從而提高寫入性能。InfluxDB 的 HTTP API 支持批量寫入,只需要將多個數據點按照行協議或 JSON 格式組織好,作為一次 POST 請求發送到write接口即可。在使用行協議進行批量寫入時,不同的數據點之間用換行符分隔 。例如:
 

cpu_usage,server_id=server001 value=0.75 1620000000000000000

cpu_usage,server_id=server002 value=0.8 1620000001000000000

使用 JSON 格式批量寫入時,數據格式如下:

 

[

{

"measurement": "cpu_usage",

"tags": {

"server_id": "server001"

},

"fields": {

"value": 0.75

},

"time": "2021-05-03T12:00:00Z"

},

{

"measurement": "cpu_usage",

"tags": {

"server_id": "server002"

},

"fields": {

"value": 0.8

},

"time": "2021-05-03T12:00:01Z"

}

]

在實際應用中,可以根據數據生成的頻率和網絡狀況,合理調整批量寫入的數據點數量。一般來說,批量大小在幾百到幾千個數據點之間比較合適,太大可能導致單次寫入失敗時需要重新寫入的數據量過多,太小則無法充分發揮批量寫入的優勢。

  • 優化數據格式
    • 行協議和 JSON 格式選擇:行協議是 InfluxDB 默認的數據寫入格式,它簡潔高效,占用空間小,適合在網絡帶寬有限或對性能要求極高的場景下使用 。JSON 格式則更易于閱讀和編寫,適合在開發調試階段或與其他系統交互時使用。例如,在物聯網設備數據采集場景中,由于設備資源有限,且需要頻繁發送大量數據,使用行協議可以有效減少數據傳輸量和設備功耗;而在數據可視化工具與 InfluxDB 交互時,使用 JSON 格式可以更方便地處理和展示數據。
    • 優化行協議:在使用行協議寫入數據時,應盡量避免不必要的空格和換行符,以減少數據傳輸量。同時,合理選擇時間戳的精度,避免使用過高的精度導致數據量不必要的增加。例如,如果數據的時間精度只需要精確到秒,那么時間戳可以使用秒級別的時間戳,而不是默認的納秒級別。
    • 優化 JSON 格式:對于 JSON 格式的數據,去除冗余字段,只保留必要的字段,可以減少數據大小。例如,如果某些標簽字段在整個數據集中都是固定值,可以考慮在寫入時不包含這些字段,而是在查詢時根據需要進行補充。
  • 設置合理時間戳精度:時間戳精度直接影響數據的存儲大小和查詢性能。如果數據的時間精度要求不高,使用較低的時間戳精度(如秒、分鐘)可以減少數據存儲量,提高寫入和查詢效率。例如,對于一些監控數據,每 5 分鐘采集一次,時間戳精度設置為分鐘即可滿足需求。在寫入數據時,可以通過precision參數指定時間戳精度 。例如,使用秒級精度寫入數據:
 

curl -XPOST 'http://localhost:8086/write?db=mydb&precision=s' --data-binary 'cpu_usage,server_id=server001 value=0.75 1620000000'

安全交互與認證機制

在與 InfluxDB 進行交互時,確保數據的安全性至關重要。InfluxDB 提供了多種安全認證機制,以下是常見的 Token 授權和登錄授權方式:

  • Token 授權
    • 獲取 Token:在 InfluxDB 2.0 及以上版本中,可以通過 InfluxDB 的 Web 界面或 API 創建和管理 Token。在 Web 界面中,登錄后進入 “Data” -> “Tokens” 頁面,可以創建新的 Token,并為其分配相應的權限,如讀取特定桶(bucket)的數據、寫入數據等。通過 API 創建 Token 的示例如下:
 

curl --request POST http://localhost:8086/api/v2/tokens \

--header 'Authorization: Token YOUR_API_TOKEN' \

--header 'Content-Type: application/json' \

--data-raw '{

"description": "My new token",

"orgID": "your_org_id",

"permissions": [

{

"action": "read",

"resource": {

"type": "buckets",

"id": "your_bucket_id"

}

}

]

}'

這里的YOUR_API_TOKEN是具有創建 Token 權限的管理員 Token,your_org_id和your_bucket_id分別是組織 ID 和桶 ID,通過設置permissions字段來指定新 Token 的權限。

  • 設置請求頭攜帶 Token:在發送 HTTP 請求時,將 Token 添加到請求頭的Authorization字段中,格式為Bearer <token>。例如,使用curl命令查詢數據:
 

curl -G 'http://localhost:8086/query?pretty=true' \

--header 'Authorization: Bearer your_token' \

--data-urlencode "db=mydb" \

--data-urlencode "q=SELECT * FROM \"measurement\""

這樣,InfluxDB 會根據 Token 來驗證請求的合法性,并根據 Token 所擁有的權限來處理請求。

  • 登錄授權
    • 原理:InfluxDB 支持用戶名和密碼的登錄授權方式。在啟用認證后,用戶需要提供正確的用戶名和密碼才能訪問 InfluxDB 的 API。用戶名和密碼存儲在 InfluxDB 的用戶表中,通過與用戶表中的記錄進行比對來驗證用戶身份。
    • 流程:首先,需要在 InfluxDB 中創建用戶并設置密碼。例如,使用 InfluxDB 的命令行工具創建一個具有所有權限的管理員用戶:
 

CREATE USER admin WITH PASSWORD 'password' WITH ALL PRIVILEGES

然后,在配置文件中啟用認證功能,一般是將influxdb.conf中的auth-enabled設置為true 。重啟 InfluxDB 服務使配置生效。在發送 HTTP 請求時,可以通過以下幾種方式提供用戶名和密碼:

  • 在 URL 中提供認證參數,例如:
 

curl -G 'http://localhost:8086/query?u=admin&p=password&pretty=true' \

--data-urlencode "db=mydb" \

--data-urlencode "q=SELECT * FROM \"measurement\""

  • 在請求體中提供認證參數,例如:
 

curl -G 'http://localhost:8086/query' \

--data-urlencode "u=admin" \

--data-urlencode "p=password" \

--data-urlencode "db=mydb" \

--data-urlencode "q=SELECT * FROM \"measurement\""

  • 使用命令行工具時,也可以通過環境變量提供用戶名和密碼,例如:
 

export INFLUX_USERNAME=admin

export INFLUX_PASSWORD=password

influx

通過這些安全交互與認證機制,可以有效地保護 InfluxDB 中的數據,防止未經授權的訪問和操作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91001.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91001.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91001.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NAS遠程訪問新解法:OMV與cpolar的技術協同價值

文章目錄前言1. OMV安裝Cpolar2. 配置FTP公網地址3. OMV FTP 配置4. OMV FTP遠程連接前言 當家庭存儲需求突破本地邊界時&#xff0c;傳統NAS方案往往陷入"連接困境"&#xff1a;復雜的端口轉發配置、高昂的公網IP成本、以及始終存在的安全顧慮…開源解決方案OMV雖然…

vue 渲染 | 不同類型的元素渲染的方式(vue組件/htmlelement/純 html)

省流總結&#xff1a;&#xff08;具體實現見下方&#xff09; vue 組件 ——》<component :is組件名> htmlelement 元素 ——》 ref 、★ v-for ref 或是 ★ vue 的 nextTick 純 html 結構——》v-html 另外&#xff0c;當數據異步加載時&#xff0c;vue3中如何渲…

Charles中文版深度解析,輕松調試API與優化網絡請求

在現代軟件開發過程中&#xff0c;調試API、捕獲HTTP/HTTPS流量以及優化網絡性能是開發者不可避免的挑戰。特別是在處理復雜的網絡請求和驗證API接口的數據傳輸準確性時&#xff0c;開發者需要一款強大且易于使用的工具。Charles抓包工具憑借其功能強大、界面簡潔、易于操作的特…

【CF】Codeforces Round 1039 (Div. 2) E1 (二分答案求中位數)

E1. Submedians (Easy Version)題目&#xff1a;思路&#xff1a;經典不過加了點東西對于求中位數&#xff0c;我們必然要想到二分答案&#xff0c;具體的&#xff0c;對于所有大于等于 x 的數我們令其奉獻為 1&#xff0c;小于的為 -1&#xff0c;如果存在某段區間的奉獻和大于…

ESP32-S3學習筆記<8>:LEDC的應用

ESP32-S3學習筆記&#xff1c;8&#xff1e;&#xff1a;LEDC的應用1. 頭文件包含2. LEDC的配置2.1 配置定時器2.1.1 speed_mode/設置速度模式2.1.2 duty_resolution/設置占空比分辨率2.1.3 timer_num/選擇定時器2.1.4 freq_hz/設定PWM頻率2.1.5 clk_cfg/選擇LEDC的外設時鐘源2…

網絡安全第14集

前言&#xff1a;小迪安全14集&#xff0c;這集重點內容&#xff1a;0、什么是js滲透測試&#xff1f;在javascript中也存在變量和函數&#xff0c;存在可控變量和函數就有可能存在在漏洞&#xff0c;js開發的web應用和php、java開發的區別是&#xff0c;js能看得到的源代碼&am…

代碼隨想錄算法訓練營第三十三天

LeetCode.62 不同路徑 題目鏈接 不同路徑 題解 class Solution {public int uniquePaths(int m, int n) {// dp表示到達ij有多少條路徑int[][] dp new int[110][110];dp[1][1] 1;for(int i 0;i<m;i){dp[i][0] 1;}for(int j 0;j<n;j){dp[0][j] 1;}for(int i 1;i…

銀行回單OCR識別技術原理

銀行回單OCR&#xff08;光學字符識別&#xff09;技術通過結合圖像處理、模式識別和自然語言處理&#xff08;NLP&#xff09;技術&#xff0c;將紙質或電子版銀行回單中的非結構化文本&#xff08;如賬號、金額、日期等&#xff09;轉化為結構化數據。以下是其核心原理和關鍵…

Day22-二叉樹的迭代遍歷

昨天學習了遞歸遍歷&#xff1a;遞歸就是一次次的把參數壓入棧中&#xff0c;然后返回的時候還是上一次遞歸保存的參數。今天學習迭代遍歷。迭代遍歷就是用棧去模擬保存二叉樹的節點&#xff0c;然后依次去遍歷&#xff0c;只不過要注意棧的后入先出的規則。前序遍歷&#xff1…

知識蒸餾 - 通過引入溫度參數T調整 Softmax 的輸出

知識蒸餾 - 通過引入溫度參數T調整 Softmax 的輸出 flyfish import torch import torch.nn.functional as F import matplotlib.pyplot as plt import numpy as np# 設置中文字體支持 plt.rcParams["font.family"] [AR PL UMing CN] # Linux plt.rcParams[axes.uni…

Java研學-RabbitMQ(三)

一 消息通信協議 1 AMQP AMQP 是一個開放的、跨語言、跨平臺的消息協議標準&#xff0c;用于在分布式系統中傳遞業務消息。它定義了消息隊列的二進制協議格式和交互模型&#xff08;如交換機、隊列、綁定等&#xff09;&#xff0c;確保不同語言&#xff08;Java、Python、C#等…

http.client 教程-如何使用 Python 標準庫發送 HTTP 請求

http.client 教程-如何使用 Python 標準庫發送 HTTP 請求以下是 http.client 模塊的詳細使用教程&#xff0c;幫助你理解如何使用 Python 標準庫發送 HTTP 請求&#xff1a;1. http.client 概述http.client 是 Python 內置的 HTTP 客戶端庫&#xff0c;提供了底層的 HTTP 協議實…

Android-三種持久化方式詳解

持久化技術分為3種&#xff0c;文件&#xff0c;sharedPreferences存儲&#xff0c;數據庫來存儲&#xff1b; 目錄 文件存儲&#xff1a; 利用SharedPreferences中讀取數據 SQLite創建數據庫 更新 添加 刪除 查找&#xff1a; 文件存儲&#xff1a; 文件存儲是 Andr…

并發安全之鎖機制一

鎖機制一 鎖機制是計算機系統中解決并發沖突的核心工具&#xff0c;其存在和應用場景源于一個根本問題&#xff1a;當多個執行單元&#xff08;線程、進程、分布式節點&#xff09;同時訪問或修改同一份共享資源時&#xff0c;如何保證數據的正確性、一致性和系統可靠性&#x…

結合項目闡述 設計模式:單例、工廠、觀察者、代理

原文鏈接&#xff1a;https://download.csdn.net/blog/column/12433305/133862792#_1613 1、工廠模式應用 C17及之后可編譯 /*日志落地模塊的實現1.抽象落地基類2.派生子類&#xff08;根據不同落地方向進行派生&#xff09;3.使用工廠模式進行創建與表示的分離 */#ifndef _…

uniapp 更新apk有緩存點不動,卸載安裝apk沒有問題。android

方式一。pages.json&#xff1a;"globalStyle" : {"navigationBarTextStyle" : "black","navigationBarTitleText" : "uni-app","navigationBarBackgroundColor" : "#F8F8F8","backgroundColor&qu…

HTML響應式SEO公司網站源碼

核心優勢 100%純HTML/CSS開發自動適配手機/平板/PC內置SEO優化結構0.5秒極速加載 包含頁面 ? 首頁&#xff08;關鍵詞布局優化版&#xff09; ? 服務項目展示頁 ? 客戶案例庫 ? 新聞資訊系統 ? 聯系方式&#xff08;帶地圖API&#xff09; 技術參數 兼容Chrome/Firefo…

Error: llama runner process has terminated: exit status 2

我是i7 12700h ,3080顯卡&#xff0c;在 Windows 11 上運行 ollama run deepseek-r1:1.5b 出現 Error: llama runner process has terminated: exit status 2 之前是好用的&#xff0c;后來不知為什么就不好用了。 原因&#xff1a; 檢查 Microsoft Visual C Redistributab…

Linux中ssh遠程登錄原理與配置

SSH連接的五個階段 1. 版本協商階段&#xff08;Protocol Version Negotiation&#xff09;目的&#xff1a;協商使用SSH-1或SSH-2協議&#xff08;現代系統默認SSH-2&#xff09;。流程&#xff1a;關鍵點&#xff1a;若版本不兼容&#xff08;如客戶端只支持SSH-1&#xff0c…

Kubernetes --存儲入門

一、Volume 的概念對于大多數的項目而言&#xff0c;數據文件的存儲是非常常見的需求&#xff0c;比如存儲用戶上傳的頭像、文件以及數據庫的數據。在 Kubernetes 中&#xff0c;由于應用的部署具有高度的可擴展性和編排能力&#xff08;不像傳統架構部署在固定的位置&#xff…