第二届华为云数据库挑战赛参赛总结

2024-03-28 15:32

本文主要是介绍第二届华为云数据库挑战赛参赛总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

        • 1. 赛题分析
        • 2. 程序结构及存储结构设计
          • 2.1 分区策略
          • 2.2 存储结构&索引结构
        • 3. 读写实现
        • 4. 细节优化
        • 5. Java的不足
        • 6. 总结

继上次参加第五届中间件性能挑战赛之后,又一次参加类似的工程类性能比赛,和上次的TSDB题目类似,本次是实现多版本的KV数据库,由于上次的遗憾出局(复赛第七),这次抱着破釜成舟一定要拿奖的的心态,最终结果也算比较满意(复赛第五,Java语言最高分)。

1. 赛题分析

本次比赛需实现一个多版本的KV数据库引擎,写入为随机写,查询功能为MinV~NV Delta的累加结果,同时需支持进程奔溃级的故障恢复。本赛题的读写比例为7:1,需寻找合适的数据组织方式来最小化写入和查询IO的总耗时。

赛题介绍

代码地址

2. 程序结构及存储结构设计
2.1 分区策略

评测程序是30/15个线程并发的发送数据,读写同时在进行。由于key可能在多个线程中出现,为了减少一次查询的IO次数,我们在写入时让相同的key放入一个文件。但是如果全局单文件的话同步消耗不可忽视。因此我们决定基于key进行分区。最多30个线程写,理想情况下,同一时间每个线程写不同的文件,因此将分区定为30。文件Id为hash(key)%30。

由于索引结构中包含了key/version,因此查询时不需要文件中的key/version,所以在一个分区下我们将key/version存入一个文件,delta存一个文件,查询时只需读取delta文件。

2.2 存储结构&索引结构

为了让读取尽量能够在一次IO中完成,我们采用了随机写delta数据的方式,尽量将相同的key紧凑的存储,将文件分为多个page,page的大小固定,如果一个key的delta超过了page的阈值,则顺序开辟一个page存放此key的delta,一个page中只会存放一个key的delta。

key和version采用顺序追加写,同时每个key/version后面追加一个delta的偏移坐标。一个分区Bucket的结构如下图所示:
在这里插入图片描述

Key/ Version文件有两个作用

  1. 故障恢复时构建内存索引。
  2. 当数据总量大至索引无法在内存中存放,可以将key/version文件排序,在内存中构建稀疏索引,采用二分查找来查询所需的key和 version。

由于索引数据可以全放入内存,相比于B+树,Hash索引更具有查询优势。因此采用基本LongObjectHashMap充当索引,即Key -> Versions的映射,Versions保存了key所有的v,以及该key所拥有的pages。

3. 读写实现

写入接口的传入的是一个package,我们对package中相同的key进行压缩合并,同时和可能溢出int,但是不会超过long,因此对合并之后的delta进行压缩。然后逐个遍历不同的key,通过hash(key)取得key的分区Id,根据当前分区的索引判断key是否需要开辟一个page,如果不需要就将delta追加至已存在的page中。否则就开辟新page,并且将新的page位置添加至索引中。key/version/off追加至id.key文件。

key只会在一个文件中,只需找到相应的bucket中的Map索引,遍历Versions中的version即可,因为delta是聚集存储,基本上一次IO即可完成查询。

  • 压缩

    Package中可能有多个相同的key,由于Package内共享一个version,因此可以认为相同的key的delta可以累加为1个。n个key的field占用空间M = (32 + log2n)*64 /8

4. 细节优化
  1. 缓存

    由于写入和读取在引擎侧基本都是内存复用,评测结束还有3.5G左右的内存空闲,但是由于评测程序占用内存的峰值在2G左右,我们采用了通用的1.8G固定大小的缓存。还有些没有采用的定向优化方案,比如二阶段写入时缓存替换、绕过峰值追加缓存等等

  2. JVM gc参数调优

  • 调大年轻代老年代的比例,减少Full GC次数,线上Full gc由于之前1:1 的至少三次降至最多一次

  • 使用-XX:+UseAdaptiveSizePolicy`自适应调节STW和吞吐

    最终gc的耗时在4秒左右

  1. 减少索引的内存占用,复用对象等。
5. Java的不足

赛后我们也在想为什么与cpp的差距,往往Java和cpp的差距在于内存占用,本次比赛中cpp的程序总共占用在1.5G以内,包括测评程序。而Java的内存占用在3G左右,导致的差距就是缓存的容量,cpp可以缓存2.5G,而Java最多可缓存1.8G的数据。

6. 总结

从第一个版本的900秒至最后的85秒,这是一个对赛题认知的过程,比赛就是比赛,当然能做到工程化的扩展是加分项,但是如果连决赛都进不去,那就毫无意义了。

这篇关于第二届华为云数据库挑战赛参赛总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/855993

相关文章

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Java读取InfluxDB数据库的方法详解

《Java读取InfluxDB数据库的方法详解》本文介绍基于Java语言,读取InfluxDB数据库的方法,包括读取InfluxDB的所有数据库,以及指定数据库中的measurement、field、... 首先,创建一个Java项目,用于撰写代码。接下来,配置所需要的依赖;这里我们就选择可用于与Infl

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

SQL Server数据库磁盘满了的解决办法

《SQLServer数据库磁盘满了的解决办法》系统再正常运行,我还在操作中,突然发现接口报错,后续所有接口都报错了,一查日志发现说是数据库磁盘满了,所以本文记录了SQLServer数据库磁盘满了的解... 目录问题解决方法删除数据库日志设置数据库日志大小问题今http://www.chinasem.cn天发

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O