当前位置: 首页 > 科技观察

GitLabonCockroachDB和YugabyteDB的兼容性对比:系统初始化

时间:2023-03-12 13:20:16 科技观察

1.测试背景GitLab是国际上非常流行的源代码管理工具。在早期版本中,用户可以选择使用MySQL或PostgreSQL数据库,但从12.1.0版本开始,官方已经完全放弃了对MySQL的支持。新版GitLab的很多功能都是基于PostgreSQL的特性开发的,是一款以PostgreSQL为底层数据存储的标杆产品。让我们想象一下这种用户场景。一个大集团,分成很多事业部。每个业务部门甚至一个小团队都可能维护自己的GitLab。如何在集团层面对这些仓库进行管理成为一个棘手的问题。例如:版本问题(开源版本和商业版本,高版本和低版本)细粒度的权限控制数据备份基础设施利用率如果有一个统一的GitLab环境,具有良好的扩展性和高可用性,无疑是最好的解决方案。而传统的单机PostgreSQL数据库无法满足上述要求。可以考虑在分布式数据库上运行GitLab吗?CockroachDB和YugabyteDB是比较知名的新型开源分布式数据库,实现了PG协议。根据他们官网的描述:CockroachDB支持PostgreSQL有线协议和大多数PostgreSQL语法。这意味着基于PostgreSQL构建的现有应用程序通常可以在不更改应用程序代码的情况下迁移到CockroachDB。(原文出处见参考资料)YugabyteDB是一个高性能、云原生的分布式SQL数据库,旨在支持所有PostgreSQL特性。(原文出处见参考资料)CockroachDB说它支持大多数PGs语法,YugabyteDB说它支持所有PG特性。本系列评测文章用于比较这两个数据库对GitLab的支持程度,一定程度上可以反映出对标准PostgreSQL的兼容性。二、测试环境1、CockroachDBdefaultdb=#selectversion();版本---------------------------------------------------------------CockroachDBCCLv21.2.2(x86_64-unknown-linux-gnu,构建于2021/12/0114:35:45,go1.16.6)(1行)2.YugabyteDBpostgres=#selectversion();版本-------------------------------------------------------------------------------x86_64-pc-linux-gnu上的PostgreSQL11.2-YB-2.9.1.0-b0,由gcc(Homebrewgcc5.5.0_4)5.5.0编译,64位(1行)3.GitLabGitLabinformationVersion:12.1.0-eeRevision:1f2e6f3f6d8Directory:/home/git/gitlabDBAdapter:PostgreSQL使用标准PostgreSQL部署的GitLab中包含的数据库模式是:gitlab_production=#selectC.relkind,count(C.relname)frompg_classCleftjoinpg_namespacenonn.oid=C.relnamespacewheren.nspname='public'groupbyC.relkind;亲情|计数--------+--------r|249我|903小号|231(3行)3.CockroachDB启动过程1.数据库初始化执行生成GitLab设置程序所需的内容库表结构:dc@dc-virtual-machine:/home/git/gitlab$sudo-ugit-Hbundleexecrakegitlab:setupRAILS_ENV=production这将创建必要的数据库表并为数据库播种。您将丢失任何以前的数据存储在数据库中。是否要继续(是/否)?yesDroppeddatabase'gitlab'Createddatabase'gitlab'--enable_extension("pg_trgm")rakeaborted!ActiveRecord::StatementInvalid:PG::FeatureNotSupported:ERROR:unimplemented:extension"pg_trgm"isnotyetsupportedHINT:你试图使用一个尚未实现的功能。请参阅:https://go.crdb.dev/issue-v/51137/v21.2:如果不存在则创建扩展“pg_trgm”/home/git/gitlab/config/initializers/peek。rb:18:in`async_exec_params'/home/git/gitlab/config/initializers/peek.rb:18:in`exec_params'/home/git/gitlab/vendor/bundle/ruby/2.6.0/gems/activerecord-5.2.3/lib/active_record/connection_adapters/postgresql_adapter.rb:611:in`block(2levels)inexec_no_cache'....从上面的输出信息可以看到,GItLab初始化需要依赖PostgreSQL的Extension特性,可惜CockroachDB目前还不支持,第一步就失败了。此时数据库中没有创建对象:gitlab=#selectC.relkind,count(C.relname)frompg_classCleftjoinpg_namespacenonn.oid=C.relnamespacewheren.nspname='public'group通过C.relkind;空集2.访问GitLab当我们访问GitLab主页面时,会返回502错误信息:fromthelog,因为SQL执行时找不到目标表:ActiveRecord::StatementInvalid:PG::UndefinedTable:ERROR:relation“geo_nodes”不存在:SELECTa.attname,format_type(a.atttypid,a.atttypmod),pg_get_expr(d.adbin,d.adrelid),a.attnotnull,a.atttypid,a.atttypmod,c.collname,col_description(a.attrelid,a.attnum)AScommentFROMpg_attributeaLEFTJOINpg_attrdefdONa.attrelid=d.adrelidANDa.attnum=d.adnumLEFTJOINpg_typetONa.atttypid=t.oidLEFTJOINpg_collat??ioncONa.attcollat??ion=c.oidANDa.attcollat??ion<>t.typcollat??ionWHEREa.attrelid='"geo_nodes"'::regclassANDa.attnum>0ANDNOTa.attisdroppedORDERBYa.attnum3。更新数据库版本考虑到目前的CockroachDB不是最新版本,有没有可能最新版本已经支持扩展功能,尝试升级版本到latest-v22.1:defaultdb=#selectversion();版本---------------------------------------------------------CockroachDBCCLv22.1.0(x86_64-pc-linux-gnu,内置2022/05/2316:27:47,go1.17.6)(1row)再次执行setupcreationDatabase,发现同样的问题"ActiveRecord::StatementInvalid:PG::FeatureNotSupported:ERROR:unimplemented:extension"pg_trgm"isnotyetsupported”,表示新版本不支持扩展功能四、YugabyteDB启动过程1、数据库初始化修改GitLab配置文件,将数据库连接切换到YugabyteDB,同样的方法初始化一个新库:dc@dc-virtual-machine:/home/git/gitlab$sudo-ugit-Hbundleexecrakegitlab:setupRAILS_ENV=production这将创建必要的数据库表并为数据库设置种子。您将丢失数据库中存储的所有先前数据。你想继续吗(是/否)?yesDroppeddatabase'gitlab'Createddatabase'gitlab'--enable_extension("pg_trgm")->2.5496s--enable_extension("plpgsql")->0.1143s--create_table("abuse_reports",{:id=>:serial,:force=>:cascade})->0.3709s--create_table("appearances",{:id=>:serial,:force=>:cascade})->0.3022s...--create_table("issue_tracker_data",{:force=>:cascade})->3.7627s--create_table("issues",{:id=>:serial,:force=>:cascade})rakeaborted!ActiveRecord::StatementInvalid:PG::InternalError:错误:尚不支持索引方法“ybgin”提示:请参阅https://github.com/YugaByte/yugabyte-db/issues/1337。单击描述上的“+”以提高其优先级:使用gin(“description”gin_trgm_ops)/home/git/gitlab/vendor/bundle/ruby/2.6.0/gems/peek-在“问题”上创建索引“index_issues_on_description_trigram”pg-1.3.0/lib/peek/views/pg.rb:17:in`async_exec'/home/git/gitlab/vendor/bundle/ruby/2.6.0/gems/peek-pg-1.3.0/lib/peek/views/pg.rb:17:in`async_exec'从上面的输出信息可以看出,一开始setup运行正常,可以正常创建extension和table。大约20分钟后,索引创建失败,因为YugabyteDB无法识别“gin”类型的索引,更换类型为“ybgin”,查看这一步数据库中生成了哪些对象:gitlab=#selectC.relkind,count(C.relname)frompg_classCleftjoinpg_namespacenonn.oid=C.relnamespacewheren.nspname='public'groupbyC.relkind;亲情|计数--------+--------S|113我|391转|117(3行)看起来比CockroachDB好,但仍然比完整的库表结构差很多。2.访问GitLab此时GitLab的主页面还是无法访问。从日志中发现错误原因是缺少targettable:source=rack-timeoutid=7gatOugcqB8timeout=60000msstate=readyStartedGET"/"for10.3.74.126at2022-05-2716:05:31+0800RootController#index作为HTML处理完成78毫秒内的500内部服务器错误(ActiveRecord:58.8毫秒|Elasticsearch:0.0毫秒)ActiveRecord::StatementInvalid(PG::UndefinedTable:错误:关系“项目”不存在第8行:WHEREa.attrelid='"projects"'::regclass^:SELECTa.attname,format_type(a.atttypid,a.atttypmod),pg_get_expr(d.adbin,d.adrelid),a.attnotnull,.atttypid,一个.atttypmod,c.collname,col_description(a.attrelid,a.attnum)AScommentFROMpg_attributeaLEFTJOINpg_attrdefdONa.attrelid=d.adrelidANDa.attnum=d.adnumLEFTJOINpg_typetONa.atttypid=t.oid左连接pg_collat??ioncONa.attcollat??ion=c.oidANDa.attcollat??ion<>t.typcollat??ionWHEREa.attrelid='"projects"'::regclassANDa.attnum>0ANDNOTa.attisdroppedORDERBYa.attnum):3.更新数据库版本同样,我们尝试将YugabytesDB升级到最新版本,看看是否已经完成Gin索引兼容:postgres=#selectversion();版本-------------------------------------------------------------------------------------------------------------------------------------------------------------x86_64-pc上的PostgreSQL11.2-YB-2.13.2.0-b0-linux-gnu,clang版本12.0.1编译(https://github.com/yugabyte/llvm-project.gitbdb147e675d8c87cee72cc1f87c4b82855977d94),64位(1行)再次执行setup程序,过程比较顺利,大约30分钟后,程序正常退出,没有错误这个时候我们看一下数据库中的对象:gitlab=#selectC.relkind,count(C.relname)frompg_classCleftjoinpg_namespacenonn.oid=C.relnamespacewheren.nspname='public'按C.relkind分组;亲情|计数--------+--------S|231我|903转|249(3行)可以看出与标准PostgreSQL库的对比是完全一样的。打开浏览器访问GitLab主页,会自动跳转到登录页面。查看日志无误:填写用户注册表并提交新用户注册成功后,会自动跳转到GitLab主页面:最初GitLab功能不受切换数据库的影响,更详细的测试将在下一期为大家呈现。五、测试结论1、CockroachDBv21.2不支持Extension功能,导致GitLab初始化数据库失败,最终无法启动。更新到最新版本v22.1后,问题依旧。2、YugabyteDBv2.9不支持GinIndex(Generalizedinvertedindexes),导致创建部分表后报错,也无法启动,更新到最新版本v2.13后,问题解决,GitLab页面和注册用户可以正常访问。3、YugabyteDB支持PostgreSQLExtension,但CockroachDB不支持。参考资料PostgreSQL兼容性https://www.cockroachlabs.com/docs/v21.1/postgresql-compatibility.htmlyugabyte/yugabyte-dbhttps://github.com/yugabyte/yugabyte-db作者简介神州数码集团高级经理何傲开发工程师,长期从事技术研发、数据库运维和系统架构,分布式技术爱好者,TiDB社区技术布道者。目前专注于分布式数据库领域的研究与应用,负责神州数码TiDB团队的项目交付、技术咨询、生态研发、团队管理等工作。