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版本中支持:
1
2
3
4
5
|
<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的查詢,需要不同精度的監控數據,實例中僅用了一個精度,用戶可根據自身需求設計多個表;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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表寫入)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
//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表寫入)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//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表讀取)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//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表讀取)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//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類型的數據大小監控 } |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://my.oschina.net/yunqi/blog/3050763