ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【MPP】MPP架构上风浅显讲解 [打印本页]

作者: 自由的羽毛    时间: 2024-6-13 13:50
标题: 【MPP】MPP架构上风浅显讲解
数据库最大的性能瓶颈是什么?假如这个问题答不上来,说明还不是一个及格的程序员。
答案是: 磁盘IO
那什么又是 磁盘IO呢,下面简单做先容
#磁盘IO模型



简单来说,每一次的数据读取 都会存在机械活动。 那可以思考到假如我们数据全部都在同一个磁道,同一个扇区,那机械活动是不是最少?也就是说假如数据是连续存储就能减少机械活动,也就是减少磁盘IO。好有了以上的根本共识,我们结合现有的数据库往下思考。
思考1:那我们就想办法将必要查询的数据存储在一块不就好了吗?
回答:是的。目前所有的数据库都是将数据尽大概的连续存储。此时你肯定又会产生一个疑问,既然都是连续存储了,那还有什么好优化的?那这里就牵引出了数据库里字段的存储,行与列的概念。列比如一张excel表 横向的一行数据叫行 ,竖向的一行数据叫列。
列式存储VS行式存储

行存储是将整行放入连续的物理位置(区块),就像传统的记录存储或文件存储方式,列存储是按列将连续的某几列数据放入连续的物理存储单位中;在行存储中,每一行数据都是连续存储的,一行中的数据在存储介质中是连续存储的;而在列存储中,数据是按照列的方式存储的,即每一列数据都是连续存储的,一列中的数据在存储介质中是连续存储的,这样处理列就更快,不用向行存储那样遍历所有涉及的行。简单理解,列式数据库以为是每一列都是一个表,这个表只有一列,假如只在该列进行条件查询,速度就很快.

假如现在我们有一个sql语句 select name from table。 下面分析磁盘扫描距离。
行存储:那磁盘必要从1开始扫描,一直扫描到12的位置。才气将所有name值扫描出来。相称于扫描了12格。
列存储:只需从1扫描到4,总共走了4步。
这里只是一个很简单的数据,假如这个数据是10亿级别,行存储是不是就是10亿数据量的格数,列存储扫描10亿1格。因此不难发现,尽管只必要前1 个字段,但由于数据是按行进行组织的,现实上还是扫描了所有的字段。但假如数据是按列进行存储,则不会出现这样的问题,由于数据按列进行组织,数据库可以直接选择查询列的数据并返回,从而避免多余的数据扫描。此时你应该对行存储和列存储有了初步概念。
接下来我们再看一个示例,相识列存储模型
数据预处理

假如我们有一张表 有字段 id-Name-Birthday-Hobbies 四个字段,同时部门字段值运举动空。那么他的存储结果如下图。

首先可以看出,我们这几个字段可以分别存储在差异的区域。这也赋予了MPP架构可以随意扩展字段。假如mysql行存储必要扩展字段,他的数据存储是离散的,不是在同一个数据块中。这其实也会增加磁盘扫描数。
那我们可以思考 下面sql的实验逻辑select name form table where birthday=‘27-1-1978’ and name like ‘F%’ 。首先他会去磁盘区域1扫描name列。找出2条符合查询条件的数据 rowId 为2和3 集合数据A。再去磁盘区域2扫描birthday得到rowId为2的集合数据B。那我们终极去交集得到集合为2的rowId,那么我们再A中拿到name字段。
思考: 那我们再进阶思考一下,我们再查找birthday='27-1-1978’时可不可以进行优化,来更高的提升查询性能?答案就是排序。假如Birthday 字段范例界说为date,且不绝地对他进行排序。那么我们是不是可以更快的找到相应的数据。这也是绝大多少MPP架构对数据进行预处理的一种方式,来提高查询服从。因此在设计时字段范例选择也是相称重要的。
那我们再思考一个sql。select count(1) from table where Hobbies=‘archery’ 假如是mysql,那是不是必要去全表扫描,然后再汇总得到结果。然而现在,你可以看到只需统计rowId数目即可得出终极结果。这速度是否让你想到一个词‘遥遥领先’。这就是为什么说MPP架构的数据库非常善于于聚合查询的缘故原由。
数据压缩

我们再思考: 有没有方式可以再进一步减少我们磁盘的IO呢?
答案是有的:压缩数据

假如现在name字段数据(磁盘区域1)有数据量1W条,存储占用了100M,不思量排序环境有一个查询必要扫描全部才找到数据,那扫描这100M必要1000ms。那我们通过压缩技术把它压缩成50M,扫描时间则只必要500ms。这样时间是不是就减半了呢?答案是没有完全减半,由于还必要cpu进行加压数据,但是cpu实验的时间远远少于磁盘扫描的时间。以是采取数据压缩是有效较少磁盘IO的。
cpu向量化

我们再思考: 前面都是通过减少磁盘IO的方式来提升查询速度,还有没有其他方式来提升这个查询速度了?
答案是有的:CPU向量化
可以简单地看做成一种消除程序中的循环所做的优化,举个例子:假设小明在卖果汁,而榨一杯果汁假设必要 2 分钟,有客户抱怨太慢了,那么为了增加快度要怎么办呢?显然多预备几台榨汁机就好了,因此非向量化实验的方式是利用 1 台榨汁机重复 n 次,而向量化实验的方式是利用 n 台榨汁机只实验 1 次。而为了实现向量化实验,必要利用 CPU 的 SIMD 指令。SIMD 的全称是:Single Instruction Multiple Data,即用单条指令操纵多条数据。现代盘算机体系概念中,它是通过数据并行以提高性能的一种实现方式(其它的还有指令级并行和线程级并行),它的原理是在 CPU 寄存器层面实现数据的并行盘算。CPU 从寄存器中获取数据的速度是最快的,是内存的 300 倍,磁盘的 3000 万倍。利用 CPU 向量化实验的特性,对于程序的性能提升有着非凡的意义。ClickHouse 目前利用 SSE 4.2 指令集实现向量化实验。
再举一个多行程并行与向量化运行的区别:
我们想要滚着四个大石头穿过马路,每个要花费一分钟。线性处理器就是一个接一个的滚过去,总共要花费四分钟。有两个焦点的多核处理器就是有两个人滚石头,每个人两个石头,总共花费两分钟。向量处理器就是找一个长的木板,从后面一起推这四个石头,同时滚过去,花费一分钟。多核处理器有多个员工,向量处理器有办法同时对差异的事变做同一件事。
分布式

我们再思考 前面讲到了通过存储结果,以及cpu来提升查询性能,还有没有其他方式来提升了?
答案是:分布式
相识过spark,flink,es的朋侪肯定也已经想到了。目前绝大多少MPP架构数据库都支持分布式摆设与盘算。这样可以有效利用各节点服务器的盘算资源。

上图是一个clickhouse的真实架构图,数据写入以后通过zookeeper进行数据同步(其实是优先写入zookeeper再写入各clickhouse节点中,这里可以进行优化,手动直到写入节点避免zookeeper-clickhouse的网络传输)。我将一份切分多个分片,查询是通过distributed 进行分发查询,然后distributed再汇总返回。
我想到这里有的同学大概会想到利用主从(从节点多个)+nginx负载来提高查询性能,这也是可以的。如下图

末了的总结

通过本文,您应该有了对MPP架构有了初认识。下一篇我们将讲述目前市场上MPP架构数据的对比。以及着重clickhouse架构剖析
MPP架构提升查询服从的方式有哪些
1.列存储方式
2.数据预处理(排序,聚合)
3.数据压缩
4.CPU向量化
5.分布式盘算/负载均衡

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4