Wifi裝置監管
某知名跨國公司,在全球範圍内擁有大量園區,園區内會有不同部門的同僚在一起辦公。每個園區内都要配備大量的Wifi裝置進而為園區同僚提供友善的上網服務。是以,集團需要一套完善的監管系統維護所有的Wifi裝置。
公司通過監管系統維護Wifi裝置屬性、采集Wifi裝置監控資料。當需要Wifi裝置上、下線時,通過監管系統操作完成裝置的添加、下線,同時可通過系統修改、增加裝置屬性資訊,如:裝置mac位址、裝置型号、裝置地理位置等。裝置上線後,會定期向系統推送監控資料,進而完成裝置監控資料的采集。采集資料包含:cpu、記憶體、連接配接數、Wan口流量與流速、2.4G與5G子產品的信道資料等。
通過分析監控資料名額、分析裝置運作狀态,動态将問題裝置的運作狀态修改為:預警、報警。借助系統,網絡部門可以快速擷取問題裝置清單、了解裝置分布、查詢曆史監控名額。同時,也可以精确鎖定老裝置進而友善裝置更新,或者為長期負載率較高的位置擴充Wifi裝置提供資料依據;
功能需求
1、管理Wifi裝置,通過系統上線新裝置、下線老裝置;
2、系統擁有分組管理能力、标簽檢索能力;
3、高并發海量監控資料采集能力;
4、管理所有裝置的地理分布;
5、查詢某一區域内所有裝置的位置;
6、查詢【某裝置】在【某段時間】【不同名額】的監控資料;
7、低成本持久化所有資料,挖掘資料潛在價值
等等....
系統樣例,如下所示:官網控制台位址:
項目樣例!
技術需求
通常,使用者在設計方案是會重點考慮以下四個主要的技術需求:
第一、需要有強大的查詢、統計能力,實作Wifi裝置的管理;
第二、支撐裝置高并發的監控資料采集,資料庫需要強大的寫入性;
第三、資料持久化需求導緻資料膨脹,但曆史監控資料多為冷資料,存儲成本需要盡可能低;
第四、監控資料未來挖掘潛在價值較高,産品下遊需要有較好的計算生态;
表格存儲方案
表格存儲(Tablestore)在四個重要技術需求上完全滿足要求:
其一、表格存儲新商業化不久的多元索引(SearchIndex)功能支援多元檢索、GEO查詢等功能,完全滿足中繼資料管理需求;
其二、基于LSM tree打造的分布式NoSQL資料庫,可以輕松應對海量高并發,零運維輕松應對資料量的不斷膨脹,理論上無上限。
其三、表格存儲按量計費,提供容量型、高性能型兩種執行個體類型,容量型對冷資料更适宜,提供了更低存儲成本。
其四、更重要的,表格存儲擁有較為完善的計算生态,提供全、增量通道服務,提供流、批一體的計算體系,對未來監控資料價值挖掘提供管道。
表格存儲在時序場景需求的技術點上擁有極高的比對,而基于時序場景打造的時序模型(Timestream)更是将時序場景通用功能,封裝成易用的接口,使使用者更容易的基于表格存儲打造Wifi裝置監管系統;
資料結構設計
首先,我們在在表格存儲中抽象出兩類資料,分别是meta類資料(裝置中繼資料)、data類資料(監控資料);下面對兩類資料做簡單介紹。
WiFi裝置中繼資料
meta資料管理着使用者時間線的屬性資訊,支援名額、标簽、屬性、地理位置、更新時間等參數,模型會為所有屬性建立相應的索引,提供多元度條件組合查詢(包含GEO查詢)。其中Identifier是時間線的辨別,包含兩部分:name部分(監控名額辨別)、tags部分(固有不可變參數集合)。
在本樣例中,我們将“wifi”作為名額分類,mac位址作為不可變tag,而将其他屬性作為可變Attributes存放為屬性資訊;
裝置監控資料
data資料管理着各個時間線的監控狀态資料,可以為量化資料、地理位置、文字表述任意類型。data資料按照+有序排列,因而同一時間線的所有資料基于時間有序,這種資料存儲方式,極大的提升了時間線的查詢效率。
我們将裝置的十幾個監控資料某一時間點的監控資料存放為一行資料,不同屬性對應不同列;依據不同測監控次元,使用者隻需提供不同的columnToGet字段,擷取不同監控次元的部分名額資料,即可對應不同監控名額,如:WAN口流量:對應wan_total_in與wan_total_out兩個字段;
讀、寫接口
寫資料
寫資料提供兩類接口:Wifi裝置添加、監控資料寫入
- Wifi裝置添加:如果新增一個Wifi裝置,需要首先向meta表中插入一條裝置meta資料,通過metaTable.put(Meta)建立或修改meta資訊;
- 監控資料寫入:建立完meta後,wifi裝置端就可以定時、周期性地采集監控資料,并将資料推送、寫入到data表;模型設計上可支援多精度表管理,使用者可以根據自身需求管理多個精度的data資料
讀資料
與寫資料一樣,針對兩類資料提供了兩類讀接口:Wifi裝置查詢、監控資料讀取
- Wifi裝置查詢:根據裝置分組、裝置狀态、地理位置等多元度條件組合,擷取對應wifi裝置清單,掌握裝置的最新狀态;
- 監控資料讀取:基于單個meta的Identifier,擷取該裝置某段時間内、某一名額的監控資料;
核心代碼
SDK與樣例代碼
SDK:時序模型Timestream模型內建于表格存儲的SDK中,已在4.11.0版本中支援:
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>tablestore</artifactId>
<version>4.11.0</version>
</dependency>
代碼開源:
https://github.com/aliyun/tablestore-examples/tree/master/demos/WifiMonitor建立資料表
在建立完成執行個體後,使用者需要通過時序模型的sdk建立相應的meta表、data表:
不同精度監控資料存放不同表,用表名作區分,根據不同range的查詢,需要不同精度的監控資料,執行個體中僅用了一個精度,使用者可根據自身需求設計多個表;
private void init() {
AsyncClient asyncClient = new AsyncClient(endpoint, accessKeyId, accessKeySecret, instance);
TimestreamDBConfiguration conf = new TimestreamDBConfiguration("metaTableName");
TimestreamDBClient db = new TimestreamDBClient(asyncClient, conf);
}
public void createTable() {
db.createMetaTable(Arrays.asList(
new AttributeIndexSchema("group", AttributeIndexSchema.Type.KEYWORD),
new AttributeIndexSchema("id", AttributeIndexSchema.Type.KEYWORD),
new AttributeIndexSchema("status", AttributeIndexSchema.Type.KEYWORD),
new AttributeIndexSchema("version", AttributeIndexSchema.Type.KEYWORD),
new AttributeIndexSchema("location", AttributeIndexSchema.Type.GEO_POINT)
));
db.createDataTable("dataTableName");
}
資料寫入
資料寫入主要分兩部分,meta表添加新Wifi裝置、data表采集裝置監控資料
添加新Wifi裝置(meta表寫入)
//metaWriter對應meta表,提供讀、寫接口
TimestreamMetaTable metaWriter = db.metaTable();
//identifier作為時間線的身份辨別(unique),含:Name、Tags,
TimestreamIdentifier identifier = new TimestreamIdentifier.Builder("wifi")
.addTag("mac", "mock:mac:1:1")
.build();
//基于identifier建立meta對象,并為meta設定更多屬性,Attributes為屬性參數
TimestreamMeta meta = new TimestreamMeta(identifier)
.addAttribute("group", "group-1")
.addAttribute("id", "id-1")
.addAttribute("version", "v1.0")
.addAttribute("status", "normal")
.addAttribute("location", "30,120");
//建立新的時間線,然後寫入監控資料
metaWriter.put(meta);
采集Wifi裝置監控資料(data表寫入)
//dataWriter分别對應data表,提供讀、寫接口
TimestreamDataTable dataWriter = db.dataTable("dataTableName");
TimestreamMeta meta;//meta上一步已經建構
//建立新的時間線,然後寫入監控資料
dataWriter.asyncWrite(
meta.getIdentifier(),//Identifier identifier
new Point.Builder(i, TimeUnit.SECONDS)
.addField("cpu", 30)
.addField("ram", 29)
.addField("flash_used", 20)
.addField("flash_total", 1048576)
.build()
);
資料讀取
資料讀取分為兩類:Wifi裝置清單查詢與裝置監控資料查詢
查詢Wifi裝置清單(meta表讀取)
//reader對應meta表,提供讀、寫接口,此處名字為突出讀功能
TimestreamMetaTable metaReader = db.metaTable();
//建構篩選條件
Filter filter = new AndFilter(Arrays.asList(
Name.equal("wifi"),
Tag.equal("mac", "mock:mac:1:1"),
Attribute.inGeoDistance("location", "30,120", 100000)
));
Iterator<TimestreamMeta> iterator = metaReader
.filter(filter)
.fetchAll();
while (iterator.hasNext()) {
TimestreamMeta meta = iterator.next();//deal with metas
}
擷取Wifi裝置的監控資料(data表讀取)
//dataWriter分别對應data表,提供讀、寫接口
TimestreamDataTable dataReader = db.dataTable("dataTableName");
TimestreamMeta meta;//基于已擷取的meta清單,分别擷取每個時間線的有序監控資料
Iterator<Point> iterator = reader.get(meta.getIdentifier())
.select("flash_used", "flash_total")//設定傳回的列
.timeRange(TimeRange.range(0, Long.MAX_VALUE, TimeUnit.SECONDS))
.fetchAll();
while (iterator.hasNext()) {
Point point = iterator.next();//deal with points
long timestamp = point.getTimestamp(TimeUnit.MILLISECONDS);//毫秒機關時間戳
long flashUsed = point.getField("flash_used").asLong();//擷取該點long類型的資料大小監控
long flashUotal = point.getField("flash_total").asLong();//擷取該點long類型的資料大小監控
}
歡迎加入
基于表格存儲的時序模型(TimeStream)打造一套Wifi裝置的監控、管理系統,是不是很容易上手?
如果您對表格存儲、時序模型感興趣,對模型使用有疑問、想探讨,歡迎加入【表格存儲公開交流群】,群号:11789671。