Postgresql

帶有本地緩衝區的遠端 PostgreSQL 數據庫……它看起來怎麼樣

  • August 5, 2020

我有一個感測器在遠端位置生成一個數據向量,比如說每秒(最多可調整到每秒 100 個向量)。該位置有 4G 調製解調器來發送數據。由於功率限制,我選擇使用 Raspberry Pi 3+ 從感測器接收數據,對其進行解碼並將其發送到我的 VPS 伺服器。

在我執行 Ubuntu 18.04 的伺服器上,我在 PostgreSQL 之上安裝了 TimescaleDB,這是處理時間序列數據的一個很好的組合,我想將感測器數據儲存在其中,然後在我的網站上發布。我很想听聽您對數據流的看法,我有一些問題。

  1. 將感測器數據從 RPi 插入伺服器數據庫的最佳方法是什麼?使用我的 C 軟體中的 libpq 庫直接從 RPi 插入它們是否可以保存,或者我應該以不同的方式將數據傳輸到伺服器,然後將數據插入伺服器端的數據庫中?
  2. 在 RPi 方面,我希望有一個本地緩衝區,以防止與伺服器的連接中斷時失去數據。我可以簡單地在我的 C 程序或命名管道中使用循環緩衝區,或者我可以在本地安裝 PostgreSQL/TimescaleDB,在那裡插入數據,然後使用 postgres_fdw 或 dblink 將數據從那里傳輸到我的伺服器數據庫並從我的本地數據庫。你有什麼建議?

我認為在 RPi 上安裝 Postgres 太過分了。

在純文字文件中緩衝感測器數據就足夠了。該過程可能類似於:

  1. 將感測器數據發送到文本文件(附加模式)
  2. 有一個每 x 分鐘執行一次的 cron 作業。這將重命名文本文件作為第一步。這使得 1. 在處理“舊”文件時創建一個新的文本文件
  3. copy ... from stdin使用內部事務將文本文件的內容髮送到 Postgres 伺服器。如果失敗(連接問題),請重試直到成功。
  4. 刪除剛剛發送到伺服器的文件。或者將其保留為存檔/備份 - 這將需要在 2. 中創建一個文件名,這是唯一的,例如通過附加時間戳。

使用copy .. from stdin比執行多個單行 INSERT 語句更有效。並且仍然比執行單個多行 INSERT 語句更有效。此外,該文件還充當您想要的緩衝區。

引用自:https://dba.stackexchange.com/questions/273226