某知名跨國公司,在全球範圍內擁有大量園區,園區內會有不一樣部門的同事在一塊兒辦公。每一個園區內都要配備大量的Wifi設備從而爲園區同事提供方便的上網服務。所以,集團須要一套完善的監管系統維護全部的Wifi設備。git
公司經過監管系統維護Wifi設備屬性、採集Wifi設備監控數據。當須要Wifi設備上、下線時,經過監管系統操做完成設備的添加、下線,同時可經過系統修改、增長設備屬性信息,如:設備mac地址、設備型號、設備地理位置等。設備上線後,會按期向系統推送監控數據,從而完成設備監控數據的採集。採集數據包含:cpu、內存、鏈接數、Wan口流量與流速、2.4G與5G模塊的信道數據等。github
經過分析監控數據指標、分析設備運行狀態,動態將問題設備的運行狀態修改成:預警、報警。藉助系統,網絡部門能夠快速獲取問題設備列表、瞭解設備分佈、查詢歷史監控指標。同時,也能夠精確鎖定老設備從而方便設備升級,或者爲長期負載率較高的位置擴充Wifi設備提供數據依據;數據庫
一、管理Wifi設備,經過系統上線新設備、下線老設備;
二、系統擁有分組管理能力、標籤檢索能力;
三、高併發海量監控數據採集能力;
四、管理全部設備的地理分佈;
五、查詢某一區域內全部設備的位置;
六、查詢【某設備】在【某段時間】【不一樣指標】的監控數據;
七、低成本持久化全部數據,挖掘數據潛在價值
等等....網絡
系統樣例,以下所示:官網控制檯地址:項目樣例數據結構
一般,用戶在設計方案是會重點考慮如下四個主要的技術需求:
第1、須要有強大的查詢、統計能力,實現Wifi設備的管理;
第2、支撐設備高併發的監控數據採集,數據庫須要強大的寫入性;
第3、數據持久化需求致使數據膨脹,但歷史監控數據多爲冷數據,存儲成本須要儘量低;
第4、監控數據將來挖掘潛在價值較高,產品下游須要有較好的計算生態;併發
表格存儲(Tablestore)在四個重要技術需求上徹底知足要求:
其1、表格存儲新商業化不久的多元索引(SearchIndex)功能支持多維檢索、GEO查詢等功能,徹底知足元數據管理需求;
其2、基於LSM tree打造的分佈式NoSQL數據庫,能夠輕鬆應對海量高併發,零運維輕鬆應對數據量的不斷膨脹,理論上無上限。
其3、表格存儲按量計費,提供容量型、高性能型兩種實例類型,容量型對冷數據更適宜,提供了更低存儲成本。
其4、更重要的,表格存儲擁有較爲完善的計算生態,提供全、增量通道服務,提供流、批一體的計算體系,對將來監控數據價值挖掘提供渠道。運維
表格存儲在時序場景需求的技術點上擁有極高的匹配,而基於時序場景打造的時序模型(Timestream)更是將時序場景通用功能,封裝成易用的接口,使用戶更容易的基於表格存儲打造Wifi設備監管系統;async
首先,咱們在在表格存儲中抽象出兩類數據,分別是meta類數據(設備元數據)、data類數據(監控數據);下面對兩類數據作簡單介紹。分佈式
WiFi設備元數據ide
meta數據管理着用戶時間線的屬性信息,支持指標、標籤、屬性、地理位置、更新時間等參數,模型會爲全部屬性建立相應的索引,提供多維度條件組合查詢(包含GEO查詢)。其中Identifier是時間線的標識,包含兩部分:name部分(監控指標標識)、tags部分(固有不可變參數集合)。
在本樣例中,咱們將「wifi」做爲指標分類,mac地址做爲不可變tag,而將其餘屬性做爲可變Attributes存放爲屬性信息;
設備監控數據
data數據管理着各個時間線的監控狀態數據,能夠爲量化數據、地理位置、文字表述任意類型。data數據按照+有序排列,於是同一時間線的全部數據基於時間有序,這種數據存儲方式,極大的提高了時間線的查詢效率。
咱們將設備的十幾個監控數據某一時間點的監控數據存放爲一行數據,不一樣屬性對應不一樣列;依據不一樣測監控維度,用戶只需提供不一樣的columnToGet字段,獲取不一樣監控維度的部分指標數據,便可對應不一樣監控指標,如:WAN口流量:對應wan_total_in與wan_total_out兩個字段;
寫數據
寫數據提供兩類接口:Wifi設備添加、監控數據寫入
讀數據
與寫數據同樣,針對兩類數據提供了兩類讀接口:Wifi設備查詢、監控數據讀取
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類型的數據大小監控 }
本文爲雲棲社區原創內容,未經容許不得轉載。