存储是数据的持久化载体,也是数据库系统重要的基础设施。高质量的存储系统设计,对数据库的性能有着至关重要的影响。
随着云计算技术的发展,数据库也开始拥抱云原生时代,“存算分离”的概念逐渐为大家所熟知。
“存算分离”不仅能节约成本,还可以让资源根据业务需求弹性伸缩。HashData为了追求极致的弹性和扩展性,计算集群和持久化存储严格实行物理分离:计算集群由类似AWS EC2的虚拟机组成,持久化存储则使用对象存储。
在上次的直播中,HashData数据库内核研发工程师刘晓宇与杉岩数据售前技术专家申国斌介绍了HashData在存算分离、对象存储优化等方面的技术探索与实践,并围绕大家关注的问题进行了深度解答。
HashData利用云存储作为数据持久存储层,并与计算资源物理上分离、逻辑上集成。由于自身的高可用性和近乎无限的可扩展性,云存储大大简化了数据仓库系统错误恢复、多维度扩缩容、备份恢复等流程,同时使得不同集群间共享同一份数据、统一的数据存储平台成为可能。
以下为直播问答文字实录摘选:
1.相比本地化存储,远程访问是否会带来性能上的下降?
刘晓宇:远程访问一般来讲会带来性能的下降。通常磁盘的读写速度可以达到100-200M/秒,而网络带宽通常达不到这样高的速率。如果频繁远程操作,会对系统造成很大的影响。
HashData通过在计算节点和对象存储中间增加缓存层,可以大幅降低访问对象存储的频率,缓解性能下降的问题。
传统的MPP架构数据库存储、计算紧耦合,数据存储在本地系统,存储能力的扩展通过增加集群节点实现,这样就会导致计算资源的浪费,无法匹配业务的发展。
HashData使用的是对象存储,独立于计算节点。利用对象存储技术,可以提供近乎无限的扩展能力,避免了传统数据平台基于成本考虑的归档需求和计算成本浪费。通过测试可以看到,HashData在计算节点和对象存储之间增加缓存层之后,相比MPP架构,几乎没有性能上的损耗,同时计算量可以提升近5倍。
2.缓存层设计理念是在元数据集群和对象存储集群之间,适度增加计算资源和缓存层,具体是怎么实现的?
刘晓宇:HashData的缓存策略采用目前比较流行的LRU算法,来实现热点数据的识别和保留。LRU本质上是一个固定大小的队列,对于需要频繁访问的数据,会放到队列前面;对于不经常访问的数据,会放在后面。随着队列慢慢的增加,最终经常访问的数据会在最前面,不经常访问的数据会在最后面。最终,不经常访问的数据会被剔除掉。
同时,对于缓存层屏蔽掉了所有远程文件操作。数据库内核在访问对象存储的时候,对远程操作不会有任何感知。
3.缓存的优化对象包括哪些?
刘晓宇:HashData针对高并发、小文件等场景做了大量的优化,进一步降低系统开销,使远程访问的性能可以达到跟本地几乎完全一样。
针对对象存储,HashData通过批量处理的方式对数据的查改删进行优化,大幅提升了操作效率。
另外,HashData对数据的写和读做了很多的优化。比如企业业务场景上使用大文件比较多,那么我们采用分片上传方式将大文件传输到对象存储上。对于每个上传的文件,HashData经过测试配置了一个最优的分片大小去做分片上传,将文件在对象存储上合并。
HashData的缓存系统采用按块缓存,做到了按需下载需要的数据,避免下载整个文件。比如使用缓存系统去读取数据,将每个块设置8M,对于64M的文件会被切分为8个块,如果用户需要的数据分布在其中的一个块内,那么我们数据库在读取数据时只需要取其中一个块即可,不需要把整个数据全都下载下来,这样做到了按需下载。
4.计算节点使用的是SSD吗?
刘晓宇:目前大多数用户使用的都是SSD。当然也有使用普通存储。SSD读写速度远远优于普通存储的性能。
5.通过网络获取到数据是否会导致网络IO的压力过大?
刘晓宇:网络IO压力大有两方面。一方面是对象存储压力过大。另一方面是集群本身随着主机和业务增多会更多地去访问对象存储,由此会带来集群整体和访问对象存储的网络开销越来越大。
对于对象存储压力过大我们通过多bucket方式来解决。将文件分散存储到其他的bucket上以此来分流对象存储上的压力。
对于集群因为业务增多出现网络压力过大,我们采用动态算法让系统根据当前的压力调整发送请求的间隔。再者可以通过调整参数降低集群发送网络请求次数。
6.缓存需要多少容量?一批数据量需要多少缓存?
刘晓宇:缓存容量由本机配置来决定,根据不同场景去定制缓存的大小。一般我们会配给系统的10%左右用于缓存,但具体的容量还要根据系统的情况去做调整。
如果大文件数量比较多,则缓存越大越好。如果碎片化的小文件比较多,缓存容量只需要适量即可满足需求。
7.缓存也分是不是持久?
刘晓宇:正常情况下,缓存是持久化存储在磁盘内的。如果遇到集群重启,读写失败或扩容等问题,作为缓存的这些数据,都会存在的。当第二次集群发起的时候,会通过进程把这些持久化的数据重新加载起来。
8.元数据缓存是在本地存储还是在云端?
刘晓宇:目前,缓存元数据留在本地是一个比较好的选择。如果元数据上云,可能面临的情况会更多更复杂一些。
9.对象存储的数据要根据业务进行切分吗?还是在缓存层切分?
刘晓宇:MPP写到对象存储上的数据不需要根据业务进行切分。缓存系统是按照块来缓存的,所以可以根据用户需要的数据按需取相应的数据块即可。
10.通过网络如果请求没有到达对象存储应该怎么办?
刘晓宇:如果请求最终没有到达对象存储,会因为超时触发重试机制重新再次发送请求。如果对象存储给来返回码比如http code 500,可能当前对象存储压力过大,产品会做算法上的调整延后发送请求,然后再次重试发送该请求。
11.如果元数据缓存在本地,怎么能够保证节点间一致性及节点故障的可靠性?
刘晓宇:元数据缓存到本地,是通过Foundationdb去控制,这部分有可靠的保证,而且缓存是跟着事务去运行,HashData会有一套机制去保证缓存的一致性。
12.存储层结构是底层采用对象存储,上层对资源进行分片,保障全数据类型的支持、拓展能力、高可用和高持久,能否举例详细说明?
刘晓宇:首先,因为我们通过缓存层,构建了统一的存储层,存储层可以保证所有的计算集群去访问缓存文件,从一定程度上解决了资源孤岛的问题。
此外,对于大量集群访问,HashData会根据计算集群的规模进行分片存储,其他节点可以也同时访问这些文件,互相不会影响。
在底层的存储方面,HashData采用对象存储,支持多集群同时访问一个文件,整个架构能适配更多的云。
同时,对于对象存储,HashData做了大量的优化,包括对存储数据的格式、多线程、动态调整数据包大小等,这些优化都可以对访问存储层带来更高的性能。
13.磁盘故障后,对象存储怎样控制数据的恢复速度?
申国斌:我们的数据重构速度很快。很多人会有疑问,重构速度很快是否会影响业务。我们内置了多种不同的模式,包括自适应、业务优先、恢复优先等。根据不同的场景选择不同的恢复模式,可以在确保业务运行的基础上实现数据的尽快恢复。
14.基于对象存储的底座构建云数仓的好处是什么,现在是主流趋势吗?
申国斌:存算分离的架构需要对存储底座做选型。云数仓的特点是规模很大,对扩展性的要求很高。我们的集群可以拓展到4096个点,保证大规模数据存得下。此外,我们在并发访问的支持、前端应用的调用等方面,由于接口间接,以及采用成本可控的分布式架构,相比块存储和NAS存储有很大优势,对象存储因此是云数仓的主流趋势底座。
15.对象存储相比于HDFS有什么优势?
申国斌:HDFS默认采用三副本,整体成本更高。对象可以采用纠删方法,可以实现更高的利用率。HDFS适合存储大文件,更适合Hadoop的非结构化场景。数仓中小文件的场景很多,不适合HDFS。数仓通常将HDFS作为数据导入的入口,而不是存储的底座。