深入浅出话DB
大家好!为了帮助数据库开发者、用户和对数据库有兴趣的同学,更好地了解和运用数据库,柏睿数据数据库团队特别策划出品《深入浅出话DB》系列文章,以全内存分布式数据库RapidsDB为实例开启连载,从数据库高性能入手,到柏睿数据经典实战案例解读,带你走进全内存分布式数据库的世界。
关注“柏睿数据”微信公众号,一起启程数据库修炼之旅吧!
《深入浅出话DB》之高性能篇 目录
记得开始学编程的时候,专业课老师跟我们说,程序就是算法加数据结构。一个高性能的程序,除了要求一个好算法,还要讲究数据存在哪里,用什么方式保存。
作为高性能数据库的代表,RapidsDB用什么存储方法实现性能加速?
第一回,数据分区打头阵,Here we go!
RapidsDB是一个高度可扩展的分布式系统,在默认情况下,当集群中每创建一个存储节点,RapidsDB将在该存储节点上为每个CPU内核创建一个分区,以实现最大化的并行性。或者,当我们创建数据库的时候,可以通过参数自定义该数据库将被分为多少个数量的分区。
在数据库执行的查询任务中,分区是查询并行性的粒度单位,换句话说,每个并行查询都以分区数量相同的并行度运行。当集群处在需要更快的响应时间的OLAP分析业务场景中时,我们可以部署更多的存储节点以获得更多的分区,可以在资源合理利用的前提下,达到性能最大化的提升。
在确定了集群中的分区总数量后,每张分布式表在被创建的时候也会被分割为同等数量。对于这些分布式列表,其数据可以在集群中的各个节点间自动分割,也可以根据用户的定义,通过人为的选择分区键进行数据的分割。这里提到的分区键也可以称为“分区索引”,它类似于普通表的表索引,其中可以包含任意数量的列。当用户运行create table语句来创建表时,可以为该表指定一个分区键。如果不进行具体的分区键,会遵循以下两种情况:
1)如果该表拥有主键,则分区键就为该表的主键,数据将以主键所在列为依据,进行分布;
2)如果该表既没有指定分区键也没有主键,那么数据库引擎通过自身算法将为该表执行无键分区。这意味着数据库引擎将会以保障数据平衡分布的前提情况下,把表的数据随机分发到各个分区中。
分布式表的分区键决定了表中给定的行将会被存储到哪个分区中。数据库在运行插入语句时,计算节点会计算组成分区键的某列或多个列中的哈希值,进行取模运算以获得存储该行的分区编号,然后计算节点将会把插入操作定向到每个存储节点中相对应的分区。
对于极小的表,不需要进行分布操作,并且它将存在于集群中的每个节点上。复制表通过从主聚合器到集群中每个节点的主从复制来实现。这类表称为“复制表”。
当发现集群内现规模的计算节点和存储节点在最大负载下,使得服务器无法达到近满负荷的运行状态,用户可以根据自身需要向集群中额外添加计算节点和存储节点,达到增加分区的目的。通过重新平衡分区后,即可继续提供更高性能的服务。
而当用户遇到业务增长过快带来的资源瓶颈或性能瓶颈时,用户还可以通过增加服务器的方式,进行动态扩容。也可以通过增加集群中数据分区的方式,在不增加服务器负载的同时,又能达到线性提升性能的目的。
普通行式表和列式表在建表时就会通过分区键进行分区,例如表A和表B。对于极小的表,我们可以建立复制表,在每个节点均有该表的备份。
好了,数据分区我们介绍到这。如果您有疑问或建议,欢迎在后台留言,我们将针对大家的共性问题,发布【答疑篇】,互动的同学有机会获得神秘奖品呦。
RapidsDB极限性能数据库有何妙处?第二回将开启“高性能篇—行列混存”解读。欢迎关注“柏睿数据”公众号,继续修炼数据库~