我们如何提高我们的DB同步性能| JFrog Xray

我们如何提高数据库同步性能

博士TL;

我们都想让一切都发展得超级快。因此,当像“简单的”数据库同步过程这样的事情需要花费很长时间时,我们需要跳出框框思考。以下是我们在JFrog Xray中实现的解决方案,以提高数据库性能,将同步时间从16小时减少到2小时!

什么是JFrog x射线

首先,在我们深入研究挑战和解决方案之前,让我们回顾一下什么是挑战和解决方案JFrog x光。JFrog Xray是一个工具DevSecOps团队,用于深入了解软件应用程序中的开源组件。通过对存储在JFrog工件存储库中的工件进行深度递归扫描,Xray识别安全漏洞并帮助确保许可遵从性使用为组织定义的策略。

今天的x射线是如何工作的

为了扫描漏洞并验证许可证合规性,Xray使用了一个包含许多公共组件、漏洞和许可证的大数据库。当安装x光这是第一次有一个初始的数据库同步,它下载并存储所有已知的公共数据,这是公共信息的中央知识库。

今天,这个数据库的压缩大小大约是6GB,并且每天都在增长。在保存到x射线数据库时,提取下载的数据需要45GB的磁盘空间。为了将这些数据存储到Postgres数据库中,Xray提取了100MB的zip文件,并分析了zip文件中的json文件中的2000个对象。过去这几乎要花15个小时!具有最低的系统要求。

等待*图像信用

可能的解决方案

为了应对这一挑战,Xray团队考虑了几种具有相似行为的不同解决方案。第一种解决方案是将已经存在的数据作为数据库表分发,而不是在用户端重新创建数据。在这种情况下,我们最终会有更多的数据作为我们软件的一部分来分发。另一种选择是使用在线服务器获取有关组件和漏洞的信息,这可能需要花费大量时间。第三种选择是混合选择,即为使用较少的组件建立一个中央数据库,并分发通用组件。因此,我们决定将这三种解决方案结合起来。

从调查步骤开始

要调查当前状态,我们使用pprof工具pprof的一部分是CPU分析器吗gperftools由谷歌开发,用于分析多线程应用程序。Pprof具有生成程序调用图的图形可视化的能力。结果表明,Xray在数据库操作上花费了大量时间。下面是一个pprof图的例子:

示例pprof图

示例pprof图

我们发现许多单条目插入,而不是批量插入,例如:

插入表VALUES (a,b,c)

我们可以用:

插入表值(a, b, c), d, e, f, g, h,我)…

改善# 1最大的挑战是将这种改进整合到我们的代码中,因此我们创建了一个小队列来处理特定的持续时间或大小。

聚合

我们在内部将对象聚合到go通道中,并每500毫秒或100个对象排出它们。

这是我们所做的主要改进之一。包括所有以前的更改和这次更改在内,我们测量到的性能比原始时间提高了大约60%。

初始数据库同步vs每日数据库同步

改进初始数据库同步非常重要。最初,DB是空的,我们知道99%的对象是添加的,没有更新。因此……
改善# 2:我们选择采用一种乐观的方法,尝试插入数据,而不是选择对象并相应地工作。通过减少几个小时,这有助于提高性能。

然而,每日同步是一个不同的故事,因为我们已经有一个数据库包含有关组件和漏洞的信息(这不是我们第一次运行它),我们想要确保这个数据库自动或手动更新任何新的漏洞。

我们爱员工

今天,XraY使用以下三种不同的工人:

  1. Zip文件工人
  2. Json文件工作者
  3. 组件/漏洞工作器(json文件中的实体)

改善# 3Xray使用worker并行读取原始文件,而不是并行读取一个文件上的组件,这有助于我们保持服务器工作。zip文件有100MB,其中包含有2000个实体的json文件。

人口,帮助我们减少索引

由于我们插入了大量的数据并且是乐观的(请记住,我们仅为初始DB同步添加了数据),因此我们在流程结束时对最大的表应用了以下方法。改善# 4:通过使用复制创建带有表数据批量加载的表来填充最大的表,然后创建表所需的索引。你们可能知道对预先存在的数据创建索引比加载每行时增量更新更快。

JFrog x射线性能改进总结

JFrog x射线性能改进总结

总结

希望这些改进可以帮助您解决您可能遇到的类似行为。敬请期待更多的x射线改进。

想了解更多关于数据库改进的信息吗?观看我们在swampUP (DevOps用户大会)上的演讲>