GitLab在YugabyteDB和TiDB For PostgreSQL上的兼容性对比

测试背景

GitLab是一款在全球范围内都非常流行的源代码管理工具,早期的版本当中用户可以选择使用MySQL或PostgreSQL两种数据库,但是从12.1.0版本开始官方就完全放弃了对MySQL的支持。

GitLab新版本中很多功能都基于PostgreSQL的特性开发,它是众多使用了PostgreSQL作为底层数据存储的标杆产品。

我们试想一下这种用户场景,某大型集团分为众多事业部,每个事业部甚至小团队可能都维护了自己的GitLab,从集团层面如何管理这些仓库就成了棘手的问题。比如:

  • 版本问题(开源版和商业版,高版本和低版本)
  • 精细化权限控制
  • 数据备份
  • 基础设施利用率

如果能有一套统一的GitLab环境,同时又具备良好的可扩展性和高可用性,那无疑是最好的解决方案。但是传统单机PostgreSQL数据库并不能满足以上需求,那能否考虑把GitLab跑在分布式数据库上?

在之前的文章中,我们已经对比了GitLab在CockroachDB和YugabyteDB上的兼容性表现,而国产分布式数据库TiDB的社区项目TiDB For PostgreSQL也已经兼容了大部分GitLab功能,参考资料:

在本文中,我们将选取一部分YugabyteDB和TiDB For PostgreSQL上的GitLab核心场景做一下兼容性以及性能对比,给GitLab运行在分布式数据库上提供更多参考价值。

测试环境

1、GitLab

配置项 说明
版本 12.1.0-ee
部署环境 Ubuntu 18.04 x86 16c 32G hdd

2、YugabyteDB

配置项 说明
版本 2.13.2.0
部署环境 3节点 CentOS 7.9 x86 4c 8G ssd
部署架构 3副本,Master和Tserver各三节点

3、TiDB For PostgreSQL

配置项 说明
版本 TiDB-v5.3.0 , PostgreSQL 12 compatible
部署环境 3节点 CentOS 7.9 x86 4c 8G hdd
部署架构 3副本,1个PD,1个TiDB,3个TiKV

4、Jmeter

配置项 说明
版本 5.4
部署环境 Windows 10 12c 16G

测试场景

场景类型 场景名称
读 (5) - Project List
- Project View
- Branch List
- Issue List
- Merge Request List
写 (3) - New Commit
- Create Branch
- Create Issue

针对每一个读场景,我们会压测4种不同的并发级别,分别是10、20、50、100,持续运行5分钟。

针对每一个写场景,会在前面4种并发级别的前提下分别测试1千个样本数据。

测试结果

1、Project List

并发量 TiDB For PostgreSQL YugabyteDB
99 Line(s) Throughput(/sec) Error(%) 99 Line(s) Throughput(/sec) Error(%)
10 1.901 10.7 0 1.685 11.8 0
20 4.283 9.9 0 4.05 11.6 0.14
50 8.254 9.6 0 14.955 11.1 0.44
100 12.617 9.6 0 21.186 10.6 0.46

结果分析:

  • TiDB For PostgreSQL这边随着并发量增加响应时间明显变大,但是吞吐量无法提升,10并发是本次测试的最好性能。
  • YugabyteDB也体现出相同的情况,并且错误率逐步上升。
  • 这个场景下GitLab运行在TiDB For PostgreSQL性能和稳定性稍微好一点。

2、Project View

并发量 TiDB For PostgreSQL YugabyteDB
99 Line(s) Throughput(/sec) Error(%) 99 Line(s) Throughput(/sec) Error(%)
10 4.164 5.9 0 3.014 6.1 0
20 8.745 5.4 0 5.272 5.8 0
50 13.718 5.4 0.42 11.557 6.3 0
100 21.998 5.4 1.45 17.912 6.5 0

结果分析:

  • TiDB For PostgreSQL还是在10并发压力下表现出最佳性能。
  • YugabyteDB也体现出相同的情况,但是响应时间要稍小一点,吞吐量更大,这个差距比较稳定。
  • 这个场景下GitLab运行在YugabyteDB上性能更好。

3、Branch List

并发量 TiDB For PostgreSQL YugabyteDB
99 Line(s) Throughput(/sec) Error(%) 99 Line(s) Throughput(/sec) Error(%)
10 2.687 7.3 0 1.541 11.8 0
20 6.101 6.8 0 3.515 11.2 0
50 11.043 6.6 0 6.642 11.2 0
100 18.3 6.7 0 12.076 11 0
结果分析:
  • TiDB For PostgreSQL同样在10并发时有最佳性能。
  • YugabyteDB整体趋势一致,但是响应时间和吞吐量明显要优于TiDB4PG。
  • 这个场景下GitLab运行在YugabyteDB上性能更好。

4、Issue List

并发量 TiDB For PostgreSQL YugabyteDB
99 Line(s) Throughput(/sec) Error(%) 99 Line(s) Throughput(/sec) Error(%)
10 1.696 11.8 0 1.56 12.2 0
20 3.613 10.8 0 2.871 13.5 0
50 7.155 11.1 0 5.966 12.7 0
100 12.06 11 0 9.769 12.8 0
结果分析:
  • 和上一场景类似,在这个场景中GitLab运行在YugabyteDB上性能更好,不过差距并不明显。

5、Merge Request List

并发量 TiDB For PostgreSQL YugabyteDB
99 Line(s) Throughput(/sec) Error(%) 99 Line(s) Throughput(/sec) Error(%)
10 1.975 10.9 0 1.355 13.5 0
20 3.838 9.9 0 3.222 12.7 0
50 8.057 9.9 0 6.34 11.7 0
100 13.437 9.7 0 10.426 11.9 0
结果分析:
  • 两边趋势一致,YugabyteDB测试结果要优于TiDB4PG,差距不是很大。

6、New Commit

并发量 TiDB For PostgreSQL YugabyteDB
99 Line(s) Throughput(/min) Error(%) 99 Line(s) Throughput(/min) Error(%)
10 2.357 52.2 0 2.304 52.7 0
20 2.323 52.3 0 2.271 53.8 0
50 2.391 51.3 0 2.366 53.2 0
100 2.361 51 0 2.338 52.1 0

结果分析:
并发量对两边的影响都不大,响应时间和吞吐量都很平稳,两者性能几乎无差别。

7、Create Branch

并发量 TiDB For PostgreSQL YugabyteDB
99 Line(s) Throughput(/sec) Error(%) 99 Line(s) Throughput(/sec) Error(%)
10 4.08 3.9 0 15.186 3.2 0
20 8.386 4.1 0 27.249 3.2 1.5
50 59.681 1.8 51.3 67.882 1.8 42.6
100 100.633 3.2 75.9 60.061 7.4 82.6

结果分析:

  • 在并发量比较小的时候TiDB For PostgreSQL性能比YugabyteDB明显要好一些,并发加大后两边错误率都快速上升。

8、Create Issue

并发量 TiDB For PostgreSQL YugabyteDB
99 Line(s) Throughput(/sec) Error(%) 99 Line(s) Throughput(/sec) Error(%)
10 - - 100 17.284 6.39 69.1
20 - - 100 10.818 11 79.5
50 - - 100 5.877 20 92.60
100 - - 100 10.084 21.8 93.4

结果分析:

  • TiDB For PostgreSQL还无法支持创建Issue,错误率100%。
  • YugabyteDB可以创建Issue,但是有比较高的错误率。

总结

在本次测试结果中,大部分场景里GitLab运行在YugabyteDB上要比TiDB For PostgreSQL性能稍好一些,一定程度上能作为这两种数据库的性能参考,同时在兼容性上TiDB For PostgreSQL还有不支持的功能。

但是有一些原因可能也会影响了测试结果,包括两边的铺底数据有差异、仓库大小差异等,因为在以上测试场景中不仅仅涉及数据库读写,还有很大一部分的文件操作。

另一方面,从两者的底层架构来看,YugabyteDB的计算和存储层都在TServer节点中,对比TiDB For PostgreSQL的部署结构相当于至少少了2次网络请求,这也是影响压测结果的因素之一。

TiDB For PostgreSQL还在持续完善当中,这一份测试结果也能在产品开发上提供指导方向。