snowflake

「分布式技术专题」三种常见的数据库查询引擎执行模型

元气小坏坏 提交于 2021-02-18 20:46:44
注: 本文涉及到的相关资料图片摘自 CARNEGIE MELLON DATABASE GROUP 发表的 CMU SCS 15-721 (Spring 2019) :: Query Execution & Processing (点击可查看) 1. 迭代模型/火山模型(Iterator Model) 又称 Volcano Model 或者 Pipeline Model 。 该计算模型将关系代数中每一种操作抽象为一个 Operator,将整个 SQL 构建成一个 Operator 树,查询树自顶向下的调用next()接口,数据则自底向上的被拉取处理。 火山模型的这种处理方式也称为拉取执行模型(Pull Based)。 大多数关系型数据库都是使用迭代模型的,如 SQLite、MongoDB、Impala、DB2、SQLServer、Greenplum、PostgreSQL、Oracle、MySQL 等。 火山模型的优点在于:简单,每个 Operator 可以单独实现逻辑。 火山模型的缺点:查询树调用 next() 接口次数太多,并且一次只取一条数据,CPU 执行效率低;而 Joins, Subqueries, Order By 等操作经常会阻塞。 2. 物化模型(Materialization Model) 物化模型的处理方式是:每个 operator 一次处理所有的输入

数据仓库与维度建模

左心房为你撑大大i 提交于 2021-02-17 06:52:59
维度建模的基本概念 维度建模(dimensional modeling)是专门用于分析型数据库、数据仓库、数据集市建模的方法。 它本身属于一种关系建模方法,包含了基本的两个概念: 1. 维度表(dimension) 表示对分析主题所属类型的描述。比如"昨天早上张三在京东花费200元购买了一个皮包"。那么以购买为主题进行分析,可从这段信息中提取三个维度:时间维度(昨天早上),地点维度(京东), 商品维度(皮包)。通常来说维度表信息比较固定,且数据量小。 2. 事实表(fact table) 表示对分析主题的度量。比如上面那个例子中,200元就是事实信息。事实表包含了与各维度表相关联的外码,并通过JOIN方式与维度表关联。事实表的度量通常是数值类型,且记录数会不断增加,表规模迅速增长。 注:在数据仓库中不需要严格遵守规范化设计原则(具体原因请看 上篇 )。本文示例中的主码,外码均只表示一种对应关系,此处特别说明 。 维度建模的三种模式 1. 星形模式 星形模式(Star Schema)是最常用的维度建模方式,下图展示了使用星形模式进行维度建模的关系结构: 可以看出,星形模式的维度建模由一个事实表和一组维表成,且具有以下特点: a. 维表只和事实表关联,维表之间没有关联; b. 每个维表的主码为单列,且该主码放置在事实表中,作为两边连接的外码; c. 以事实表为核心

还在为生成分布式ID发愁?UUID、数据库、算法、Redis、Leaf 来帮忙

随声附和 提交于 2021-02-10 16:35:25
前言 一般单机或者单数据库的项目可能规模比较小,适应的场景也比较有限,平台的访问量和业务量都较小,业务ID的生成方式比较原始但是够用,它并没有给这样的系统带来问题和瓶颈,所以这种情况下我们并没有对此给予太多的关注。但是对于大厂的那种大规模复杂业务、分布式高并发的应用场景,显然这种ID的生成方式不会像小项目一样仅仅依靠简单的数据自增序列来完成,而且在分布式环境下这种方式已经无法满足业务的需求,不仅无法完成业务能力,业务ID生成的速度或者重复问题可能给系统带来严重的故障。所以这一次,我们看看大厂都是怎么分析和解决这种ID生成问题的,同时,我也将我之前使用过的方式拿出来对比,看看有什么问题,从中能够得到什么启发。 分布式ID的生成特性 在分析之前,我们先明确一下业务ID的生成特性,在此特性的基础上,我们能够对下面的这几种生成方式有更加深刻的认识和感悟。 全局唯一 ,这是基本要求,不能出现重复。 数字类型,趋势递增 ,后面的ID必须比前面的大,这是从MySQL存储引擎来考虑的,需要保证写入数据的性能。 长度短 ,能够提高查询效率,这也是从MySQL数据库规范出发的,尤其是ID作为主键时。 信息安全 ,如果ID连续生成,势必会泄露业务信息,甚至可能被猜出,所以需要无规则不规则。 高可用低延时 ,ID生成快,能够扛住高并发,延时足够低不至于成为业务瓶颈。 分布式ID的几种生成办法

2021年的十五个DevOps趋势预测

白昼怎懂夜的黑 提交于 2021-02-05 09:21:09
DevOps已经走过了很长的一段路,毫无疑问,它将在今年继续闪耀。由于许多公司都在寻找围绕其数字化转型的最佳实践,因此了解领导者认为该行业的发展方向非常重要。从这个意义上说,下面的文章收集了DevOps高层对2021年DevOps趋势的回应。 让我们看看他们每一个人在未来一年对DevOps有什么看法。 1.迁移到微服务成为必选项。 “从单一服务到微服务和容器架构的转变对所有公司的数字化转型都是必须的。它不再是一个或多个选择。Kubernetes的应用将会越来越多,当组织采用多云时,Terraform将会是自动化基础设施的最终选择。”——威普罗DevOps首席工程师Sachidananda Pattnaik 2.混合模式将成为部署规范。 “2020年加速了远程工作,加快了向云的迁移,并将DevOps从最佳实践转变为每个业务的重要组成部分。随着我们进入2021年,该行业将在多个方面采用混合动力。首先,企业将充分采用混合劳动力,将远程工作和现场团队协作的优势结合起来。第二,商业模式将变得混合,例如将虚拟规模与本地网络相结合的会议。最后,混合动力将成为部署标准,因为公司将其堆栈现代化,以利用云本地技术,但意识到并非所有东西都能脱离prem。2021年的赢家将是在其业务、模型和产品中采用混合动力的公司。”—— 杰蛙科技开发者关系VP Stephen Chin 3.DataOps 将繁荣发展。

【案例分享】某科技企业如何升级数据中台

怎甘沉沦 提交于 2021-02-02 20:02:48
科技型企业的技术发展经历了三个阶段,分别是独立工具阶段、集成式阶段、中台式阶段。这类企业在集成式阶段不断地陷入IT怪圈,急需运用新的技术能力令其从集成式阶段发展到中台式阶段。 01 项目背景 大多科技型公司的技术发展都经历了几个阶段。最早的时候,科技公司需要独立的工具来做数据分析,这些企业零散地使用数据分析技术,之后还购买了数据治理工具。 在数据应用越来越深入的情况下,这些企业会发现大数据平台正契合其需要。所以这类企业会集成多款数据工具,包括数据同步工具,而这些工具大多产自于不同的厂商。科技型公司需要将这几款产自不同厂商的数据分析工具集成在一起,完成数据接入、计算、治理、分析等工作内容。为了维护这些数据工具,该类科技公司配备了IT团队,确保数据处理到数据分析应用的正常使用。 0 2 痛点分析 该类科技公司的IT部门的维护工作具有以下几个特征: IT人员投入大,手工维护,周期长 IT团队对于这些集成工具的维护大多通过手动的形式完成,为了满足业务部门的需求,IT部门手动为其开发应用,周期一般需要三周,这样的工作是不成体系的。 1. 产出价值低 IT团队完成这些维护工作后,大部分产出的都是报表,这些报表是不能直接给企业产生直接受益的。IT团队还产生了一些静态的数据应用,比如说用户画像、精准营销等。 2. 数据质量差 大量的IT工程师投入数据治理和数据分析的工作中

为什么我们不用数据库生成 ID?

生来就可爱ヽ(ⅴ<●) 提交于 2021-01-19 09:27:36
先介绍一下背景 ???? 团队正在一个为 SQL Server 构建数据目录项目的历程中,我们 优化系统以实现解耦 。这对我们来说非常重要,从根本上来说,我归结为两个核心原则,希望每个软件专业人员都能认同: 我们不希望系统复杂度随功能的增加而线性增长,这样会大大拖慢我们在业务发展速度以及对于价值的信心。 我们希望能够优先 从客户需求、访问性能、查询模式、业务变化等方面考虑 ,能够适应不断发展的需求和需要。换句话说,我们希望能够将系统内的任何组件换成更合适的组件,以满足当前而不是过去的需求。 下面是 protoactor-go 开源项目里的一句话 “software should be composed, not built”,与我要在本文陈述的观点非常相似: 对持久化有何影响????? 考虑到前面总体原则,我们不想把自己的状态持久化耦合到一个特定的数据库引擎上。从实际情况来看,就是说不将持久化的具体关注点传递到领域层。之所以要实现这一点,因为我们今天对规则的认知可能会让我们依赖某种具体数据库技术,比如 SQL Server,但并不能确保它能满足未来的能力需求。 有了这个具体的要求,持久化就需要出现在域事件而不是存储系统中,这也导致不同的存储需求。 幸运的是,有一些广为人知的、经过实战检验的模式可以解决这个问题,如结合 CQRS 领域驱动设计中的聚合设计等。因此这里的假设是

终端安全-设备指纹篇

余生颓废 提交于 2021-01-16 08:44:14
设备指纹是什么?作用是什么?特性是什么?有哪些相关技术呢? 好,带着这些问题,我们一一来解答。 什么是设备指纹 设备指纹或者设备ID,表现形式是一串符号,映射现实中的一台设备,如果这种映射关系是唯一的,那么就称为唯一设备ID:Unique Device Identifie. 设备指纹的作用 设备ID既然可以作为衡量某一设备的标准,那么在网络世界中就可以当作一个网络标识用来统计该标识对应的行为,同样有些网络应用的广告推送也需要凭借设备ID找出哪些唯一客户,再则有应用有收益的地方就有风险,所以又可以结合设备ID来做风险管控。具体可以分为三类: 1)统计需求 2)业务需求 3)风控需求 设备指纹涉及到的技术 知道了什么是设备指纹,那么怎么得到设备指纹是一项技术;如何应用设备指纹又是另外一项技术。这里我们讨论如何得到设备指纹的技术。 设备指纹数据的采集方案 通常设备指纹的采集方式分为三种: 主动式- 主动采集设备N多信息,比如UA、MAC地址、设备IMEI号、广告追踪ID等与客户端上生成唯一的device_id。局限性有:不同生态的平台对用户隐私数据开放权限不同,很难统一生成唯一识别码,且无法实现Web和App跨域统一。主动式设备指纹另一个局限性,由于强依赖客户端代码,这种方式生成的指纹在反欺诈的场景中对抗性较弱。 被动式-被动式设备指纹技术在终端设备与服务器通信的过程中

浅谈分布式 ID 的实践与应用

三世轮回 提交于 2021-01-12 14:48:45
在业务系统中很多场景下需要生成不重复的 ID,比如订单编号、支付流水单号、优惠券编号等都需要使用到。本文将介绍分布式 ID 的产生原因,以及目前业界常用的四种分布式 ID 实现方案,并且详细介绍其中两种的实现以及优缺点,希望可以给您带来 关于分布式 ID 的启发 。 为什么要用分布式 ID 随着业务数据量的增长,存储在数据库中的数据越来越多,当索引占用的空间超出可用内存大小后,就会通过磁盘索引来查找数据,这样就会极大的降低数据查询速度。如何解决这样的问题呢?一般我们首先通过分库分表来解决,分库分表后就无法使用数据库自增 ID 来作为数据的唯一编号,那么就需要 使用分布式 ID 来做唯一编号 了。 分布式 ID 实现方案 目前,关于分布式 ID ,业界主要有以下四种实现方案: UUID :使用 JDK 的 UUID#randomUUID() 生成的 ID; Redis 的原子自增 :使用 Jedis#incr(String key) 生成的 ID; Snowflake 算法 :以时间戳机器号和毫秒内并发组成的 64 位 Long 型 ID; 分段步长 :按照步长从数据库读取一段可用范围的 ID; 我们总结一下这几种方案的特点: 方案 顺序性 重复性 可用性 部署方式 可用时间 UUID 无序 通过多位随机字符达到极低重复概率,但理论上是会重复的 一直可用 JDK 直接调用 永久

数据库是如何分库,如何分表的?

依然范特西╮ 提交于 2020-12-31 11:07:21
点击上方“ 猿程之家 ”,选择“置顶公众号” 关键时刻,第一时间送达! 阅读本文需要5分钟 一. 数据切分 关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。 数据库分布式核心内容无非就是数据切分(Sharding) ,以及切分后对数据的定位、整合。数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作性能的目的。 数据切分根据其切分类型,可以分为两种方式:垂直(纵向)切分和水平(横向)切分 1、垂直(纵向)切分 垂直切分常见有垂直分库和垂直分表两种。 垂直分库 就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。做法与大系统拆分为多个小系统类似,按业务分类进行独立划分。与"微服务治理"的做法相似,每个微服务使用单独的一个数据库。如图: 垂直分表 是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中。在字段很多的情况下(例如一个大表有100多个字段),通过"大表拆小表",更便于开发与维护,也能避免跨页问题

领域驱动设计,让程序员心中有码(五)

怎甘沉沦 提交于 2020-12-26 07:26:46
1 从搬砖谈领域对象   有一个古老的故事,大概是这样的。作者问三个建筑工地上的工人他们在干什么?有一个没精打采的说,我在挖洞!而另一一个人却说,我在盖一座房子。还有一个人说,我在建立一座巨大的城市。不同的思维模式决定了不同的发展,十年过后,第一个工人,还是在挖洞,而第二个则成为了工头。第三个最终却成为了大设计师。   在软件开发领域,往往会使用搬砖这个词来形容我们所开发的每个功能模块,实际上也确实如此,如果把我们需要完成的每个项目,比作一座高楼大厦,那么在项目中所完成的各种模块,也确实是我们在计算机世界中利用砖块设计出来的精美建筑构建。而从领域驱动的角度来说,可以把关系,类比为建筑工程图纸中使用的各种辅助线,也可以把领域驱动中所涉及的各个对象,类比成砖块,这些砖块,大概有两种:一种是实体(Entity),一种是值对象(Value Object),而使用这些对象的工具,则成为服务(Service),完成的各个建筑构建,被成为包或者模块(Module). 2 关联关系   在介绍领域驱动设计的第三篇文章《 领域驱动设计,让程序员心中有码(三) 》中,笔者提到了UML中常用的几种关系,而关联关系是一种最为常见的关系。在软件设计过程中,无所不在的关联,有时候会让软件工程设计变得更加复杂。因此,在设计关联关系时,应该让关联更加易于控制,这意味着需要采取下列三种措施:   1