小 T 導讀:作為地震監測的核心業務單位,中國地震臺網中心承擔著全國乃至全球地震監測任務。在地震發生后,臺網中心的科學家會第一時間進行震源定位并為公眾提供地震速報信息。地震波形數據就是各地震臺站的直接觀測數據。通過對地震波的到時分析地震學家們可以來分析地震發生時間、定位震源、計算震級等。本文介紹一種用時序數據庫TDengine來存儲歸檔地震波形數據的新思路。
業務場景
地震監測業務可簡化成數據采集、數據傳輸和數據處理三部分。其中數據采集使用的設備一般為地震計(可視為特殊的物聯網采集設備),其由多個國家布設在全球各地(如圖1),并7×24小時不間斷測量和記錄當地的地面運動數據供各國使用。采集的數據通過有線或無線網絡傳輸至臺網中心,臺網中心的數據處理軟件采用人工交互處理或自動處理方式對數據進行處理,監測全國和全球的地震活動情況。

近幾年,隨著國家對防震減災要求不斷提高,我國先后實施了多個大型地震監測工程項目,優化和加密觀測臺網和觀測儀器(如地震計),預計未來幾年,用于數據采集的地震計數量將會呈數量級增長,并且隨著物聯網的發展,將會有更多數據接入用于地震監測。因此,原有在單臺機器上運行的地震數據處理軟件(如地震自動測定軟件)的數據處理壓力會越來越大。同時海量數據的匯入,對數據存儲、管理、回溯等都提出了新的要求。
為了解決海量數據處理和存儲的問題,中國地震臺網中心地震科學開放實驗室研發團隊開發了SeisFLINK2地震自動監測系統(如圖2)。SeisFLINK2系統是基于大數據技術構建系統框架,并集成地震專業處理模塊的地震實時流處理平臺。其使用Kafka作為分布式消息交換子系統,實現海量地震數據的接入和交換;使用Ignite作為分布式數據緩存子系統,方便各地震數據處理模塊獲取近線數據用于地震數據處理;使用Flink對海量地震數據流進行實時處理(主要用于震相檢測);正逐步使用TDengine Database替代HBase實現地震數據的存儲和檢索(圖2左下)。

用TDengine Database存儲地震波形數據
我國的地震計一般1秒鐘采集100次地面運動數據(100Hz),并定期(零點幾秒至幾秒)打包后向后方數據服務器傳輸數據,數據一般為國際通用的MiniSeed格式,一個數據包均包含頭文件和數據文件,頭文件包含數據元信息,如地震計所屬臺網、臺站、通道、位置號、采樣率、包數據起始時間和結束時間等。數據文件包括時間段內采樣值。
按照業務需要,我們將MiniSeed數據分兩部分存儲。第一部分我們設計了一張超級表Seismometer,設有兩個字段以及4個標簽,ts為采樣時間,value為采樣值,四個tags分別為地震計對應的臺網、臺站、通道和位置號。我們為每個地震計創建了兩張表(通過超級表創建),一張用于存儲該地震計傳輸回來的數據,地震計的數據包經過解包后把采樣點數據按照時間順序存入該表中(如圖5右側所示)。另一張表記錄每一個數據包的數據起始時間和結束時間。
第二部分對于長期保持不變的元數據信息如某個地震計的采樣率,存儲在固定文件中。這樣做目的是雖然只需利用存儲的采樣值數據就可進行波形顯示,但地震專業分析軟件大多支持MiniSeed格式,因此考慮后續通過讀取上述兩部分數據,將元數據和采樣數據還原成MiniSeed包,供地震專業分析軟件使用。


在數據量方面,一個地震計一般1秒采樣100次,在數據沒有缺失的情況下,一天一張表約存儲8,640,000條記錄,共約5000張表。在這種數據量情況下,經簡單測試,數據檢索效率仍然很快。
在數據寫入方面,采用C接口單線程批量的寫入方式,一條波形一天的數據(17000個數據包)大概20秒就可以寫完。按照接入1000多個臺站計算,每秒就有1000多個包,大概消費時間在1.2秒,通過多線程消費入庫,可比較輕松滿足實時性要求。用Python接口會更方便,我也將從www.iris.edu拉取的地震數據并寫入TDengine的Python程序開源,操作很簡單,開源倉庫地址:
在數據壓縮率方面,由于原有MiniSeed包內數據已進行過壓縮,故原有數據與TDengine數據占用磁盤空間比例約為1:1。TDengine壓縮后的數據文件與未壓縮的原始數據相比,壓縮比大概在9.5%,還是相當優秀的。
集成Grafana做地震數據展示

為了將存入TDengine的地震數據利用起來,我們嘗試利用grafana輔以簡單的消息轉發程序,成功將地震波形數據在grafana上進行顯示。應用場景為在某個地震發生后,在grafana web頁面上自動顯示距震中最近6個臺站(可理解為地震計)的波形數據。首先我們利用一個簡單的python消息轉發程序,在接收到新的地震事件后,計算得出距震中最近的6個臺站,并將臺站名寫入MySQL的waveform_station表中。然后在grafana上配置6個變量用于動態表示6個臺站,變量可定時從Mysql數據庫中讀取臺站名(如圖6)。這樣我們就實現了在grafana中實時地顯示最新地震的最近6個臺站的波形變化,即不僅波形實時變化,各個面板中顯示的臺站也會隨著地震事件而更新(如圖8)。

最后,在grafana input sql中,用變量代表需要在TDengine中查詢的表名,tbname1動態的表示為:seisflink.IU_RAO_00_BHZ(圖7)。


采用TDengine的原因
我們接觸TDengine時間不長,使用它的初衷是通用的大數據軟件(如HBase等)的維護對人員的技術要求較高,不利于我們專業軟件的推廣和使用。同時,使用HBase存儲MiniSeed數據后,按時間、按臺站檢索地震數據的效率并沒有想象中的快。
相比之下,開源版TDengine的安裝包只有不到5MB,對硬件資源也沒有什么硬性要求,安裝部署只需運行一個腳本,十分簡單。對應用而言,TDengine沒有區分歷史和實時數據庫,支持Ad Hoc查詢,并且是SQL語法。這個就大大降低了開發的難度,不需要我們做分庫分表的操作,并且可以做到大量地震波形數據的實時顯示。TDengine的超級表設計也非常適合對各個臺站數據的分片,每個臺站的數據獨立存放在各自的表中,但可以通過超級表統一過濾、查詢,高效方便。
總結與展望
毫無疑問,TDengine是一款非常好的時序數據庫(Time-Series Database)產品,輕量、高效、簡單。經過前期的開發,它可以方便的將地震數據高速入庫并快速地檢索出來。但如果想要在地震業務中更好的得到應用,我們認為還需要在如何更方便的使用TDengine存儲的地震數據上做文章:如何無縫的將地震專業分析軟件與TDengine集成使用?
例如地震行業通用的python工具包obspy,它可通過webservice按時間,按臺站方便的請求MiniSeed數據并實時進行濾波、仿真等數據處理。就像前面提到的,我們后續可能嘗試在obspy的上層做一個數據接口,同樣實現按臺站、按時間從TDengine中獲取采樣點數據并打包成MiniSeed數據,供obspy、sac等地震專業軟件使用。
同時TDengine的許多高級部分我們尚未完全挖掘應用,如流計算,某個時間段的最大值最小值等對我們量取地震波形數據峰值,計算震級等應該會有幫助,簡化我們的開發,以后有機會繼續深入研究和使用。
作者簡介:陳通,中國地震臺網中心地震科學技術開放實驗室高級工程師,主要從事地震監測和地震應急,近年來專注于使用大數據技術來處理和分析地震數據。
原文首發于:



























