prometheus將采集到的樣本以時間序列的方式保存在內存(TSDB 時序數據庫)中,並定時保存到硬盤中。與zabbix不同,zabbix會保存所有的數據,而prometheus本地存儲會保存15天,超過15天以上的數據將會被刪除,若要永久存儲數據,有兩種方式,方式一:修改prometheus的配置參數“storage.tsdb.retention.time=10000d”;方式二:將數據引入存儲到Influcdb中。為保證數據安全性,本文主要介紹的是promethues本地存儲備份數據的方法。
一、存儲原理
prometheus 提供了本地存儲(TSDB)時序型數據庫的存儲方式,在2.0版本之后,壓縮數據的能力得到了大大的提升,單節點情況下可以滿足大部分用戶的需求,但本地存儲阻礙了prometheus集群化的實現,因此在集群中應當采用 其他時序性數據來替代,比如influxdb。
prometheus 分為三個部分,分別是:抓取數據、存儲數據和查詢數據。
prometheus按照block塊的方式來存儲數據,每2小時為一個時間單位,首先會存儲到內存中,當到達2小時后,會自動寫入磁盤中。block的目錄結構如下:
chunks 多個,是個目錄、保存timeseries數據 meta.json 配置文件,包含起止時間、包含哪些block index 通過metric名和labels查找時序數據在chunk文件中的位置 tombstones 刪除操作會首先記錄到這個文件
為防止程序異常而導致數據丟失,采用了WAL機制,即2小時內記錄的數據存儲在內存中的同時,還會記錄一份日志,存儲在block下的wal目錄中。當程序再次啟動時,會將wal目錄中的數據寫入對應的block中,從而達到恢復數據的效果。
當刪除數據時,刪除條目會記錄在tombstones 中,而不是立刻刪除。
prometheus采用的存儲方式稱為“時間分片”,每個block都是一個獨立的數據庫。優勢是可以提高查詢效率,查哪個時間段的數據,只需要打開對應的block即可,無需打開多余數據。
目錄結構:
prometheus的存儲層使用了全文檢索中的“倒排索引”概念,將每個時間序列視為一個小文檔。而metric和label對應的是文檔中的單詞。
二、數據備份
1、完全備份
備份prometheus的data目錄可以達到完全備份的目的,但效率較低。
2、快照備份
prometheus提供了一個功能,是通過API的方式,快速備份數據。
實現方式:
首先,修改prometheus的啟動參數,新增以下兩個參數:
--storage.tsdb.path=/usr/local/share/prometheus/data \ --web.enable-admin-api
重啟prometheus
調用API
curl -XPOST http://prometheusIP:端口/api/v1/admin/tsdb/snapshot 返回結果: {"status":"success","data":{"name":"20191220T012427Z-21e0e532e8ca3423"}}
此時,數據將快速的備份到 data/snapshots下。
【注意】上述API還有一個參數
skip_head=<bool> 默認是false 作用:是否跳過存留在內存中還未寫入磁盤中的數據,仍在block塊中的數據
完整的調用方式為:
# 不跳過內存中的數據,即同時備份內存中的數據 curl -XPOST http://127.0.0.1:9090/api/v2/admin/tsdb/snapshot?skip_head=false # 跳過內存中的數據 curl -XPOST http://127.0.0.1:9090/api/v2/admin/tsdb/snapshot?skip_head=true
三、數據還原
利用api方式制作成snapshot后,還原時將snapshot中的文件覆蓋到data目錄下,重啟prometheus即可!
添加定時備份任務(每周日3點備份)
crontable -e #注意時區,修改完時區后,需要重啟 crontab systemctl restart cron 0 3 * * 7 sudo /usr/bin/curl -XPOST -I http://127.0.0.1:9090/api/v1/admin/tsdb/snapshot >> /home/bill/prometheusbackup.log