1. 程式人生 > >基於Tablestore的Wifi裝置監管系統架構實現

基於Tablestore的Wifi裝置監管系統架構實現

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型別的資料大小監控
}

作者:潭潭

原文連結

本文為雲棲社群原創內容,未經允許不得轉