擴(kuò)展物聯(lián)網(wǎng)監(jiān)控和可觀察性解決方案
本文討論了物聯(lián)網(wǎng)中監(jiān)控和可觀察性的要點(diǎn)。主要介紹了如何利用日志、指標(biāo)、跟蹤和結(jié)構(gòu)化事件來(lái)增強(qiáng)物聯(lián)網(wǎng)系統(tǒng)的可觀察性。操作數(shù)以萬(wàn)計(jì)的物聯(lián)網(wǎng)設(shè)備也不例外。擴(kuò)展物聯(lián)網(wǎng)可觀察性解決方案可能很快導(dǎo)致可觀察性基礎(chǔ)設(shè)施的性能不足和難以承受的成本。因此,本文將側(cè)重于處理大規(guī)模。
將討論一些技術(shù),這些技術(shù)可以幫助您平衡物聯(lián)網(wǎng)擴(kuò)展帶來(lái)的權(quán)衡:
選擇高性能數(shù)據(jù)庫(kù)
知道要收集什么數(shù)據(jù),現(xiàn)在將所有數(shù)據(jù)轉(zhuǎn)儲(chǔ)到MySQL中,就可以開(kāi)始觀察。不要這么快,這可能不是最好的主意,有幾個(gè)原因。將查看對(duì)數(shù)據(jù)庫(kù)的需求,然后建議一種能夠更好地滿足對(duì)物聯(lián)網(wǎng)擴(kuò)展需求的存儲(chǔ)。
首先,讓修改存儲(chǔ)物聯(lián)網(wǎng)可觀察性數(shù)據(jù)的幾個(gè)特征:
- 查詢速度很重要。在處理生產(chǎn)中斷時(shí),最不希望的就是等待幾分鐘,直到調(diào)試查詢完成。
- 將處理多維度和高基數(shù)。大量的維度來(lái)自于捕獲操作的許多屬性以應(yīng)對(duì)未知條件的想法。此外,還有一些重要的列具有高基數(shù)(列中唯一值的數(shù)量),例如設(shè)備Id。
- 需要有效地跨所有維度進(jìn)行查詢。在調(diào)試特定問(wèn)題時(shí),不知道哪些屬性是重要的。
- 通常會(huì)對(duì)來(lái)自有限時(shí)間范圍的數(shù)據(jù)感興趣。時(shí)間范圍通常對(duì)應(yīng)于您觀察到系統(tǒng)服務(wù)降級(jí)的時(shí)間段。
通用SQL數(shù)據(jù)庫(kù)可能不夠
可能都熟悉SQL數(shù)據(jù)庫(kù),因此很自然地將其視為存儲(chǔ)可觀察性數(shù)據(jù)的地方。然而,幾個(gè)技術(shù)方面使得SQL數(shù)據(jù)庫(kù)不適合存儲(chǔ)大規(guī)模的可觀察性數(shù)據(jù)。
傳統(tǒng)的面向行數(shù)據(jù)庫(kù),如MySQL或PostgreSQL,在只需要列的子集時(shí),很難有效地處理對(duì)多維表的查詢。
高維的另一個(gè)問(wèn)題是難以實(shí)現(xiàn)有效的索引。不能事先為列子集創(chuàng)建數(shù)據(jù)庫(kù)索引,因?yàn)椴恢涝诠收吓懦^(guò)程中哪些維度是重要的。因此,要么需要索引所有列(這將非常昂貴),要么在基于未索引列進(jìn)行過(guò)濾時(shí)查詢將很慢。
此外,如果沒(méi)有明確的基于時(shí)間的數(shù)據(jù)分區(qū),通常就沒(méi)有有效的方法來(lái)丟棄舊數(shù)據(jù)。時(shí)間分區(qū)允許在數(shù)據(jù)過(guò)時(shí)時(shí)有效地刪除大塊數(shù)據(jù)。
如果出于合理的動(dòng)機(jī)使用傳統(tǒng)的SQL數(shù)據(jù)庫(kù)來(lái)處理可觀察性數(shù)據(jù),您可能需要考慮Timescale。它是一個(gè)PostgreSQL擴(kuò)展,在使用基于行的SQL模型的同時(shí),通過(guò)時(shí)間分區(qū)和更好的壓縮解決了上面提到的一些挑戰(zhàn)。
用于物聯(lián)網(wǎng)擴(kuò)展的信號(hào)特定存儲(chǔ)
將可觀測(cè)信號(hào)分類(lèi)為度量、日志和軌跡導(dǎo)致了針對(duì)每種信號(hào)類(lèi)型定制的專(zhuān)用存儲(chǔ)的發(fā)展。例如,Mimir用于度量,Loki用于日志,Tempo/Jaeger用于跟蹤。這些存儲(chǔ)中的每一個(gè)都是用特定的信號(hào)類(lèi)型創(chuàng)建的,這使得它們能夠有效地監(jiān)視特定信號(hào)中的用例。但是,跨這些存儲(chǔ)查詢數(shù)據(jù)可能比較麻煩。
此外,某些存儲(chǔ)有一些特定的限制。例如,傳統(tǒng)的時(shí)間序列數(shù)據(jù)庫(kù)(tsdb,如Mimir)不能處理高基數(shù)的數(shù)據(jù)。tsdb為每個(gè)唯一的屬性集存儲(chǔ)單獨(dú)的時(shí)間序列。這種方法在維數(shù)有限和基數(shù)較低的情況下非常有效,因?yàn)樵趩蝹€(gè)時(shí)間序列中編寫(xiě)和查詢非常高效。
但是,對(duì)于高基數(shù),數(shù)據(jù)庫(kù)需要經(jīng)常創(chuàng)建新系列,因?yàn)樗?jīng)常遇到唯一的屬性組合。因此,在檢索聚合值時(shí),數(shù)據(jù)庫(kù)需要遍歷每個(gè)時(shí)間序列,從而使操作效率低下。這個(gè)問(wèn)題在物聯(lián)網(wǎng)領(lǐng)域尤為嚴(yán)重。
使用面向列的分時(shí)存儲(chǔ)以獲得最佳可擴(kuò)展性
隨著對(duì)與類(lèi)似的分析工作負(fù)載的需求不斷增加(如上所述),新的數(shù)據(jù)庫(kù)浪潮出現(xiàn)了。它們采用列式存儲(chǔ),這使得讀取操作更高效,因?yàn)樗鼈冎唤佑|特定查詢所需的列。由于采用了時(shí)間分區(qū),數(shù)據(jù)庫(kù)可以將讀取操作限制在有限的數(shù)據(jù)范圍內(nèi),從而使查詢更加高效。
這些設(shè)計(jì)選擇的組合也使壓縮工作更快,因?yàn)樗惴ㄔ谑軙r(shí)間范圍限制的單列上操作。這類(lèi)存儲(chǔ)的典型例子包括InfluxDB、QuestDB和ClickHouse。
數(shù)據(jù)采樣
在一定規(guī)模上,收集和存儲(chǔ)設(shè)備產(chǎn)生的每個(gè)可觀察信號(hào)變得難以忍受。值得慶幸的是,這通常是不必要的,因?yàn)槟恍枋褂靡恍〔糠挚捎^察性數(shù)據(jù)就可以成功地調(diào)試問(wèn)題。
例如,描述成功場(chǎng)景的事件通常不如描述失敗的事件重要。這就是為什么可以拋棄大多數(shù)這些事件,只存儲(chǔ)少數(shù)具有足夠代表性的例子來(lái)重建特定的歷史情況。
存在各種采樣策略,以確保只收集有限數(shù)量的事件,同時(shí)仍然保留足夠的細(xì)節(jié)。選擇符合你具體需求的抽樣方法是很重要的。工具庫(kù),如OpenTelemetrysdk,通常提供這種采樣策略的實(shí)現(xiàn)。這使得取樣成為降低儲(chǔ)存和處理成本的一種相對(duì)簡(jiǎn)單的方法。
在跟蹤的背景下,根據(jù)采樣決策的位置區(qū)分了物聯(lián)網(wǎng)擴(kuò)展的兩種采樣:頭采樣和尾采樣。頭部采樣決定是否在設(shè)備上對(duì)跨度/軌跡進(jìn)行采樣,而尾部采樣則在收集到特定軌跡的所有跨度后做出此決定。
頭部采樣的主要優(yōu)點(diǎn)是簡(jiǎn)單和成本效益。它減少了在物聯(lián)網(wǎng)環(huán)境中可能受到限制的網(wǎng)絡(luò)流量,并避免在可觀察的后端存儲(chǔ)和處理未采樣數(shù)據(jù)。
但是,如果您希望基于整個(gè)跟蹤做出抽樣決策,則尾部抽樣是必要的。如果您希望對(duì)錯(cuò)誤的跟蹤進(jìn)行采樣,而不是對(duì)成功的跟蹤進(jìn)行采樣,那么這種方法非常有用。
建立保留策略
可觀察性數(shù)據(jù)往往會(huì)隨著時(shí)間的推移而迅速失去價(jià)值。今天收到的遙測(cè)數(shù)據(jù)通常比去年的數(shù)據(jù)更有價(jià)值。這為提供了另一種顯著削減存儲(chǔ)成本的方法。
保留策略允許在指定時(shí)間范圍內(nèi)自動(dòng)刪除數(shù)據(jù)?;跁r(shí)間的分區(qū)簡(jiǎn)化了保留策略的實(shí)現(xiàn),這就是許多現(xiàn)代數(shù)據(jù)庫(kù)開(kāi)箱即用的原因。
另一種策略是利用分層存儲(chǔ)。也就是說(shuō),將舊數(shù)據(jù)存儲(chǔ)在低成本的對(duì)象存儲(chǔ)(如AmazonS3或AzureBlobStorage)中。盡管從這些存儲(chǔ)進(jìn)行查詢可能比本地磁盤(pán)具有更高的延遲,但它允許您保留更長(zhǎng)的數(shù)據(jù),同時(shí)仍然降低存儲(chǔ)成本。
最后,可以進(jìn)一步降低歷史數(shù)據(jù)的分辨率。一種方法是對(duì)舊數(shù)據(jù)進(jìn)行二次降采樣。另一種方法是顯式創(chuàng)建歷史數(shù)據(jù)的聚合,同時(shí)丟棄原始的原始記錄。
總結(jié):選擇有效的存儲(chǔ),只保留重要的數(shù)據(jù)
在建立物聯(lián)網(wǎng)可觀察性堆棧時(shí),必須決定在哪里存儲(chǔ)數(shù)據(jù)并選擇合適的可觀察性后端。在本文中,描述了在做出優(yōu)化成本效率和物聯(lián)網(wǎng)擴(kuò)展決策時(shí)需要考慮的各個(gè)方面。要記住的要點(diǎn)如下:
- 優(yōu)化存儲(chǔ)選擇:評(píng)估可觀察性存儲(chǔ)的訪問(wèn)模式,并根據(jù)需求定制數(shù)據(jù)庫(kù)。只有在確信通用數(shù)據(jù)庫(kù)足夠時(shí)才選擇通用數(shù)據(jù)庫(kù)。否則,請(qǐng)使用經(jīng)過(guò)實(shí)戰(zhàn)測(cè)試的可觀察性數(shù)據(jù)庫(kù),以獲得更好的可擴(kuò)展性。
- 設(shè)置數(shù)據(jù)采樣:采用數(shù)據(jù)采樣技術(shù)來(lái)節(jié)省存儲(chǔ)成本,而不會(huì)影響關(guān)鍵的見(jiàn)解。
- 微調(diào)保留策略:配置保留策略以丟棄過(guò)時(shí)的數(shù)據(jù),確保存儲(chǔ)保持精益,從而節(jié)省更多的存儲(chǔ)成本。