簡介
VictoriaMetrics集群方案,除了有單節點方案的優點以外,還可以做到水平擴容,當有大量數據存儲時,VictoriaMetrics集群方案是個不錯的選擇。
官方建議是100w/s以下的數據點抓取,使用單節點版,單節點版可以省更多的CPU、內存、磁盤資源。
但是,當遇到如下問題可以考慮集群方案:
抓取數據點過高:大於100w/s數據點抓取(如果lable內容過多,會低於這個值)
海量數據存儲:單機磁盤容量已經滿足不了,更長時間的存儲、海量數據存儲需求
要更高性能:要求更高的寫入和查詢性能
原生高可用:VictoriaMetrics集群方案,原生支持高可用
多租戶:想要數據多租戶管理
注意:下面無特殊聲明統一把VictoriaMetrics簡寫成VM。
相對於Thanos,VictoriaMetrics主要是一個可水平擴容的本地全量持久化存儲方案。
下面簡單介紹一下VM集群版各個組件功能,通過這些組件才可以完成VM集群方案。
組件服務和作用:
關於啟動參數:
vmstorage、vminsert、vmselect這三個組件關鍵啟動參數要關注的不多,之后內容會對關鍵參數進行說明。
多租戶
VM集群版支持多租戶概念,可以把不類型的數據,分別放到不同的租戶(命名空間)里,每個租戶通過 accountID 或 accountID:projectID,在請求的url里做區分。其中:
accountID和projectID:是[0 .. 2^32)的任意整數,projectID可不寫,默認0 創建時間:在首次對某個租戶錄入數據時,自動創建 性能:租戶的數量不影響性能,主要取決於所有租戶的活躍總時間序列,每個租戶的數據都均勻分布在后端vmstorage存儲 隔離:不能跨租戶查詢
API示例
API使用方法基本和VM單節點版差不多,主要多了 租戶 和 組件服務名 ,
VM集群版querying API 格式: http://<vmselect>:8481/select/<accountID>/prometheus/<suffix> 下面以查詢主機負載為例,對比區別: # Prometheus&VM單節點 querying API http://127.0.0.1:9090/api/v1/query?query=node_load15 # VM集群版 querying API http://127.0.0.1:8481/select/6666/prometheus/api/v1/query?query=node_load15
副本、分片以及HA
4.1實現方式
此處是本文的重點!請多看幾遍。
VM集群版,可以實現副本和分片功能,來保證數據的冗余和水平擴容。主要是VM集群版的幾個組件服務配合實現。
vmagent:target均攤和自身冗余抓取功能
1)vmagent:target均攤和自身冗余抓取功能 promscrape.cluster.membersCount,指定target被vmagent分成多少抓取組 promscrape.cluster.memberNum,指定當前vmagent,抓取指定target分組 promscrape.cluster.replicationFactor,單target被多少個vmagent抓取,這里會產生冗余數據,此參數主要是為了保證vmagent的高可用 2)vminsert:按算法為固定時間序列選擇后端存儲(分片) 和 控制副本數量(副本) replicationFactor,開啟副本,並控制副本數量,既 要往多少個vmstorage插入同一份樣本數據 3)vmstorage:數據存儲,vmstorage節點間不進行任何交互,都是獨立的個體,只靠上層的vminsert,產生副本和分片 dedup.minScrapeInterval,vmagent會產生replicationFactor份冗余數據,需要此參數,來去除重復數據 4)vmselect:數據匯總以及返回,當vminsert開啟副本后,vmselect必須設置dedup.minScrapeInterval dedup.minScrapeInterval,去除指定時間的重復數據, replicationFactor,當replicationFactor=N,在出現最多N-1個vmstorage不可用或者響應慢時,vmselect查詢直接忽略,提升了查詢效率
注意:
開啟副本或修改副本個數(replicationFactor簡稱RF)后,可能造成數據部分丟失。
下面展示沒開副本之前已在收集數據,開了副本之后(RF=2),並且vmselect指定replicationFactor參數,
vmselect會當成所有數據都是有副本的,但是 RF=2 之前有一段時間是未開副本收集數據的。
當查 t之前 的series1數據時,1節點 突然故障或者響應慢了,vmselect會認為 2節點有副本數據,其實 t之前 是沒有開副本的,所以會導致 series1 丟失 1節點 的數據。如下圖:
4.2 分組與分片原理
1)分片
如果vminsert后面存在多個vmstorage,vminsert就會對數據進行分片(或者說打散),vminsert主要通過一致性哈希選擇vmstorage節點,具體實現如下代碼:
https://github.com/VictoriaMetrics/VictoriaMetrics/blob/38065bec7b1f7d5880f9e0080093cdee6778013b/app/vminsert/netstorage/insert_ctx.go#L158
2)分組
vmagent分組方式,通過vmagent傳入的4個參數標識集、組成員總數、當前成員編號、副本數 ,進行判斷,是否為當前vmagent要抓取的target,具體實現方式如下代碼:
https://github.com/VictoriaMetrics/VictoriaMetrics/blob/f77dde837a043da1e628dd4390da43f769d7621a/lib/promscrape/config.go#L936
安全認證
目前只有vmagent有自帶了httpAuth.username、httpAuth.password的基礎認證方式,但最需要有認證功能的vmselect、vminsert、vmstorage卻沒有,尤其是存在vmui的vmselect。
官方給出的解釋是,vmselect、vminsert、vmstorage,一般是在上層就把權限認證解決了,而且因為多租戶,每個租戶都應該有自己的賬號密碼,所以沒有做全局的基礎賬號認證,而且也不打算開發。
官方有個vmauth,認證模式比較簡單,而且還需要用賬號名稱做路由標識,沒法用同一個賬號訪問多個組件服務,目前還是建議用nginx做基礎賬號認證。
可參考issues:
https://github.com/VictoriaMetrics/VictoriaMetrics/issues/456
安裝步驟
下面簡單演示一下搭建VM集群版的簡略步驟:
# 配置變量 VM_HOME='/data/victoria-metrics' MEM_LIMIT='128MB' #內存使用限制 VMSOTRAGE_PORT='8482' #vmstorage監聽端口 VMSOTRAGE_INSERT_PORT='8400' #vmstorage對vminsert提供服務的監聽端口 VMSOTRAGE_SELECT_PORT='8401' #vmstorage對vmselect提供服務的監聽端口 VMINSERT_PORT='8480' #vminsert監聽端口 VMSELECT_PORT='8481' #vmselect監聽端口 VMAGENT_PORT='8429' #vmagent監聽端口 REPLICATION_COUNT='2' #副本數 SELECT_STORAGE_NODE_LIST='' INSERT_STORAGE_NODE_LIST='' NODE_LIST='192.168.1.100,192.168.1.101,192.168.1.102,192.168.1.103' for NODE_IP in $(echo ${NODE_LIST} | awk '{split($0,arr,",");for(i in arr) print arr[i]}') do INSERT_STORAGE_NODE_LIST="${INSERT_STORAGE_NODE_LIST}\"${NODE_IP}:${VMSOTRAGE_INSERT_PORT}\"," SELECT_STORAGE_NODE_LIST="${SELECT_STORAGE_NODE_LIST}\"${NODE_IP}:${VMSOTRAGE_SELECT_PORT}\"," done # 創建程序目錄 mkdir -p ${VM_HOME}/{bin,logs,data,config} # 啟動vmstorage服務(所有節點運行) nohup ${VM_HOME}/bin/vmstorage -retentionPeriod=365d \ -storageDataPath=${VM_HOME}/data/vmstorage \ -memory.allowedBytes=${MEM_LIMIT} \ -httpListenAddr=":${VMSOTRAGE_PORT}" \ -vminsertAddr=":${VMSOTRAGE_INSERT_PORT}" \ -vmselectAddr=":${VMSOTRAGE_SELECT_PORT}" \ -dedup.minScrapeInterval=30s \ > ${VM_HOME}/logs/vmstorage.log 2>&1 & # 啟動vminsert服務(所有節點運行) nohup ${VM_HOME}/bin/vminsert -replicationFactor=2 \ -storageNode=${INSERT_STORAGE_NODE_LIST} \ -memory.allowedBytes=${MEM_LIMIT} \ -httpListenAddr=":${VMINSERT_PORT}" \ > ${VM_HOME}/logs/vminsert.log 2>&1 & # 啟動vmselect服務(所有節點運行) nohup ${VM_HOME}/bin/vmselect -dedup.minScrapeInterval=30s \ -replicationFactor=${REPLICATION_COUNT} \ -storageNode=${SELECT_STORAGE_NODE_LIST} \ -memory.allowedBytes=${MEM_LIMIT} \ -httpListenAddr=":${VMSELECT_PORT}" \ > ${VM_HOME}/logs/vmselect.log 2>&1 & # 啟動vmagent服務(所有節點運行) VM_INSERT_URL="http://localhost:${VMINSERT_PORT}" ACCOUNT_ID='6666' #租戶ID MEMBER_NUM=0~3 #每個節點不一樣,取值范圍0~(membersCount-1) nohup ${VM_HOME}/bin/vmagent -promscrape.cluster.membersCount=4 \ -promscrape.cluster.memberNum=${MEMBER_NUM} \ -promscrape.cluster.replicationFactor=${REPLICATION_COUNT} \ -promscrape.suppressScrapeErrors \ -remoteWrite.tmpDataPath=${VM_HOME}/data/vmagent \ -remoteWrite.maxDiskUsagePerURL=1GB \ -memory.allowedBytes=${MEM_LIMIT} \ -httpListenAddr=":${VMAGENT_PORT}" \ -promscrape.config=${VM_HOME}/config/prometheus.yml \ -remoteWrite.url=${VM_INSERT_URL}/insert/${ACCOUNT_ID}/prometheus/api/v1/write \ > ${VM_HOME}/logs/vmagent.log 2>&1 &
可訪問如下地址,進入vmui界面:
http://192.168.1.100:8481/select/6666/vmui
至此,VM集群搭建完成,並可以通過vmui進行數據簡單性能數據查看。
擴容方案
當VM集群遇到瓶頸,無非就如下幾種場景,可根據情況進行擴容:
查詢速度過慢:vmselect為無態服務,配置信息都一樣,直接擴容,即可解決此問題。 數據錄入慢:vminsert和vmselect一樣,直接擴容即可。 容量不足:vmstorage水平擴容來解決此問題,因為vmstorage是有態服務,擴容要配合上游組件服務一起。vmstorage各節點配置一樣,直接擴容即可。同時需要把上游的vmselect和vminsert的存儲列表(-storageNode)進行更新,然后全部重啟。 抓取樣本量過大:擴容vmagent即可,但需要重新分配所有vmagent對target的分組參數,-promscrape.cluster.membersCount=N 增加總分組數,-promscrape.cluster.memberNum=(0~N-1) 當前vmagent節點所在分組號,修改完后重啟所有vmagent。 VM集群版的好處就是靈活,哪里性能不行擴哪里,那種類型組件服務運行在哪類主機上,充分利用系統資源。
failover處理
VM集群版,各類組件服務故障后,怎么能夠實現故障處理?下面針對關鍵組件,逐一分析一下:
資源規划
VM集群各個組件,可根各自特點放到合適的硬件設備上,充分發揮硬件能力。
根據業務監控量,可簡單預估一下需要CPU和內存資源情況:
注:上面只是預估,建議上線之前,還是要根據自己業務類型進行測試,並擴充資源,直到集群變的穩定。
總結
本文主要帶大家了解VictoriaMetrics集群方案,並能簡單搭建和使用。相對於VictoriaMetrics單節點方案,集群方案架構復雜度更高,但是它可以帶來更靈活的使用方式,更好的擴展,容納更大的數據量,以及更高的資源利用率。
總的來說,當業務用VictoriaMetrics/Prometheus單節點遇到性能、容量、成本等等問題時,VictoriaMetrics集群方案也許能解決你的痛點,為業務帶來更高效、穩定的數據展示。
參考資料:
原文鏈接:https://blog.csdn.net/ZVAyIVqt0UFji/article/details/122422129
https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html
https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1207
https://www.joyk.com/dig/detail/1558605608214852?page=3