关于储存:存储方案作为产品Midgard探索

作者 | greatstone94 导读  互联网业务大多是围绕数据开展,获取、生产数据,投入到产品中为用户服务。百度的搜寻业务正是典型的数据密集业务,数据规模大,应用形式多样,极为关注如何构建高效低成本的存储系统。 然而软硬件技术升级、业务增长与变迁从未进行,一个久经验证的计划可能在短短半年后就偏离了设计之初的最佳状态。Midgard是搜寻场景下提出的智能化的数据存储计划管理器,本文简要介绍了Midgard如何无效利用数据本身提供的信息,如何利用存储系统的先进个性,始终保持数据服务的高效低廉。 全文3733字,预计浏览工夫10分钟。 01 存储需要如何变动为了阐明业务和技术同时驱动着存储计划的变动,此处举一个较为容易了解的例子:网页的倒排索引构建。 假如咱们要经营一个叫做tendu的检索服务,业务就是承受一批网页汇合,并对这些网页提供检索服务,当网页汇合或者网页内容发生变化时,也将这些变动更新到检索后果中。 1.1业务起步——计划 1.0tendu业务初起步的时候需要是十分简单明了的,因为规模和性能并非瓶颈,需要阐明往往是流程性的。咱们给出上面这样一个模型来示意这批网页的检索服务应该如何构建: 为了阐明分明,上图中残缺表述了离在线的构造,然而在本文中,咱们只关注离线的局部。除去网页数据库之外(假如这个数据库在咱们的指标之外,并且极为稳固),最为次要的数据组件就是”正排计算结果存储“这个数据库,这个数据库有两个次要作用: 这时咱们能够看到这个数据系统的需要是明了简略的: 1、依据key和数据名随机读写数据。 2、全量扫描所有数据。 那么一个简略的类Big-Table表格存储系统就能够解决上述问题,此时咱们的计划是1.0版本,计算零碎面对惟一一个数据库,应用Get/Put接口来计算网页正排数据,应用Scan接口来扫描数据选集组装倒排。 1.2 疾速更新 —— 计划 2.0随着tendu的用户越来越多,用户也发现了产品有一些问题:更新十分慢,一个曾经更新到第10话的漫画,在检索后果中,仍然显示为一周前的第2话。面对这些用户反馈,业务很快总结出了这个阶段的新指标:晋升更新速度。 在1.0计划当中,整个零碎的需要都是流程性的,在这个指标下,只有正排对应的网页特色以及倒排索引被正确的产出,这就是一个合格的计划。为了实现更新速度晋升的指标,业务需要补充了一些量化形容: 咱们在1.0当中采取的类表格存储很快遇到了瓶颈:计算过程中须要从数据库当中Get一些列,而1.0计划中采纳了HDD介质的数据库来存储所有数据,HDD介质的随机IO能力非常低,要晋升随机Get的吞吐量则须要十分高的老本,为此,咱们从新批改上述的架构。 通过业务的一番剖析发现,有频繁Get需要的只是一部分非常少的数据列,大概只占数据库整体的5%,因而须要一个反对对小体积数据进行高频查问的存储服务。咱们在这里减少了一个redis作为这个类型数据的缓存,正排计算服务的随机Get申请发送给Redis,写入申请同时发送给Redis和咱们的表格存储。 至此,应用HDD和内存混合存储的计划根本满足了业务的疾速更新需要。 1.3大范畴收录 —— 计划3.0随着更新速度越来越快,用户在检索服务上能够失去的后果越发精准、无效,业务成果广受好评,然而也迎来了新的产品需要:有一些小众的需要不是大多数人的须要,然而恰好有一些网页能够满足这部分需要,这部分网页的数量是十分微小,然而往往更新并不频繁。 此时需要中呈现了两组数据汇合: 优质汇合 宽泛汇合 为满足别离的扫描需要,做出分库分表的计划,一个库存储优质汇合,另外一个库存储宽泛汇合。 02 引入存储计划层2.1 精细化存储计划的问题如上,咱们讲述了一个检索服务的演变,为了一直适应新的业务需要,不停变换存储计划。带来的后果是: 1、存储成果——达到了较为理想的状态。 2、存储后端数量翻倍(1到2)再翻倍(2到4)。 3、不同存储之间的数据存在关系,这些关系须要所有业务计算模块通晓,治理成本上升。 2.2 Midgard——存储计划治理开篇的例子很好的阐明了存储计划调整的形式,依据数据应用需要、联合存储介质个性,重复迭代。Midgard是基于这一思路做进去的数据层,让业务脱离对具体存储的治理和保护。用户能够应用变更需要形容的形式表白业务变动,而代码和各种设施层面则不需变动,因为Midgard提供了稳固的接口。 外围构造——按名拜访数据 Midgard的外围能够看作以下几个局部: 1、Meta模块,元信息管理,寄存了各种数据的根底配置信息,比方某字段是否领有Cache,存储在何处。 2、Server模块接口层,解决用户申请,将用户申请依据元信息加载进来并进行预处理。 3、算子/执行器层,接口层会将用户申请编译成多个算子,并组织成肯定构造交给执行器执行。 通过较为简单的分层构造满足了数据名与接口实现拆散的要求,算子和执行器通过从Meta模块获取的编排信息就能够晓得有哪些步骤须要执行,接口层面则对用户齐全屏蔽掉这些细节。并且批改Meta当中的信息就能够批改一个数据列的具体行为,实现了数据存储计划的灵便治理。 按需调整能力 1、用户向Midgard注册数据接口的需求量 例如数据PAGE\_SCORE须要get接口供应1000QPS的服务能力2、依据业务需要,批改存储计划的元信息 一般来说业务会有两类需要:新增增加数据,定期更新存储计划从新调优3、稳固应用 4、Midgard依据从执行器和存储服务上采集到的数据反过来优化存储计划 从下面的示意图来看,Midgard是数据需要与存储计划之间的桥梁,承受各种需要,落地成各种存储计划,后续再依据从执行层获取到的后验信息踊跃的调整存储计划。 在咱们一开始举的例子当中,那些嵌在各个业务代码里的存储间解决逻辑,对业务就能够简化成一步:对Midgard更新数据需要形容,并且业务无需治理这些具体的存储组件,当咱们要发展一个新的业务时也能够复用咱们现有的技术计划。 组合计算能力 此外,得益于执行器的构造,每个操作都是由若干个独立的算子组合造成的,Midgard因而具备肯定的组合计算能力。 举一个例子:现有两张表,表A蕴含了网页的次要信息,表B是一个用户评分零碎,记录了用户对网页的打分,其中有一项sham\_score标记了用户是否认为网页有虚伪信息,并且这一列加载了cache。 咱们当初想要组装一个工作,从表A中定期扫描所有的网页,将sham\_score>5的数据全副革除。一般来说这可能须要一些简单的代码来同时读取三个存储:a) 表A b) 表B c) sham\_score的缓存,然而Midgard的组合计算能力,能够将细节暗藏在冰山之下。 用户传递给Midgard的可能是一个简略的原语序列: ...

August 31, 2023 · 1 min · jiezi

关于储存:IoT物联网平台设备影子开发实战实践类

传送门:5个视频解说,30个场景案例汇总https://www.yuque.com/cloud-d...IoT物联网平台提供设施影子性能,在云端通过一个JSON文件长久化存储设备上报状态值和业务零碎的期望值。每个设施有且只有一个设施影子,设施能够通过MQTT协定获取期望值desired和设置设施状态reported,业务零碎通过HTTPS协定获取设施状态reported和设置设施期望值desired。 ·设施能够被动上报运行状态,业务零碎能够随时读取,而不须要关怀设施是否在线。·当云端业务零碎给指定设施设置期望值后,如果设施在线,能够实时接管云端期望值变更;设施离线,再次上线能够被动拉取云端期望值。 设施影子通信的两个Topic: 设施影子 JSON在 IoT物联网平台控制台,设施详情,能够查看设施影子,默认影子JSON数据,如下图: 1.更新设施状态 reportedIoT 物联网设施能够被动更新以后状态数据到云端设施影子的(reported)节点中,通信报文,示例如下:胜利更新云端设施影子后,设施端会收到云端下发的响应报文,如下:咱们在IoT物联网控制台,设施详情的设施影子中,能够查看残缺的设施影子JSON文件,如下图 2.获取设施状态 reported业务零碎能够通过调用设施影子的GetDeviceShadow API,获取到设施状态数据(reported),示例代码如下(Node.js):返回后果如下,其中 ShadowMessage 为设施影子JSON的字符串模式,如下图: 3.设置设施期望值 desired业务零碎调用UpdateDeviceShadow API,能够给设施设置期望值(desired),代码示例如下(Node.js):设置胜利后,咱们在IoT物联网控制台,设施详情的设施影子中,能够查看最新影子文件,如下图:与此同时,在线的设施会实时收到设施影子音讯推送,内容如下:离线的设施,再次上线时,能够被动获取设施影子云端回复设施影子音讯推送,内容如下: 4.删除设施影子设施能够被动删除设施影子属性,其中method为delete,要删除的属性的值为null。删除胜利后,咱们在控制台查看设施影子如下图:设施上报时,将reported设置为null,能够删除全副属性的值。删除胜利后,咱们在控制台查看设施影子如下图: 5.增量delta和规定引擎事件阿里云IoT物联网平台的设施影子不反对增量delta推送,设施更新影子状态后也不会触发规定引擎流转音讯事件,业务零碎无奈实时感知设施状态(reported)变动。 物联网平台产品介绍详情:https://www.aliyun.com/produc... 阿里云物联网平台客户交换群

January 5, 2023 · 1 min · jiezi

关于储存:物联网平台从设备端到云端业务系统全链路开发实战实践类

传送门:5个视频解说,30个场景案例汇总https://www.yuque.com/cloud-d... 一、企业物联网平台开发实战通过浏览本文你将学会一下技能:1.设施通过MQTT协定与您在阿里云上购买的IoT企业实例建设双向连贯,上报设施采集的数据,监听云端下达的指令;2.通过规定引擎配置把上报的数据实时存储到指定数据库,无需编写代码3.通过规定引擎配置把上报的数据实时流转到业务服务器,须要应用AMQP协定SDK4.业务服务器调用IoT平台的API,下达控制指令到设施端 二、创立企业实例首先,咱们登录物联网平台控制台(https://iot.console.aliyun.com), 点击购买实例来创立一个企业实例。 也能够用公共实例收费测试。而后,在购买页面,依据理论业务需要,抉择地区、实例类型、设施数量、音讯上下行TPS、规定引擎TPS等参数,点击立刻购买,付费胜利后,即可看到企业实例创立中。稍等几分钟后,企业实例创立实现。进入企业实例,咱们能够看到以后规格参数,设施接入点信息,AMQP订阅接入点信息,云端API调用接入点信息。如下图: 三、创立产品和注册设施在企业实例的设施治理页面,咱们须要先创立一个产品家庭温控器,数据通信以JSON格局,认证形式为设施秘钥。在产品的性能定义页面,咱们增加温度和湿度两个属性,具体细节如下图:最初,咱们在设施治理页面,基于家庭温控器产品,注册一个物理设施,并获取设施身份认证的三元组。如下图: 四、设施接入和上报数据获取设施身份三元组后,即可通过MQTT协定接入到咱们开明的企业实例。设施端利用程序逻辑如下图:残缺的Nodejs示例代码如下: const mqtt = require('aliyun-iot-mqtt');// 1. 设施身份信息var options = { productKey: "产品productKey", deviceName: "设施deviceName", deviceSecret: "设施deviceSecret", host: "实例化MQTT接入点"};// 2. 建设MQTT连贯const client = mqtt.getAliyunIotMqttClient(options);client.subscribe(`/${options.productKey}/${options.deviceName}/user/get`)client.on('message', function(topic, message) { console.log("topic " + topic) console.log("message " + message)})setInterval(function() { // 3.上报温湿度数据 client.publish(`/sys/${options.productKey}/${options.deviceName}/thing/event/property/post`, getPostData(), { qos: 0 });}, 5 * 1000);function getPostData() { const payloadJson = { id: Date.now(), version: "1.0", params: { temperature: Math.floor((Math.random() * 20) + 10), humidity: Math.floor((Math.random() * 20) + 10) }, method: "thing.event.property.post" } console.log("payloadJson " + JSON.stringify(payloadJson)) return JSON.stringify(payloadJson);}启动模仿脚本后,咱们看到设施状态为在线,物模型数据中能够看到最新上报的温度和湿度值。在监控运维的日志服务里,也能够看到设施上报数据的日志。如下图:也能够无需编程,采纳设施模拟器做设施行为模仿 ...

December 27, 2022 · 2 min · jiezi