我们如何提高我们的DB同步性能| JFrog x射线

博士TL;
我们都想要快速开发任何东西。因此,当一个“简单”的数据库同步过程需要很长时间时,我们需要跳出固有的思维模式。下面是我们在JFrog Xray中实现的解决方案,以提高我们的DB性能,将同步时间从16小时减少到2小时!
什么是JFrog x射线
首先,在我们深入研究挑战和解决方案之前,让我们回顾一下是什么JFrog x光.JFrog x射线是一个工具DevSecOps团队,用于深入了解软件应用程序中的开源组件。通过对JFrog Artifactory存储库中存储的工件进行深度递归扫描,Xray可以识别安全漏洞这有助于确保许可遵从性使用为组织定义的策略。
x射线现在如何工作
为了扫描漏洞并验证许可证合合性,Xray使用了一个包含许多公共组件、漏洞和许可证的大型数据库。当安装x光第一次,有一个初始DB同步,下载和存储所有已知的公共数据x射线,这是公共信息的中央知识库。
今天,这个数据库的压缩大小大约是6GB,并且每天都在增长。要提取下载的数据,在保存到Xray数据库时需要45GB的磁盘空间。为了将这些数据存储到Postgres数据库中,Xray提取了100MB的zip文件,并分析了zip文件中的json文件中的2000个对象。这过去要花近15个小时!具有最低的系统要求。
*图像信用
可能的解决方案
为了应对这一挑战,Xray团队考虑了几种具有类似行为的不同解决方案。第一个解决方案是将已经存在的数据作为数据库表分发,而不是在用户端重新创建数据。在这种情况下,我们最终会有更多的数据作为软件的一部分进行分发。另一种选择是使用在线服务器获取有关组件和漏洞的信息,这可能会花费大量时间。第三种选择是混合选择,即为使用较少的组件建立一个中央数据库,并分发常用组件。所以,我们决定把这三种解决方案结合起来。
从调查步骤开始
为了研究当前状态,我们使用pprof工具.pprof的一部分是CPU分析器吗gperftools由谷歌开发,用于分析多线程应用程序。Pprof能够生成程序调用图的graphviz可视化。结果表明,Xray在数据库操作上花费了大量时间。下面是一个pprof图的例子:

示例pprof图
我们发现了许多单条目插入,而不是批量插入,例如:
INSERT INTO VALUES (a,b,c)
我们可以使用:
插入表值(a, b, c), d, e, f, g, h,我)…
改善# 1:最大的挑战是将这种改进整合到我们的代码中,因此我们创建了一个小队列来处理特定的持续时间或大小。
聚合
我们内部聚集了go通道中的对象,并每500毫秒或100个对象耗尽它们。
这是我们所做的主要改进之一。包括之前的所有更改和这次更改,我们测量到与初始时间相比大约有60%的性能改进。
初始DB同步vs每日DB同步
改进初始数据库同步非常重要。最初,DB是空的,我们知道99%的对象被添加而没有更新。因此……
改善# 2:我们选择了一种乐观的方法,即尝试插入数据,而不是选择对象并相应地工作。这有助于通过减少几个小时来提高性能。
然而,每日同步是另一个故事,因为我们已经有一个包含组件和漏洞信息的DB(这不是我们第一次运行它),我们希望确保该DB自动或手动更新任何新的漏洞。
我们爱工人
今天,XraY使用不同的工人,如以下三种:
- Zip文件工作者
- Json文件工作者
- 组件/漏洞工作者(json文件中的实体)
改善# 3: Xray使用worker并行读取原始文件,而不是并行读取一个文件上的组件,这有助于我们保持服务器工作。zip文件包含100MB,其中包含有2000个实体的json文件。
帮助我们减少指数
由于我们插入了大量的数据并且是乐观的(记住,我们只是为初始的DB同步添加了它),所以我们在过程结束时对最大的表应用了以下方法。改善# 4:通过创建表的数据的批量加载来填充最大的表,使用copy,然后我们创建表所需的索引。你们可能知道已存在数据的索引创建比在加载每一行时增量地更新它更快。

JFrog x射线性能改进总结
总结
希望这些改进可以帮助您解决您可能正在经历的类似行为。敬请期待更多x射线的改进。
想了解更多关于DB改进的信息吗?观看我们在swapamp上的演讲,DevOps用户会议>
