基于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类型的数据大小监控 }
作者:潭潭
原文链接
本文为云栖社区原创内容,未经允许不得转载。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
基于2PC和延迟更新完成分布式消息队列多条事务Golang版本
背景 分布式多消息事务问题 在消息队列使用场景中,有时需要同时下发多条消息,但现在的消息队列比如kafka只支持单条消息的事务保证,不能保证多条消息,今天说的这个方案就时kafka内部的一个子项目中基于2PC和延迟更新来实现分布式事务 2PC 2PC俗称两阶段提交,通过将一个操作分为两个阶段:准备阶段和提交阶段来尽可能保证操作的原子执行(实际上不可能,大家有个概念先) 延迟更新 延迟更新其实是一个很常用的技术手段,简单来说,当某个操作条件不满足时,通过一定手段将数据暂存,等条件满足时在进行执行 基于2PC和延迟队列的分布式事务实现 系统架构 实现也蛮简单的, 在原来的业务消息之后再添加一条事务消息(事务消息可以通过类似唯一ID来关联到之前提交的消息), worker未消费到事物提交的消息,就会一直将消息放在本地延迟存储中,只有当接收到事物提交消息,才会进行业务逻辑处理 业务流程 生产者 逐条发送业务消息组 发送事务提交消息 消费者 消费消息队列,将业务消息存放本地延迟存储 接收提交事务消息,从本地延迟存储获取所有数据,然后从延迟存储中删除该消息 代码实现 核心组件 MemoryQuue...
- 下一篇
用Q-learning算法实现自动走迷宫机器人
【技术沙龙002期】数据中台:宜信敏捷数据中台建设实践|宜信技术沙龙 将于5月23日晚8点线上直播,点击报名 项目描述: 在该项目中,你将使用强化学习算法,实现一个自动走迷宫机器人。 如上图所示,智能机器人显示在右上角。在我们的迷宫中,有陷阱(红色炸弹)及终点(蓝色的目标点)两种情景。机器人要尽量避开陷阱、尽快到达目的地。 小车可执行的动作包括:向上走 u、向右走 r、向下走 d、向左走l。 执行不同的动作后,根据不同的情况会获得不同的奖励,具体而言,有以下几种情况。 撞到墙壁:-10 走到终点:50 走到陷阱:-30 其余情况:-0.1 我们需要通过修改 robot.py 中的代码,来实现一个 Q Learning 机器人,实现上述的目标。 Section 1 算法理解 1.1 强化学习总览 强化学习作为机器学习算法的一种,其模式也是让智能体在“训练”中学到“经验”,以实现给定的任务。但不同于监督学习与非监督学习,在强化学习的框架中,我们更侧重通过智能体与环境的交互来学习。通常在监督学习和非监督学习任务中,智能体往往需要通过给定的训练集,辅之以既定的训练目标(如最小化损失函数),通过...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题