测试背景
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还在持续完善当中,这一份测试结果也能在产品开发上提供指导方向。