精华内容
下载资源
问答
  • 思极有容时序数据库正是普华公司面对这一高速增长的物联网大数据市场和技术挑战推出的创新性的大数据处理产品,它不依赖任何第三方软件,也不是优化或包装了一个开源的数据库或流式计算产品,而是在吸取众多传统关系...
  • 1. 系统架构 1.1 系统简介 以上示意图可能非常简单,但我觉得足够表明一个整体架构。 当一台设备、一辆车连接到协议网关后,便开始了真正的收发数据。...当数据完成编解码之后一般会发往消息队列...

    个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 

    1. 系统架构

    1.1 系统简介

    车联网系统架构示意图

    以上示意图可能非常简单,但我觉得足够表明一个整体架构。 当一台设备、一辆车连接到协议网关后,便开始了真正的收发数据。一般通信的方式都是基于 tcp,搞一段二进制协议,所以协议网关基本要做的工作就是完成对连接的管理、完成对数据的收发及编解码。

    当数据完成编解码之后一般会发往消息队列当中,一般都是 Kafka 之中。用来解耦生产和消费两端,提供一层缓冲,无论消费服务是死是活还是速度慢,包治百病,甚至还能治未病。

    数据发往消息队列的过程中,或之后花活儿就多起来了。但主要的我认为无非还是三种处理方式:

    1. 需要将原始数据保存入库,这里的原始数据包含二进制数据和解码后的二进制数据。
    2. 流处理或批处理数据,在数据落到硬盘之前将能够提前计算的数据全部预先计算出来,这样做的好处是将来查询的时候如果和预计算的模型匹配,那就能非常快的得到结果。
    3. 离线处理,这里的应用就太广泛了,一般来讲都是将耗时比较大的放置离线计算来做。但是这里要声明一点,离线计算依然是越快越好,不能因为他叫离线计算所以在设计或开发阶段就不关注时效。

    1.2 数据质量

    上一章提到了基本的数据质量,但实际工作中,往往质量会出现各种意想不到的数据,下面是工程中影响数据质量的几个比较大的问题:

    1. 数据丢失,不管是在采集,上报,数据流转环节,都可能会带来一定的数据丢失比例。
    2. 数据乱序,数据在打包、上报、流转等环节均可能出现乱序,尤其是在补传数据中。
    3. 数据重复,数据重复发送,尤其是在网络不好时。
    4. 数据本身不准确,这个最突出的地方就是在 GPS 数据中,经常出现飘点、噪点等等。

    2. 数据库的挑战

    2.1 数据项多

    汽车里具有非常复杂的电路系统和传感器设备,我印象当中的粗略估算应该是有 120 项左右,并且这些数据项并不是车内数据的全部。随着自动驾驶的到来,汽车的传感器会越来越多,数据项就会更多。

    如果按照传统的 Mysql 存储,那么由于行式存储,所以在取回数据时候就会非常影响效率,之后介绍到 IoTDB 的文件格式的时候再聊。

    2.2 存量数据大

    我们按照宝马汽车 2019 销售量估计,252 万辆,我们假定 4 年前就已经具备了联网模块那就是 1000 万辆汽车。按照每条数据 1K,每天采样上传 1 次,应该是 每天 9G 数据。但因为车不可能一直都点火开,所以要假设一个 30% 的在线率,那就是 3G 数据。

    3 年大约就会存储 3TB 数据,可能你觉得 3T 数据对于时下最热的大数据来讲并不是一个非常庞大的数字,但如果整个数据里面不包含任何图片、音视频甚至都没有文字,全部是由整数、浮点数堆积起来的,那你可以试想一下这个数据库里面到底有多少数据,如果你一个不小心执行了 count(*) 你觉得会卡死不?

    2.3 采集频率高

    汽车不同于其他传感器的地方是,他是一个处在时刻运动当中的物体,如果需要做一些高阶的计算模型,比如说:碰撞检测、行驶轨迹纠偏等,那么相应的数据采集频率有可能要达到秒级。

    当然我说完这句话,可能你感触并不是很深,但是结合前面说到的两点:120项数据、1000万辆车,将采集频率提高到 1 秒一采集,那么这个频率下,一天产生的数据大小就是 259T。这时候你找 DBA 说,哥们我们的需求要 1 天写入 259T 数据,我觉得反正我是没脸找人家,让产品去跟 DBA 聊吧。

    2.4 大数据分析需求

    现有时序数据库都无法支持大数据分析框架,都需要通过数据库的 Api 把数据从数据库往数据仓库导出后再存一份,数据量直接翻倍。 举个例子,我如果需要对 Mysql 中的数据进行 MapReduce 计算,那么只能是将数据通过 JDBC 接口导出到 Hbase 或 Hdfs 上,然后执行计算,可能你觉得这很正常,但按照上面提到的数据量,数据复制之后你公司里可能就需要每天支撑 500T 数据。

    2.4 不同数据库遇到的问题

    我们公司也采用了多种尝试,从开始的 MySql 到 MongoDB 再到 Hbase 等等,它们总存在这一点或多点的让你觉得就是不满足的地方,如下图:

    不同数据库对比图

    IoTDB

    到此为止,整体需求基本明确,作为一款物联网的时序数据库需要处理的问题:

    1. 高速写入
    2. 高效压缩
    3. 多维度查询,降采样、时序分割查询等
    4. 查询低延迟高效
    5. 提高数据质量,乱序、空值等
    6. 对接现有大数据生态

    IoTDB 功能特点

    IoTDB功能特点

    IoTDB 完成了上述问题中的几乎所有功能,而且可以灵活对接多生态,高性能优势等。那么 IoTDB 是如何完成这些优势项,如何做到?

    IoTDB 架构描述

    IoTDB架构图

    对照上面的图,大致了解一下 IoTDB 的结构,逻辑上被分为 3 个大部分,其中:

    1. Engine 是完整的数据库进程,负责 sql 语句的解析,数据写入、查询、元数据管理等功能。
    2. Storage 是底层存储结构,类似于Mysql 的 idb 文件
    3. Analyzing Layer 是各种连接器,暂不涉及细节。

    Engine 和 Storage 中主要包含:

    1. IoTDB Engine,也就是代码中的 Server 模块.
    2. Native API,他是高效写入的基石,代码中的 Session 模块
    3. JDBC,传统的 JDBC 连接调用方式,代码中的 JDBC 模块
    4. TsFile,这是整个数据库的一个特色所在,传统的数据库如果使用 Spark 做离线分析,或者 ETL 都需要通过数据库进程对外读取,而 IoTDB 可以直接迁移文件,省去了来回转换类型的开销。TsFile 提供了两种读写模式,一种基于 HDFS,一种基于本地文件。

    附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读/书籍书单大全:

    (点击右侧 即可打开个人博客内有干货):技术干货小栈
    =====>>①【Java大牛带你入门到进阶之路】<<====
    =====>>②【算法数据结构+acm大牛带你入门到进阶之路】<<===
    =====>>③【数据库大牛带你入门到进阶之路】<<=====
    =====>>④【Web前端大牛带你入门到进阶之路】<<====
    =====>>⑤【机器学习和python大牛带你入门到进阶之路】<<====
    =====>>⑥【架构师大牛带你入门到进阶之路】<<=====
    =====>>⑦【C++大牛带你入门到进阶之路】<<====
    =====>>⑧【ios大牛带你入门到进阶之路】<<====
    =====>>⑨【Web安全大牛带你入门到进阶之路】<<=====
    =====>>⑩【Linux和操作系统大牛带你入门到进阶之路】<<=====

    天下没有不劳而获的果实,望各位年轻的朋友,想学技术的朋友,在决心扎入技术道路的路上披荆斩棘,把书弄懂了,再去敲代码,把原理弄懂了,再去实践,将会带给你的人生,你的工作,你的未来一个美梦。

    展开全文
  • 消息队列与异步架构 同步调用 发邮件时序图:同步调用,每个调用都会阻塞等待。 同步调用:线程前后执行,都要一步一步同步等待结果。 多个耗时操作同步调用 异步调用 异步调用:写入消息队列里面,就直接返回。1...

    说明

    讲师:李智慧

    消息队列与异步架构

    同步调用

    发邮件时序图:同步调用,每个调用都会阻塞等待。
    同步调用:线程前后执行,都要一步一步同步等待结果。
    在这里插入图片描述

    多个耗时操作同步调用

    在这里插入图片描述

    异步调用

    异步调用:写入消息队列里面,就直接返回。1毫秒就可以返回,比同步调用快了1,000倍以上。
    在这里插入图片描述

    有回调的异步调用

    在这里插入图片描述

    多次异步调用,不阻塞应用线程

    在这里插入图片描述

    消息队列构建异步调用架构

    在这里插入图片描述
    重要角色:

    • 消息生产者
    • 消息队列
    • 消息消费者

    点对点模型

    在这里插入图片描述

    发布订阅模型

    在这里插入图片描述

    消息队列的好处

    实现异步处理,提升写操作处理性能。

    在这里插入图片描述

    支付、订单等需要消息队列,提升的是写操作的性能,特别是双十一这种大促的时候感受等待的时间比较长。

    缓存提升的是读的性能,消息队列提升的是写的性能。

    更好的伸缩性

    在这里插入图片描述

    削峰填谷

    在这里插入图片描述
    比如服务器的处理能力为100TPS,100并发;当来了200TPS,200并发的时候,消息队列还是按照100TPS,100并发来处理。

    失败隔离和自我修复

    因为发布者不直接依赖消费者,所以消息系统可以将消费者系统错误与生产者系统组件隔离。

    生产者和消费者互相不受双方失败影响。

    这意味着任意时刻,我们都可以对后端服务器执行维护和发布操作。我们可以重启、添加或删除服务器,而不影响生产者可用性,这样简化了部署和服务器管理的难度。

    解耦

    在这里插入图片描述

    事件驱动架构 EDA (Event Driven Architecture)

    在这里插入图片描述

    同步调用耦合度高、事件驱动异步调用耦合度低

    在这里插入图片描述

    主要 MQ 产品比较

    • RabbitMQ 的主要特点是性能好,社区活跃,但是 RabbitMQ 用 Erlang 开发,对不熟悉 Erlang 的同学而言不便于二次开发和维护。(社区 49 Million)
    • ActiveMQ 影响比较广泛,可以跨平台,使用 Java 开发,对 Java 比较友好。 (社区 27 Million)
    • RocketMQ 是阿里推出的一个开源产品,也是使用 Java 开发,性能比较哈,可靠性也比较高。(社区 35 Million)
    • Kafka, LinkedIn 出品,Scala开发,专门针对分布式场景进行了优化,因此分布式的伸缩性比较好。(社区 63 Million)

    负载均衡

    负载均衡架构

    在这里插入图片描述

    负载均衡就是把请求分发到服务器上。

    负载均衡服务器配置的应用服务器为内网ip地址。这样能保护内网服务器的安全。

    HTTP 重定向负载均衡

    在这里插入图片描述

    1. 用户访问一个http请求,DNS解析域名为ip地址,ip地址指向负载均衡服务器;
    2. 负责均衡服务器,获取服务器集群列表,修改http的header为集群中的某台的服务器地址,告诉客户端做302跳转;
    3. 客户端请求集群中的某台的服务器
    4. 集群中的某台的服务器处理完后,返回response。

    重定向服务10来行代码,就能实现。

    缺点:

    1. 两次http请求,性能差。
    2. 暴露了应用服务器的公网ip,安全性很差。

    一般不会采用HTTP 重定向负载均衡。

    DNS 负载均衡

    在这里插入图片描述

    1. 性能方面没有问题,DNS解析只在第一次请求的时候会用到,后面就记录在客户端里面。而且域名的解析是缓存起来的。
    2. 安全方面也没有问题。DNS解析的IP地址是负载均衡服务器的ip地址。

    这里用了2级负载均衡服务器。DNS,和DNS返回的ip地址都是负载均衡服务器。

    反向代理负载均衡

    在这里插入图片描述
    小型应用会用,通常10几台应用服务器的时候会用。多了以后就不够用了。为什么呢?

    因为反向代理服务器转发的是http请求,http请求每次通信的时间比较慢,对反向代理服务器的压力比较大。当并发比较高的时候,反向代理服务器就会成为瓶颈。

    IP 负载均衡

    在这里插入图片描述
    TCP/IP 的数据包比较小,一般是几K。

    1. 客户端发起请求,请求到达负载均衡服务器,负载均衡服务器修改发起的ip为自己,目标地址为应用服务器。
    2. 应用服务器处理请求后返回给负载均衡服务器,负载均衡服务器修改发起的ip为客户端,目标地址为负载均衡服务器,返回给客户端。

    缺点:
    请求和响应的压力都在负载均衡服务器。负载均衡服务器,网卡的出口网络带宽会不够用。

    数据链路层负载均衡

    在这里插入图片描述

    1. 客户端请求到达负载均衡服务器,负载均衡服务器的网卡和应用服务器的网卡为一样,这是虚拟网卡。修改Mac地址,分发给应用服务器,达到负载均衡。
    2. 应用服务器处理完后,直接返回给客户端。

    LVS
    数据链路层负载均衡是张文冲,现任 滴滴的首席科学家发明的。

    负载均衡算法

    • 轮询:所有请求被依次分发到每个应用服务器上,适合于所有服务器硬件都相同的场景。
    • 加权轮询:根据应用服务器硬件性能的情况,在轮询的基础上,按照配置的权重将请求分发到每个服务器,高性能的服务器分配更多的请求。
    • 随机:请求被随机分配到每个应用服务器,在许多场合下,这种方案都很简单实用,因为好的随机数本身就很均衡。如果应用服务器硬件配置不同,也可以很容易的使用加权随机算法。
    • 最少连接:记录每个应用服务器正在处理的连接数(请求数),将新到的请求分发到最少连接的服务器上,应该说,这是最符合负载均衡定义的算法。
    • 源地址散列:根据请求来源的IP地址进行Hash计算,得到应用服务器,该算法可以保证同一个来源的请求总在一个服务器上处理,实现会话粘滞。

    应用服务器集群的 Session 管理

    应用服务器的高可用架构设计主要基于服务无状态这一特性,但是事实上,业务总是由状态的,在交易类的电子商务网站,需要有购物车记录用户的购买信息,用户每次国脉请求都是向购物车种增加商品;在社交类网站中,记录用户的当前登录状态、最新发布的消息以便及时将这些信息通知他的好友。Web应用中将这些状态信息称作会话(Session),单机情况下,Session可交给Web容器管理,在使用负载均衡的集群环境中,Session 管理主要有以下几种手段。

    Session 复制

    在这里插入图片描述
    这种方案是已经淘汰的。每台服务器都同步session,http请求很重。做集群本来就是为了分担负载均衡,但是session复制又加重了服务器的压力。计算稍微大一点,就会被session拖垮了。

    Session 绑定

    在这里插入图片描述
    相同的IP地址,总是到达相同的服务器。Session绑定,IP地址Hash值的作为Key去模服务器。

    Session绑定是不好的,也已经被淘汰了。为什么?
    业务的快速发展、快速迭代,7 x 24 小时运转,没法支持快速发布版本。发布版本的流程为,关闭应用服务器,发布新应用,重启服务器。如果关闭应用服务器,session就丢失了,导致用户处理失败,用户就丢失了。

    利用 Cookie 记录 Session

    在这里插入图片描述
    缺点:每次请求响应,都要维护session,如果浏览器禁用cookie,那么就用不了了。

    在Web的时代,这种方案还是比较流行的,生命力强很多。

    Session 服务器

    在这里插入图片描述

    分布式数据库

    MySQL 主从复制

    在这里插入图片描述
    主服务器修改表,更新表数据操作会记录到Binlog里面,Binlog会启动一个客户端线程,把更新的数据同步到从服务器的Relay Log里面。

    更改字段的流程:

    • 增加字段的时候,数据库表结构要先加字段,应用服务器更新再上线。
    • 删除字段的时候,所有应用服务器先取出该字段,数据库表结构才能删掉该字段。

    MySQL 一主多从复制

    在这里插入图片描述

    一主多从复制的优点

    • 分摊负载
    • 专机专用
    • 便于热备份和冷备分
    • 高可用

    MySQL 主主复制

    在这里插入图片描述
    客户端线程更新数据,更新数据,追加到binlog,主服务器启动客户端线程,主服务器A从

    MySQL 主主失效恢复

    在这里插入图片描述

    MySQL 主主失效的维护过程

    在这里插入图片描述

    MySQL 复制注意事项:

    • 主主复制的两个数据库不能并发写入。
    • 主主复制/主从复制,只是增加了数据的读并发处理能力,没有增加写并发能力和存储能力。
    • 更新表结构会导致巨大的同步延迟。

    MySQL支持的记录量级是千万级的,千万不能增加过亿的数据。

    注意:以上信息如有侵权,请联系笔者删除。谢谢。

    展开全文
  • 思极有容时序数据库正是普华公司面对高速增长的时序数据市场和技术挑战推出的创新性的大数据处理产品,它不依赖任何第三方软件,也不是优化或包装了一个开源的数据 库或流式计算产品,而是在吸取众多传统关系型...
  • 先从一张时序图开始 首先有两个系统A、B,他们之前用ActiveMQ作为交互。为了记录上面的执行情况,在数据库中有一个字段来标识执行到哪一步的状态,状态说明如下: 1: 插入数据库时的初始状态,即第1步完成后的...

    案情重演:
    先从一张时序图开始
    时序图
    首先有两个系统A、B,他们之前用ActiveMQ作为交互。为了记录上面的执行情况,在数据库中有一个字段来标识执行到哪一步的状态,状态说明如下:
    1: 插入数据库时的初始状态,即第1步完成后的状态
    2: 推送ActiveMQ成功后的状态,也就是第2步完成后的状态
    3: 处理结果成功的状态,也就是第6步完成后的状态【最终状态,下面会提到。】

    正常来说从步骤1到步骤6都不会有任何问题,但并发量稍微大的时候,最终状态是2而不是3。
    而日志打出来的结果已经更新成功,郁闷中,难道是数据库更新的问题?
    后来在步骤6的更新数据库前,先查询该条记录判断状态是否为2。 然后下断点,调试,发现此时2的更新数据库操作未完成。
    原因分析:
    首先,推送MQ成功时并不代表已经处理完毕。
    然后,当并发量达到一定程度时,MySQL需要处理大量的update操作,可能造成一定的延迟,
    而且是多线程环境,步骤6由专门的线程来执行,跟步骤2实际上是并行的关系。
    此时如果处理结果返回时,可能会在步骤2未能执行完毕的情况下执行步骤6成功,然后步骤2
    的更新数据库操作会将本就是最终状态的记录变成步骤2完成的状态。

    解决方案:
    一、在第6步的更新数据库前先判断步骤2的数据库更新操作是否成功。
    二、步骤1执行成功后直接推送MQ, 推送成功后不再update, 改为insert新记录到新表中, 查询的时候join一下新表即可。

    展开全文
  • 上一篇聊了聊批处理的缺点,对于无界数据来说,流处理会是更...但是消息队列与传统的数据库之间又存在着“剪不断,理还乱”的“纠葛”,最后我们将探讨通过消息队列之中与时序有关的一些问题。 文件是批处理作业的...

    上一篇聊了聊批处理的缺点,对于无界数据来说,流处理会是更好的选择,“流”指的是随着时间的推移逐步增加的数据。消息队列可以将这些流组织起来,快速的在应用程序中给予反馈。但是消息队列与传统的数据库之间又存在着“剪不断,理还乱”的“纠葛”,最后我们将探讨通过消息队列之中与时序有关的一些问题。

    文件是批处理作业的输入和输出,而在流处理之中,作业的输入输出等价物是什么呢?

    在流处理之中,当输入是文件时,第一个处理步骤通常是将其解析为一连串的记录。在流处理之中,记录通常被称为事件,每个事件都是一个小的、独立的、不可变的对象,通常每个事件包含一个时间戳,表明事件产生的时间。 在流处理之中,事件由生产者产生,然后可能由多个对应消费者,相关的事件通常被分组到同一个主题之中。

    可以由数据库来串联生产者与消费者:生产者可以将事件写入数据库,之后每一个消费者定期轮询数据库检查新出现的事件。但是数据库是不适合这种频繁轮询的操作的,因为轮询的次数越多,返回新事件的百分比越低,由此产生额外的开销也就越高。 (其实可以通过触发器的方式实现,但是数据库触发器也是基于数据库内部的关联的表进行操作的),所以引入了消息系统来处理流处理的需求。

    1.消息系统

    消息系统的运行逻辑很简单:由生产者发送包含事件的消息,然后将消息推送给消费者,可以由多个生产者节点发送消息到同一个主题,并允许多个消费节点在一个主题中接收消息。 但是消息系统会有这样几个问题:

      1. 如果生产者发送消息的速度比消费者处理的速度快,系统会怎么样处理呢 ?
        • 删除消息
        • 在队列中缓存消息
        • 负反馈(也称为流量控制,阻止生产者发送更多消息)
      1. 如果节点崩溃或暂时离线,会出现消息丢失吗?消息系统与数据库相似,需要实现消息持久化需要一些进行磁盘读写或消息复制,这显然是有代价的。如果可以容忍消息丢失,那么可以在同一硬件上获得更高的吞吐量和更低的延迟。

    消息的传递机制

    许多消息系统使用生产者和消费者之间的直接网络通信,而无需通过中间节点,如ZeroMQ 采取了TCP/IP组播的形式。所以如果消费者在网络上公开服务,生产者可以直接通过HTTP或RPC请求将消息推送给消费者。虽然直接消息传递的系统在通常情况下在协议检测和消息重传的机制下工作的很好,但是应用程序通常需要能够容忍消息丢失的情况,因为有一个问题很明显生产者和消费者不一定时刻在线。 而如果消费者离线,它可能错过消息。有些协议允许生产者重试失败的消息,但一旦生产者崩溃,这种方法可能失效,因为重试的消息的缓冲区会丢失。

    而另一种广泛使用方案是通过消息队列来发送消息,它作为与生产者和消费者的中间连接而存在,生产者将消息写入消息队列,而消费者从消息队列读取需要接收的消息。 通过消息队列传输的数据,系统容忍消费者和生产者的在线问题,消息持久性选择被交给了消息队列。这时我们可以更加灵活的处理消息,有些消息可以仅仅保存在内存中,而某些消息将写入磁盘,以便在消息队列崩溃时不会丢失这些消息。 面对处理速度缓慢的消费者,消息队列通常允许无界的排队规则,而不是丢弃消息或负反馈调整,这些机制都成为可以定制的选项。 但是消息队列的消息传递是异步的:当生产者发送消息时,它通常只等待消息队列的确认,而不会等到消费者处理消息。

    与数据库的区别与联系

    消息系统在许多性质上与数据库非常相似,但是依然存在一些重要的差异:

    • 数据库会持久化的保存数据,直到数据被显式删除,而大多数消息系统将消息成功地传递给消费者时自动删除它,所以消息系统不适合作为长期存储。

    • 数据库通常通过索引来分类检索数据,而消息系统通常通过主题配置的模式来分类检索数据的。

    • 数据库的读写操作都是主动的,而消息系统不支持随机查询,当数据发生变化时,它会通知消费者。

    消息的分发与确认

    当多个消费者读取消息时,消息系统存在两种分发模型:

    • 负载均衡

    每个消息传递给所有消费者中的一个,由所有消费者共享处理主题中的消息的工作。消息队列可以任意的向消费者分配消息,来实现负载均衡。

    • 消息广播

    每条消息都传递给所有的消费者。消息广播使所有消费者收到同样的消息,而不影响彼此流,相当于有几个不同的批处理作业读取相同的输入文件。

    负载均衡与消息广播

    这两种模式可以进行合并:例如,两个独立的消费者组可以各自订阅一个主题,使得每个组集体接收所有消息,但在每个组中,只有一个节点接收每个消息。

    消费者可能在任意时刻崩溃,所以向消费者传递的消息未必会被处理或者只是在崩溃前部分处理它。 为了保证消息不丢失,消息代理使用确认机制:消费者需要明确反馈给消息队列,对应的消息得到了处理,消息队列会在队列之中移除对应的消息。 如果消费者的连接关闭或超时,而消息队列没有收到确认,则它假定消息没有被处理,因此它将消息再次发送给另一个消费者。(注意,可能会出现消息完全被处理的情况,但是确认在网络中丢失了,再次处理消息时需要确保消息的处理是幂等的。)所以如下图所示,这种情况会导致消息的交付顺序与生产者的发送的顺序不一致:

    M3与M4的交付顺序与生产者的发送的顺序不一致:

    通常来说如果消息是完全独立的,那么消息的重新排序不会产生问题,但是如果消息之间有因果依赖关系,这回导致因果的不一致性,为了避免这个问题,可以为每个消费者使用单独的队列,但是这样就失去了负载均衡的优势。

    日志与消息系统

    对于有持久化需求的消息队列,则考虑通过日志来实现持久化存储,来满足消息队列低延迟的要求。在前文之中我们讨论过日志的模式,同样相同的日志模型可以用来实现消息队列的持久化:生产者将消息追加到日志的末尾,而消费者通过依次读取日志来接收消息。如下图所示:为了比单个磁盘所能提供更高的吞吐量,可以对日志进行分区操作。在不同的代理节点上托管不同的分区,使每个分区保存独立的日志:

    日志的分区读写

    在每个分区之中,每个消息都会有一个单调递增的序列号,这样能够保证分区之中所有的消息是完全有序的,而不同分区之间的消息则没有顺序保证。通过这种方式可以很容易地分辨出哪些消息已被处理,比当前偏移量小的消息已经被处理,而后面的消息还没有被处理。因此,消息队列不需要追踪每一个消息,它只需要定期记录消费者偏移。这样有助于提高基于日志系统的吞吐量。而一旦消费者节点失效,则消费者组中的另一个节点被分配到日志分区,并开始在最后记录的偏移量上消费消息。 但如果之前的消息处理了偏移量之后的消息,但没有记录新的偏移量,则这些消息会被二次处理。

    如果消费者无法跟上生产者发送消息的速率,则日志记录消息可以作为一种缓冲机制 。 当一个消费者所需要的消息比比日志上保留的信息要老,它将丢失过旧消息。所以需要监视消费者的消费速率,如果它显著落后,则发出警报。由于基于日志的磁盘缓冲区很大,有足够的时间让管理员介入。即使消费者落后太多,开始出现丢失消息的情况,也只有单个消费者受到影响,它不会破坏其他消费者的运行。 前文提到的消息确认是一种破坏性的操作,因为它会导致消息被消息队列删除。而在基于日志的消息队列中,消息的读取时只读的操作,不会改变日志。这使得基于日志的消息队列更像是前文提及的批处理过程。

    2.与数据库共同工作

    上文已经提到过,没有一个系统能够满足所有的数据存储、查询和处理需求。在实践中,应用需要结合不同的技术来满足要求,所以本节我们来看看消息队列与数据库是怎么样并肩作战的。

    变化数据捕获(CDC) 是常常被使用到的技术,通过观察所有写入数据库的数据变化并将它们转换成可复制到其他系统数据的过程。如下图所示,通过捕获到数据库中的更改,并继续对搜索索引等应用更改,通过以相同的顺序应用更改日志,搜索索引中的数据与数据库中的数据相匹配。

    图片.png

    变化数据捕获的实现

    变化数据捕获是一种机制,用于确保对记录系统的所有更改也反映在派生数据系统中,以便派生系统具有准确的数据副本。 从本质上讲,更改数据捕获使一个数据库成为Leader,并将其他数据系统变成Follower。基于日志的消息队列很适合从源数据库接受消息的变化,并且保留的消息的顺序。 数据库的触发器同样可用于实现变化数据捕获,通过观察数据表的所有变化并将变化添加到记录表之中,但是触发器会带显著的性能开销。变化数据捕获通常是异步的:记录数据库系统在提交之后不会等待更改应用于消费者。

    快照与日志压缩

    如果拥有对数据库所做的所有更改的日志,那么可以通过日志来重建数据库的整个状态。但是将所有更改保存在内存中,会耗费大量的磁盘空间,并且载入并应用日志将耗费太长的时间,因此需要截断日志并配合快照来使用。构建一个新的全文索引需要整个数据库的完整副本,这里可以通过快照开始,并且载入快照后生成的日志便可以将索引恢复到最新的状态。所以数据库快照必须与日志中的偏移量相对应,以便确定在处理完快照后,在哪一点开始应用日志更改。

    因为只能保留有限的日志记录,所以每次需要添加新的派生数据系统时,都需要经历快照的过程。这增加了系统的复杂性,而日志压缩提供了一个很好的替代方案,日志压缩的原理很简单:存储引擎周期性地查找具有相同Key的日志记录,丢弃重复的记录,并且只保存每个Key的最新值。 日志的压缩和合并过程在后台运行,如果需要重建派生数据系统(如:搜索索引)时,可以从压缩日志中启动一个新的用户,并依次扫描日志中的所有消息,就可以获取数据库内容的完整副本,而不必通过额外的快照。

    3.流处理的时间依赖

    流处理与数据库相比最核心的差别是:查询和数据之间的关系是相反的。通常,数据库会持久地存储数据,而查询是一个临时的操作。而流处理反转两者的角色:查询是长期存储的,输入流的事件不断地流过,并寻找查询模式匹配的数据。所以,二者的应用场景也差距很大,流处理擅长监控变化的数据并且给予反馈。一旦涉及到变化,则是一个时间敏感问题,数据是随着时间的推移而变化的,流处理通常需要处理时间,特别是用于分析的数据变化时,需要使用时间窗口。例如 “过去五分钟的平均时间”。许多流处理框架使用了本地系统时钟来确定时间窗口。如果事件的发生和事件的处理之间的延迟很小,这个模型就十分简单易行。然而,前文我们提到了,事件很有可能会产生延迟,事件的处理可能明显晚于事件的发生。

    事件时间与处理时间

    有许多原因会导致处理的延迟如:排队、网络故障,消息队列处理缓慢,代码的bug等。消息延迟会导致事件的不可预知排序。例如,假设用户首先创建一个Web请求(由Web服务器A处理),然后再进行第二个请求(由服务器B处理)。a和b发出描述它们所处理请求的事件,但b事件在事件发生前到达消息代理。现在流处理器将首先看到b事件,然后才是a事件,尽管它们实际上是以相反的顺序发生的。

    事件发生的时间和事件的处理时间是两个完全不同的概念,混淆他们会导致数据的损坏。如下图所示,Web服务器上事件发生的频率是稳定的,但是流处理器需要定期处理事件,可能这时会停下来一分钟,处理挤压的事件,如果这时以事件的处理事件来测量数据,会导致异常的波动结果。


    错误的选择时间导致了结果的异常波动

    如何确定时间戳

    确定事件的时间戳是一件很困难的事,按理来说,事件上的时间戳应该是与用户交互发生的时间,但是,用户控制的设备上的时钟通常不能被信任,因为它可能是偶然或故意设置到错误的时间。服务器接收到事件的时间(根据服务器的时钟)更可能是准确的,但在描述用户交互方面没有什么意义。所以这里有三个时间戳的法则:

    • 1 .事件发生的时间 (设备时钟)

    • 2 设备将事件发送到服务器的时间 (传输计时)

    • 3 服务器接收事件的时间 (服务器时钟)

    由第三个时间戳减去第二个时间戳,可以估计设备时钟和服务器时钟之间的偏移量,通过这样的方式来估计事件实际发生的真实时间。

    小结:

    通过流处理与批处理,我们可以完成一个分布式系统需要的绝大多数计算任务。我们用了16篇的时间走完了对这本书绝大多数内容的梳理,最后一章是一篇大杂烩,作者带领我们展望自己对于未来数据系统发展的看法,也对之前的内容做了总结。

    展开全文
  • 消息传输和消费的有序性,是消息队列应用中一个非常重要的问题,在分布式系统中,很多业务场景都需要考虑消息投递的时序。例如,电商中的订单状态流转、数据库的 binlog 分发,都会对业务的有序性有要求。今天我们...
  • TAOS入门 一、TAOS简介 TDengine:是涛思数据面对高速...TDengine的模块之一是时序数据库。但除此之外,为减少研发的复杂度、系统维护的难度,其还提供缓存、消息队列、订阅、流式计算等功能,为物联网、工业互联网大数
  • 在Ubuntu上安装TDengine数据库

    千次阅读 2019-08-22 18:05:19
    1.TDengine介绍: 网上说这个Tdengine很火,而且功能强大。以下是它的特点: ...将数据库消息队列、缓存、流式计算等功能融合一起,应用无需再集成Kafka/Redis/HBase/Spark等软件,大幅降低应用开...
  • 在分布式系统中,很多业务场景都需要考虑消息投递的时序 ,举个例子 电商中的订单状态流转、数据库的 binlog 分发等都会对业务的有序性有要求。 在分布式场景下,消息的有序性是很难保证的,为什么这么说呢? 我们来...
  • 二者都是非关系型数据库。...PostgreSql很好的支持缓存,OLTP,OLAP/批处理/数据仓库,流处理/消息队列,搜索索引,NoSQL/文档数据库,地理数据库,空间数据库,时序数据库,图数据库。传统的架构选型呢,可能会组合...
  • TDengine2.0快速入门

    2021-01-26 14:38:42
    1、TDengine 官网 ... 2、TDengine 简介 TDengine是涛思数据面对高速增长的物联网大数据市场和技术挑战推出的创新性的大数据处理产品,它不依赖...TDengine的模块之一是时序数据库。但除此之外,为减少研发的复杂度、系统
  • 系统实时监测的时序数据和业务相关结构化数据通过MQTT消息服务集群实现上云,并通过规则引擎转存到时序数据库、关系数据库、内存数据库等数据服务集群,也可以通过规则引擎进行消息分发,直接推送数据到业务集群和AI...
  • TDengine学习笔记-安装

    千次阅读 2021-03-06 09:06:12
    TDengine简介官方描述 TDengine是涛思数据面对高速增长的...TDengine的模块之一是时序数据库。但除此之外,为减少研发的复杂度、系统维护的难度,TDengine还提供缓存、消息队列、订阅、流式计算等功能,为物联网、工业
  • 俯瞰 Java 服务端开发

    2021-03-26 10:07:16
    俯瞰 Java 服务端开发 Java 服务端开发是一个非常宽广的领域,要概括其全貌,即使是几本书也讲不完,该文将会提到许多的...时序数据库 列式数据库 嵌入式数据库 中间件 Web Server 分布式缓存 KV 存储 消息队列 定时
  • 1.rpc框架:brpc,spp 2.缓存数据库(nosql):redis,couchbase,memcache,...消息队列:kafka 5.监控:grafana,influx db(时序数据库) 6.数据库:mysql 7.版本管理:gitlap(开源),svn,github 8.数...
  • 一、前言 (一)关于taos taos入门 TDengine:是涛思数据面对高速...TDengine的模块之一是时序数据库。但除此之外,为减少研发的复杂度、系统维护的难度,其还提供缓存、消息队列、订阅、流式计算等功能,为物联网、工
  • TDengine性能测试

    千次阅读 2020-08-22 11:38:18
    针对这些特点,时序数据库TDengine 将数据库、消息队列、缓存、流式计算等功能融合一起,在大幅提高性能的同时,降低平台开发维护的复杂度和成本。 实现方案 服务端安装 官网提供了三种格式的安装包其中deb支持...
  • 成熟的应用可能会用到许许多多的数据组件(功能):缓存,OLTP,OLAP/批处理/数据仓库,流处理/消息队列,搜索索引,NoSQL/文档数据库,地理数据库,空间数据库,时序数据库,图数据库。传统架构选型可能会组合使用...
  • 为什么物联网大数据平台,使用TDengine,可不要redis, kafka, spark等软件?...但TDengine的核心功能是时序数据库,而大数据处理平台往往还需要有消息队列、缓存、流式计算等功能,怎么能不要Redis, Kafak,...
  • 【TDengine】TDengine初探

    2019-07-21 23:19:00
    TDengine介绍: 网上说这个Tdengine很火,而且功能强大。以下是它的特点: 10倍以上的性能提升 ...将数据库消息队列、缓存、流式计算等功能融合一起,应用无需再集成Kafka/Redis/HBase/Spark等软...
  • 它不依赖任何第三方软件,也不是优化或包装了一个开源的数据库或流式计算产品,而是在吸取众多传统关系型数据库、NoSQL数据库、流式计算引擎、消息队列等软件的优点之后自主开发的产品,在时序空间大数据处理上,
  • 未知

    2019-09-28 18:22:41
    关于openstack 、hadoop的区别 关于购买服务器的配置和环境问题 ...关于消息队列、activemq 、数据库优化问题 关于gis系统问题:通过部门的地址自己注意到百度地图去找坐标。 gis数据大、需要独立一个服务器、不...
  • 3.8前端开发工具-vscode安装 3.9容器部署-docker安装 3.10消息队列-kafka安装 3.11mqtt broker安装 四、可视化管理工具的安装 4.1navicat安装与使用 4.2redis 可视化工具安装与使用 4.3mqtt可视化工具安装与使用 4.4...
  • 2、单纯的消息中间件能解决吗,中间件可以保证时序,但是不能判断是否存在该消息 3、数据库的事务是否能解决呢? 事务解决的也是数据一致性的问题(业务层与数据库层面的一致性),看来这个也跟数据库的事务没有...
  •  最近需要使用到消息队列相关技术,于是重新接触RabbitMQ。其中遇到了不少可靠性方面的问题,归纳了一下,大概有以下几种:  1. 临时异常,如数据库网络闪断、http请求临时失效等;  2. 时序异常,如A任务依赖...
  • 第一章:课程指南.pdf

    2020-04-28 21:38:21
    阿里云其他 产品(规则引 擎、时序数 据库、函数 计算、消息 队列…) 应用逻辑 MQTT TLS TCP/IP 课程场景 概览 5 温湿度 传感器 阿里云 物联网 平台 STM32 绿灯 红灯  每5秒上报温湿度值,闪烁绿灯  温度超...
  • 3.10 消息队列 151 3.11 文件系统函数 156 3.12 电源管理 190 3.13 数据结构 197 3.14 常量 205 3.15 错误代码 205 4 图形人机交互界面 207 4.1 人机交互界面的分层 207 4.2 图形引擎 207 4.3 窗口机制层 224 4.4 ...

空空如也

空空如也

1 2
收藏数 34
精华内容 13
关键字:

时序数据库消息队列