<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: dcopensource</title>
    <description>The latest articles on Forem by dcopensource (@dcopensource).</description>
    <link>https://forem.com/dcopensource</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F874114%2F8c600aff-3380-4b89-a759-525941b1471b.png</url>
      <title>Forem: dcopensource</title>
      <link>https://forem.com/dcopensource</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dcopensource"/>
    <language>en</language>
    <item>
      <title>Performance comparison of TiDB For PostgreSQL and YugabyteDB on Sysbench</title>
      <dc:creator>dcopensource</dc:creator>
      <pubDate>Wed, 06 Jul 2022 02:56:23 +0000</pubDate>
      <link>https://forem.com/dcopensource/performance-comparison-of-tidb-for-postgresql-and-yugabytedb-on-sysbench-4cao</link>
      <guid>https://forem.com/dcopensource/performance-comparison-of-tidb-for-postgresql-and-yugabytedb-on-sysbench-4cao</guid>
      <description>&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;PostgreSQL is a well-known open source database product. As a digital infrastructure, it plays an important role in large-scale enterprise applications. Many of its advanced features are widely used in various complex scenarios.&lt;/p&gt;

&lt;p&gt;According to the &lt;a href="https://survey.stackoverflow.co/2022/" rel="noopener noreferrer"&gt;Stack Overflow 2022 Developer Survey Report&lt;/a&gt;, PostgreSQL has surpassed MySQL as the favorite database software for developers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0suvjecsyhrgx7ehm3wb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0suvjecsyhrgx7ehm3wb.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Distributed databases are the current development trend in the database field in recent years. Distributed databases based on the PostgreSQL protocol have produced excellent products such as CockroachDB and YugabyteDB, while the domestic popular distributed database TiDB only provides the MySQL protocol. Based on the open source TiDB, the Digital China technical team has developed a version of TiDB For PostgreSQL, which is compatible with mainstream applications. References:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zhuanlan.zhihu.com/p/379181280" rel="noopener noreferrer"&gt;TiDB for PostgreSQL - a small test&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zhuanlan.zhihu.com/p/383500491" rel="noopener noreferrer"&gt;TiDB for PostgreSQL Study Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zhuanlan.zhihu.com/p/448122284" rel="noopener noreferrer"&gt;TiDB for PostgreSQL compatible with GitLab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They both belong to the NewSQL category and implement the PG protocol, but there are still differences in the specific architecture implementation. We are very curious about how the performance of the two compares.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test program
&lt;/h2&gt;

&lt;p&gt;Prepare 3 physical machines to build a distributed database, respectively build a 3-node YugabyteDB cluster and a TiDB For PostgreSQL cluster, all of which are deployed with default parameters, and Haproxy is used as a load balancing proxy on the database. This can ensure that the deployment architecture of the two is as consistent as possible and reduce experimental errors.&lt;/p&gt;

&lt;p&gt;Deployment environment:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Machine name&lt;/th&gt;
&lt;th&gt;Parameters&lt;/th&gt;
&lt;th&gt;Remark&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;database node-1&lt;/td&gt;
&lt;td&gt;physical machine，NUC 10 x86，12c 64G 1Tssd&lt;/td&gt;
&lt;td&gt;yugabytedb：1 master、1 tserver  tidb4pg：1 pd、1 tidb、1 tikv&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;database node-2&lt;/td&gt;
&lt;td&gt;physical machine，NUC 10 x86，12c 64G 1Tssd&lt;/td&gt;
&lt;td&gt;Ditto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;database node-3&lt;/td&gt;
&lt;td&gt;physical machine，NUC 10 x86，12c 64G 1Tssd&lt;/td&gt;
&lt;td&gt;Ditto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sysbench&lt;/td&gt;
&lt;td&gt;virtual machine，x86，16c 32G&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Haproxy&lt;/td&gt;
&lt;td&gt;virtual machine，x86，8c 16G&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Sysbench stress test selects 7 common scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;select_random_points (random check)&lt;/li&gt;
&lt;li&gt;oltp_read_only (read-only transaction)&lt;/li&gt;
&lt;li&gt;oltp_write_only (write-only transaction)&lt;/li&gt;
&lt;li&gt;oltp_read_write (read-write mixed transaction)&lt;/li&gt;
&lt;li&gt;oltp_update_index (with index update)&lt;/li&gt;
&lt;li&gt;oltp_update_non_index (without index update)&lt;/li&gt;
&lt;li&gt;oltp_delete (transaction delete)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each of the above scenarios, set 5 different concurrency levels, namely 10, 50, 100, 200, and 300 threads, and continue the stress test for 5 minutes.&lt;/p&gt;

&lt;p&gt;Collect the QPS and 95% latency indicators in each test data to compare the two databases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test Results
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1、select_random_points
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Threads&lt;/th&gt;
&lt;th&gt;QPS（TiDB4PG）&lt;/th&gt;
&lt;th&gt;95% Latency（TiDB4PG）&lt;/th&gt;
&lt;th&gt;QPS（YugabyteDB）&lt;/th&gt;
&lt;th&gt;95% Latency（YugabyteDB）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;4044&lt;/td&gt;
&lt;td&gt;3.49&lt;/td&gt;
&lt;td&gt;2666&lt;/td&gt;
&lt;td&gt;5.47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;8398&lt;/td&gt;
&lt;td&gt;10.09&lt;/td&gt;
&lt;td&gt;5086&lt;/td&gt;
&lt;td&gt;15.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;8754&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;5429&lt;/td&gt;
&lt;td&gt;29.19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;9441&lt;/td&gt;
&lt;td&gt;36.89&lt;/td&gt;
&lt;td&gt;5541&lt;/td&gt;
&lt;td&gt;58.92&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;9785&lt;/td&gt;
&lt;td&gt;52.89&lt;/td&gt;
&lt;td&gt;5531&lt;/td&gt;
&lt;td&gt;92.42&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzdsshhxz8x547vc0xwvu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzdsshhxz8x547vc0xwvu.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Result analysis:&lt;/p&gt;

&lt;p&gt;In the enumeration scenario, TIDB For PostgreSQL is slightly ahead of YugabyteDB, and as the amount of concurrency increases, the gap is getting bigger and bigger.&lt;/p&gt;

&lt;h3&gt;
  
  
  2、oltp_read_only
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Threads&lt;/th&gt;
&lt;th&gt;QPS（TiDB4PG）&lt;/th&gt;
&lt;th&gt;95% Latency（TiDB4PG）&lt;/th&gt;
&lt;th&gt;QPS（YugabyteDB）&lt;/th&gt;
&lt;th&gt;95% Latency（YugabyteDB）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;8954&lt;/td&gt;
&lt;td&gt;20.74&lt;/td&gt;
&lt;td&gt;0.13&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;24262&lt;/td&gt;
&lt;td&gt;38.94&lt;/td&gt;
&lt;td&gt;0.15&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;25136&lt;/td&gt;
&lt;td&gt;78.60&lt;/td&gt;
&lt;td&gt;0.15&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;25267&lt;/td&gt;
&lt;td&gt;158.63&lt;/td&gt;
&lt;td&gt;0.14&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;25436&lt;/td&gt;
&lt;td&gt;240.02&lt;/td&gt;
&lt;td&gt;0.14&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Result analysis:&lt;/p&gt;

&lt;p&gt;The test results of this scenario are very different. The query performance of YugabyteDB is crushed, and TiDB For PostgreSQL is at a normal level.&lt;/p&gt;

&lt;p&gt;By analyzing the Sysbench source code, it is found that the read-only scenario mainly includes the following query SQL:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sbtest1&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;BETWEEN&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sbtest1&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;BETWEEN&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sbtest1&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;BETWEEN&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="k"&gt;order&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;distinct&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sbtest1&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;BETWEEN&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="k"&gt;order&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The execution of the 4 SQLs for range checking based on the primary key takes more than 400 seconds in total, and the result is very surprising. Take the first SQL as an example to analyze its execution plan:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Seq Scan on sbtest1  (cost=0.00..105.00 rows=1000 width=484) (actual time=9.968..127393.155 rows=1000 loops=1)
  Filter: ((id &amp;gt;= 1) AND (id &amp;lt;= 1000))
  Rows Removed by Filter: 9999000
Planning Time: 0.048 ms
Execution Time: 127393.919 ms


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;According to past experience, the primary key index scan should be used directly, but in fact, a full table scan is used, which is confusing.&lt;/p&gt;

&lt;p&gt;In order to verify whether the size of the query range is affected, I limited the query range of id to 1 to 10, and found that the execution plan is still the same. If the in query is used instead, the primary key index can be used.&lt;/p&gt;

&lt;p&gt;In contrast, the execution plan of TiDB For PostgreSQL is expected:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Projection_4    500.09  1000    root    
└─IndexLookUp_13    500.09  1000    root    
  ├─IndexRangeScan_11(Build)    500.09  1000    cop[tikv]   table:sbtest1, index:PRIMARY(id)
  └─TableRowIDScan_12(Probe)    500.09  1000    cop[tikv]   table:sbtest1


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The reason why YugabyteDB's range query efficiency is so low requires further analysis.&lt;/p&gt;

&lt;h3&gt;
  
  
  3、oltp_write_only
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Threads&lt;/th&gt;
&lt;th&gt;QPS（TiDB4PG）&lt;/th&gt;
&lt;th&gt;95% Latency（TiDB4PG）&lt;/th&gt;
&lt;th&gt;QPS（YugabyteDB）&lt;/th&gt;
&lt;th&gt;95% Latency（YugabyteDB）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;790&lt;/td&gt;
&lt;td&gt;90.78&lt;/td&gt;
&lt;td&gt;4309&lt;/td&gt;
&lt;td&gt;47.47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;3540&lt;/td&gt;
&lt;td&gt;104.84&lt;/td&gt;
&lt;td&gt;8427&lt;/td&gt;
&lt;td&gt;71.83&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;6486&lt;/td&gt;
&lt;td&gt;114.72&lt;/td&gt;
&lt;td&gt;8674&lt;/td&gt;
&lt;td&gt;92.42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;11414&lt;/td&gt;
&lt;td&gt;132.49&lt;/td&gt;
&lt;td&gt;11170&lt;/td&gt;
&lt;td&gt;150.29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;15133&lt;/td&gt;
&lt;td&gt;155.80&lt;/td&gt;
&lt;td&gt;12036&lt;/td&gt;
&lt;td&gt;211.60&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqtgvixggfdewsjlwak5h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqtgvixggfdewsjlwak5h.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Result analysis:&lt;/p&gt;

&lt;p&gt;There are 4 types of mixed writing scenarios, namely, index update, without index update, deletion, and insertion mentioned later. YugabyteDB has obvious performance advantages when the concurrency is small, but TiDB For PostgreSQL starts from 200 concurrency. Performance began to overtake, which can reflect slightly better stability.&lt;/p&gt;

&lt;h3&gt;
  
  
  4、oltp_read_write
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Threads&lt;/th&gt;
&lt;th&gt;QPS（TiDB4PG）&lt;/th&gt;
&lt;th&gt;95% Latency（TiDB4PG）&lt;/th&gt;
&lt;th&gt;QPS（YugabyteDB）&lt;/th&gt;
&lt;th&gt;95% Latency（YugabyteDB）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;2238&lt;/td&gt;
&lt;td&gt;104.84&lt;/td&gt;
&lt;td&gt;556&lt;/td&gt;
&lt;td&gt;3151.62&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;9790&lt;/td&gt;
&lt;td&gt;123.28&lt;/td&gt;
&lt;td&gt;1485&lt;/td&gt;
&lt;td&gt;3326&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;17454&lt;/td&gt;
&lt;td&gt;137.35&lt;/td&gt;
&lt;td&gt;1494&lt;/td&gt;
&lt;td&gt;6960&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;25119&lt;/td&gt;
&lt;td&gt;189.93&lt;/td&gt;
&lt;td&gt;1402&lt;/td&gt;
&lt;td&gt;14302&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;25967&lt;/td&gt;
&lt;td&gt;272.27&lt;/td&gt;
&lt;td&gt;1835&lt;/td&gt;
&lt;td&gt;22034&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Result analysis:&lt;/p&gt;

&lt;p&gt;The mixed read-write scenario is also affected by the YugabyteDB range query, and the overall performance is much worse than that of TiDB For PostgreSQL, reaching a bottleneck at 50 concurrency.&lt;/p&gt;

&lt;h3&gt;
  
  
  5、oltp_update_index
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Threads&lt;/th&gt;
&lt;th&gt;QPS（TiDB4PG）&lt;/th&gt;
&lt;th&gt;95% Latency（TiDB4PG）&lt;/th&gt;
&lt;th&gt;QPS（YugabyteDB）&lt;/th&gt;
&lt;th&gt;95% Latency（YugabyteDB）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;374&lt;/td&gt;
&lt;td&gt;36.24&lt;/td&gt;
&lt;td&gt;2227&lt;/td&gt;
&lt;td&gt;11.65&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;1630&lt;/td&gt;
&lt;td&gt;41.85&lt;/td&gt;
&lt;td&gt;3754&lt;/td&gt;
&lt;td&gt;21.89&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;2980&lt;/td&gt;
&lt;td&gt;45.79&lt;/td&gt;
&lt;td&gt;4266&lt;/td&gt;
&lt;td&gt;36.24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;5375&lt;/td&gt;
&lt;td&gt;50.11&lt;/td&gt;
&lt;td&gt;4845&lt;/td&gt;
&lt;td&gt;62.19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;7298&lt;/td&gt;
&lt;td&gt;55.82&lt;/td&gt;
&lt;td&gt;4964&lt;/td&gt;
&lt;td&gt;92.42&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy4fpc16udag0lgfspbyw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy4fpc16udag0lgfspbyw.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Result analysis:&lt;/p&gt;

&lt;p&gt;update_index is to update the index column according to the primary key. In this scenario, YugabyteDB has better performance when the concurrency is small, but as the concurrency increases, it will reach the performance bottleneck faster, and it will get worse and worse. TiDB For PostgreSQL is relatively stable.&lt;/p&gt;

&lt;h3&gt;
  
  
  6、oltp_update_non_index
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Threads&lt;/th&gt;
&lt;th&gt;QPS（TiDB4PG）&lt;/th&gt;
&lt;th&gt;95% Latency（TiDB4PG）&lt;/th&gt;
&lt;th&gt;QPS（YugabyteDB）&lt;/th&gt;
&lt;th&gt;95% Latency（YugabyteDB）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;415&lt;/td&gt;
&lt;td&gt;31.37&lt;/td&gt;
&lt;td&gt;6847&lt;/td&gt;
&lt;td&gt;2.03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;1988&lt;/td&gt;
&lt;td&gt;35.59&lt;/td&gt;
&lt;td&gt;17123&lt;/td&gt;
&lt;td&gt;4.65&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;3761&lt;/td&gt;
&lt;td&gt;37.56&lt;/td&gt;
&lt;td&gt;16246&lt;/td&gt;
&lt;td&gt;9.91&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;6910&lt;/td&gt;
&lt;td&gt;41.10&lt;/td&gt;
&lt;td&gt;18928&lt;/td&gt;
&lt;td&gt;20.37&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;9849&lt;/td&gt;
&lt;td&gt;43.39&lt;/td&gt;
&lt;td&gt;19896&lt;/td&gt;
&lt;td&gt;29.72&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxf36zohh2s02594xfrd2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxf36zohh2s02594xfrd2.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Result analysis:&lt;/p&gt;

&lt;p&gt;update_non_index is to update the non-index column according to the primary key. In this scenario, YugabyteDB leads TiDB For PostgreSQL by a large margin and continues to maintain it.&lt;/p&gt;

&lt;h3&gt;
  
  
  7、oltp_delete
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Threads&lt;/th&gt;
&lt;th&gt;QPS（TiDB4PG）&lt;/th&gt;
&lt;th&gt;95% Latency（TiDB4PG）&lt;/th&gt;
&lt;th&gt;QPS（YugabyteDB）&lt;/th&gt;
&lt;th&gt;95% Latency（YugabyteDB）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;364&lt;/td&gt;
&lt;td&gt;37.56&lt;/td&gt;
&lt;td&gt;2389&lt;/td&gt;
&lt;td&gt;10.84&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;1568&lt;/td&gt;
&lt;td&gt;43.39&lt;/td&gt;
&lt;td&gt;4269&lt;/td&gt;
&lt;td&gt;19.65&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;2899&lt;/td&gt;
&lt;td&gt;46.63&lt;/td&gt;
&lt;td&gt;4844&lt;/td&gt;
&lt;td&gt;33.12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;5380&lt;/td&gt;
&lt;td&gt;50.11&lt;/td&gt;
&lt;td&gt;5705&lt;/td&gt;
&lt;td&gt;56.84&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;7622&lt;/td&gt;
&lt;td&gt;54.83&lt;/td&gt;
&lt;td&gt;6146&lt;/td&gt;
&lt;td&gt;82.96&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fer8d3ob8kde5sbprgh9p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fer8d3ob8kde5sbprgh9p.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Result analysis:&lt;/p&gt;

&lt;p&gt;The delete scenario is to delete a row of records based on the primary key. The test results are similar to non-indexed updates. YugabyteDB performed better at the beginning, but gradually fell behind TiDB For PostgreSQL after the concurrency increased.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summarize
&lt;/h2&gt;

&lt;p&gt;After the tests of the above 7 scenarios, it is found that the two databases have their own advantages and disadvantages in performance.&lt;/p&gt;

&lt;p&gt;TiDB For PostgreSQL is better at read operations, and YugabyteDB is better at write operations, but as the database load increases, YugabyteDB's processing capability and stability for large concurrent requests are not as good as TiDB For PostgreSQL.&lt;/p&gt;

&lt;p&gt;We will make an in-depth comparison of the architecture and underlying principles of the two in the follow-up to see if we can find the real reason.&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>yugabytedb</category>
      <category>tidb</category>
      <category>sysbench</category>
    </item>
    <item>
      <title>Compatibility comparison of GitLab on YugabyteDB and TiDB For PostgreSQL</title>
      <dc:creator>dcopensource</dc:creator>
      <pubDate>Thu, 23 Jun 2022 02:15:26 +0000</pubDate>
      <link>https://forem.com/dcopensource/compatibility-comparison-of-gitlab-on-yugabytedb-and-tidb-for-postgresql-4b9l</link>
      <guid>https://forem.com/dcopensource/compatibility-comparison-of-gitlab-on-yugabytedb-and-tidb-for-postgresql-4b9l</guid>
      <description>&lt;h2&gt;
  
  
  Testing Background
&lt;/h2&gt;

&lt;p&gt;GitLab is a very popular source code management tool around the world. In earlier versions, users could choose to use MySQL or PostgreSQL databases, but since version 12.1.0, the official support for MySQL has been completely abandoned.&lt;/p&gt;

&lt;p&gt;Many functions in the new version of GitLab are developed based on the characteristics of PostgreSQL, which is a benchmark product for many using PostgreSQL as the underlying data storage.&lt;/p&gt;

&lt;p&gt;Let's imagine this user scenario. A large group is divided into many divisions. Each division or even a small team may maintain its own GitLab. How to manage these warehouses at the group level becomes a difficult problem. for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Version issues (open source version and commercial version, high version and low version)&lt;/li&gt;
&lt;li&gt;Fine-grained permission control&lt;/li&gt;
&lt;li&gt;data backup&lt;/li&gt;
&lt;li&gt;Infrastructure utilization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If there is a unified GitLab environment with good scalability and high availability, it is undoubtedly the best solution. However, the traditional stand-alone PostgreSQL database cannot meet the above requirements. Can you consider running GitLab on a distributed database?&lt;/p&gt;

&lt;p&gt;In previous articles, we have compared the compatibility performance of GitLab on CockroachDB and YugabyteDB. References:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/dcopensource/compatibility-of-gitlab-on-cockroachdb-and-yugabytedb-i-system-initialization-28m3"&gt;Compatibility comparison of GitLab on CockroachDB and YugabyteDB (1) - System initialization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dcopensource/compatibility-of-gitlab-on-cockroachdb-and-yugabytedb-ii-read-and-write-scenario-testing-33cg"&gt;GitLab's Compatibility Comparison on CockroachDB and YugabyteDB (2) - Read and Write Scenario Test&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The test results of the above two distributed databases compatible with the PG protocol are that YugabyteDB has better compatibility, while the domestic distributed database TiDB's community project &lt;a href="https://github.com/DigitalChinaOpenSource/TiDB-for-PostgreSQL" rel="noopener noreferrer"&gt;TiDB For PostgreSQL&lt;/a&gt; ) is also compatible with most GitLab functions, reference materials:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zhuanlan.zhihu.com/p/448122284" rel="noopener noreferrer"&gt;TiDB For PostgreSQL is compatible with GitLab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this article, we will select some core scenarios of GitLab on YugabyteDB and TiDB For PostgreSQL to compare the compatibility and performance, so as to provide more reference value for GitLab running on distributed databases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test Environment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. GitLab
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Configuration item&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Version&lt;/td&gt;
&lt;td&gt;12.1.0-ee&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment Environment&lt;/td&gt;
&lt;td&gt;Ubuntu 18.04 x86 16c 32G hdd&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  2. YugabyteDB
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Configuration item&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Version&lt;/td&gt;
&lt;td&gt;2.13.2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment Environment&lt;/td&gt;
&lt;td&gt;3 Node CentOS 7.9 x86 4c 8G ssd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment Architecture&lt;/td&gt;
&lt;td&gt;3 replicas, 3 nodes each for Master and Tserver&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  3. TiDB For PostgreSQL
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Configuration item&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Version&lt;/td&gt;
&lt;td&gt;TiDB-v5.3.0 , PostgreSQL 12 compatible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment Environment&lt;/td&gt;
&lt;td&gt;3 Node CentOS 7.9 x86 4c 8G hdd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment Architecture&lt;/td&gt;
&lt;td&gt;3 replicas, 1 PD, 1 TiDB, 3 TiKV&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  4. Jmeter
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Configuration item&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Version&lt;/td&gt;
&lt;td&gt;5.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment Environment&lt;/td&gt;
&lt;td&gt;Windows 10 12c 16G&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Test Scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scene Type&lt;/th&gt;
&lt;th&gt;Scene name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;read (5)&lt;/td&gt;
&lt;td&gt;- Project List &lt;br&gt;- Project View &lt;br&gt;- Branch List &lt;br&gt;- Issue List &lt;br&gt;- Merge Request List&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;write (3)&lt;/td&gt;
&lt;td&gt;- New Commit &lt;br&gt;- Create Branch &lt;br&gt;- Create Issue&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For each read scenario, we will stress test 4 different concurrency levels, namely 10, 20, 50, and 100, and run continuously for 5 minutes.&lt;/p&gt;

&lt;p&gt;For each write scenario, 1,000 sample data will be tested under the premise of the previous four concurrency levels.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test Results
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1、Project List
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
    &lt;tr&gt;
        &lt;th rowspan="2"&gt;Threads&lt;/th&gt;
        &lt;th colspan="3"&gt;TiDB For PostgreSQL&lt;/th&gt;
        &lt;th colspan="3"&gt;YugabyteDB&lt;/th&gt;  
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;th&gt;99 Line(s)&lt;/th&gt;
        &lt;th&gt;Throughput(/sec)&lt;/th&gt;
        &lt;th&gt;Error(%)&lt;/th&gt;  
        &lt;th&gt;99 Line(s)&lt;/th&gt;
        &lt;th&gt;Throughput(/sec)&lt;/th&gt;
        &lt;th&gt;Error(%)&lt;/th&gt;  
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;10&lt;/td&gt;
        &lt;td&gt;1.901&lt;/td&gt;
        &lt;td&gt;10.7&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;1.685&lt;/td&gt;
        &lt;td&gt;11.8&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;20&lt;/td&gt;
        &lt;td&gt;4.283&lt;/td&gt;
        &lt;td&gt;9.9&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;4.05&lt;/td&gt;
        &lt;td&gt;11.6&lt;/td&gt;
        &lt;td&gt;0.14&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;50&lt;/td&gt;
        &lt;td&gt;8.254&lt;/td&gt;
        &lt;td&gt;9.6&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;14.955&lt;/td&gt;
        &lt;td&gt;11.1&lt;/td&gt;
        &lt;td&gt;0.44&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;100&lt;/td&gt;
        &lt;td&gt;12.617&lt;/td&gt;
        &lt;td&gt;9.6&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;21.186&lt;/td&gt;
        &lt;td&gt;10.6&lt;/td&gt;
        &lt;td&gt;0.46&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fixwilg4l77dw6vszj4wd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fixwilg4l77dw6vszj4wd.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;（99% response time trend comparison, higher means longer time）&lt;/center&gt;

&lt;p&gt;Result analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The response time of TiDB For PostgreSQL increases significantly with the increase of concurrency, but the throughput cannot be improved. 10 concurrency is the best performance in this test.&lt;/li&gt;
&lt;li&gt;YugabyteDB also shows the same situation, and the error rate gradually increases.&lt;/li&gt;
&lt;li&gt;In this scenario, the performance and stability of GitLab running on TiDB For PostgreSQL is slightly better.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2、Project View
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
    &lt;tr&gt;
        &lt;th rowspan="2"&gt;Threads&lt;/th&gt;
        &lt;th colspan="3"&gt;TiDB For PostgreSQL&lt;/th&gt;
        &lt;th colspan="3"&gt;YugabyteDB&lt;/th&gt;  
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;th&gt;99 Line(s)&lt;/th&gt;
        &lt;th&gt;Throughput(/sec)&lt;/th&gt;
        &lt;th&gt;Error(%)&lt;/th&gt;  
        &lt;th&gt;99 Line(s)&lt;/th&gt;
        &lt;th&gt;Throughput(/sec)&lt;/th&gt;
        &lt;th&gt;Error(%)&lt;/th&gt;  
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;10&lt;/td&gt;
        &lt;td&gt;4.164&lt;/td&gt;
        &lt;td&gt;5.9&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;3.014&lt;/td&gt;
        &lt;td&gt;6.1&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;20&lt;/td&gt;
        &lt;td&gt;8.745&lt;/td&gt;
        &lt;td&gt;5.4&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;5.272&lt;/td&gt;
        &lt;td&gt;5.8&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;50&lt;/td&gt;
        &lt;td&gt;13.718&lt;/td&gt;
        &lt;td&gt;5.4&lt;/td&gt;
        &lt;td&gt;0.42&lt;/td&gt;
        &lt;td&gt;11.557&lt;/td&gt;
        &lt;td&gt;6.3&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;100&lt;/td&gt;
        &lt;td&gt;21.998&lt;/td&gt;
        &lt;td&gt;5.4&lt;/td&gt;
        &lt;td&gt;1.45&lt;/td&gt;
        &lt;td&gt;17.912&lt;/td&gt;
        &lt;td&gt;6.5&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmlrl3biunb4xn8c6g2i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmlrl3biunb4xn8c6g2i.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;（99% response time trend comparison, higher means longer time）&lt;/center&gt;

&lt;p&gt;Result analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TiDB For PostgreSQL still shows the best performance under 10 concurrency pressure.&lt;/li&gt;
&lt;li&gt;YugabyteDB also reflects the same situation, but the response time is slightly smaller, the throughput is larger, and the gap is relatively stable.&lt;/li&gt;
&lt;li&gt;GitLab runs better on YugabyteDB in this scenario.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3、Branch List
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
    &lt;tr&gt;
        &lt;th rowspan="2"&gt;Threads&lt;/th&gt;
        &lt;th colspan="3"&gt;TiDB For PostgreSQL&lt;/th&gt;
        &lt;th colspan="3"&gt;YugabyteDB&lt;/th&gt;  
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;th&gt;99 Line(s)&lt;/th&gt;
        &lt;th&gt;Throughput(/sec)&lt;/th&gt;
        &lt;th&gt;Error(%)&lt;/th&gt;  
        &lt;th&gt;99 Line(s)&lt;/th&gt;
        &lt;th&gt;Throughput(/sec)&lt;/th&gt;
        &lt;th&gt;Error(%)&lt;/th&gt;  
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;10&lt;/td&gt;
        &lt;td&gt;2.687&lt;/td&gt;
        &lt;td&gt;7.3&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;1.541&lt;/td&gt;
        &lt;td&gt;11.8&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;20&lt;/td&gt;
        &lt;td&gt;6.101&lt;/td&gt;
        &lt;td&gt;6.8&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;3.515&lt;/td&gt;
        &lt;td&gt;11.2&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;50&lt;/td&gt;
        &lt;td&gt;11.043&lt;/td&gt;
        &lt;td&gt;6.6&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;6.642&lt;/td&gt;
        &lt;td&gt;11.2&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;100&lt;/td&gt;
        &lt;td&gt;18.3&lt;/td&gt;
        &lt;td&gt;6.7&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;12.076&lt;/td&gt;
        &lt;td&gt;11&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Focxbd7sv6tdkicapxcag.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Focxbd7sv6tdkicapxcag.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;（99% response time trend comparison, higher means longer time）&lt;/center&gt;

&lt;p&gt;Result analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TiDB For PostgreSQL also has the best performance at 10 concurrency.&lt;/li&gt;
&lt;li&gt;The overall trend of YugabyteDB is consistent, but the response time and throughput are significantly better than TiDB4PG.&lt;/li&gt;
&lt;li&gt;GitLab runs better on YugabyteDB in this scenario.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4、Issue List
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
    &lt;tr&gt;
        &lt;th rowspan="2"&gt;Threads&lt;/th&gt;
        &lt;th colspan="3"&gt;TiDB For PostgreSQL&lt;/th&gt;
        &lt;th colspan="3"&gt;YugabyteDB&lt;/th&gt;  
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;th&gt;99 Line(s)&lt;/th&gt;
        &lt;th&gt;Throughput(/sec)&lt;/th&gt;
        &lt;th&gt;Error(%)&lt;/th&gt;  
        &lt;th&gt;99 Line(s)&lt;/th&gt;
        &lt;th&gt;Throughput(/sec)&lt;/th&gt;
        &lt;th&gt;Error(%)&lt;/th&gt;  
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;10&lt;/td&gt;
        &lt;td&gt;1.696&lt;/td&gt;
        &lt;td&gt;11.8&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;1.56&lt;/td&gt;
        &lt;td&gt;12.2&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;20&lt;/td&gt;
        &lt;td&gt;3.613&lt;/td&gt;
        &lt;td&gt;10.8&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;2.871&lt;/td&gt;
        &lt;td&gt;13.5&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;50&lt;/td&gt;
        &lt;td&gt;7.155&lt;/td&gt;
        &lt;td&gt;11.1&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;5.966&lt;/td&gt;
        &lt;td&gt;12.7&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;100&lt;/td&gt;
        &lt;td&gt;12.06&lt;/td&gt;
        &lt;td&gt;11&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;9.769&lt;/td&gt;
        &lt;td&gt;12.8&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5xmt50ayngopm58up86m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5xmt50ayngopm58up86m.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;（99% response time trend comparison, higher means longer time）&lt;/center&gt;

&lt;p&gt;Result analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Similar to the previous scenario, GitLab runs better on YugabyteDB in this scenario, but the difference is not significant.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5、Merge Request List
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
    &lt;tr&gt;
        &lt;th rowspan="2"&gt;Threads&lt;/th&gt;
        &lt;th colspan="3"&gt;TiDB For PostgreSQL&lt;/th&gt;
        &lt;th colspan="3"&gt;YugabyteDB&lt;/th&gt;  
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;th&gt;99 Line(s)&lt;/th&gt;
        &lt;th&gt;Throughput(/sec)&lt;/th&gt;
        &lt;th&gt;Error(%)&lt;/th&gt;  
        &lt;th&gt;99 Line(s)&lt;/th&gt;
        &lt;th&gt;Throughput(/sec)&lt;/th&gt;
        &lt;th&gt;Error(%)&lt;/th&gt;  
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;10&lt;/td&gt;
        &lt;td&gt;1.975&lt;/td&gt;
        &lt;td&gt;10.9&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;1.355&lt;/td&gt;
        &lt;td&gt;13.5&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;20&lt;/td&gt;
        &lt;td&gt;3.838&lt;/td&gt;
        &lt;td&gt;9.9&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;3.222&lt;/td&gt;
        &lt;td&gt;12.7&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;50&lt;/td&gt;
        &lt;td&gt;8.057&lt;/td&gt;
        &lt;td&gt;9.9&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;6.34&lt;/td&gt;
        &lt;td&gt;11.7&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;100&lt;/td&gt;
        &lt;td&gt;13.437&lt;/td&gt;
        &lt;td&gt;9.7&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;10.426&lt;/td&gt;
        &lt;td&gt;11.9&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flipg4stbo22etiagxcbk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flipg4stbo22etiagxcbk.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;（99% response time trend comparison, higher means longer time）&lt;/center&gt;

&lt;p&gt;Result analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The trend is the same on both sides. YugabyteDB's test results are better than TiDB4PG, and the gap is not very large.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6、New Commit
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
    &lt;tr&gt;
        &lt;th rowspan="2"&gt;Threads&lt;/th&gt;
        &lt;th colspan="3"&gt;TiDB For PostgreSQL&lt;/th&gt;
        &lt;th colspan="3"&gt;YugabyteDB&lt;/th&gt;  
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;th&gt;99 Line(s)&lt;/th&gt;
        &lt;th&gt;Throughput(/min)&lt;/th&gt;
        &lt;th&gt;Error(%)&lt;/th&gt;  
        &lt;th&gt;99 Line(s)&lt;/th&gt;
        &lt;th&gt;Throughput(/min)&lt;/th&gt;
        &lt;th&gt;Error(%)&lt;/th&gt;  
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;10&lt;/td&gt;
        &lt;td&gt;2.357&lt;/td&gt;
        &lt;td&gt;52.2&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;2.304&lt;/td&gt;
        &lt;td&gt;52.7&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;20&lt;/td&gt;
        &lt;td&gt;2.323&lt;/td&gt;
        &lt;td&gt;52.3&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;2.271&lt;/td&gt;
        &lt;td&gt;53.8&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;50&lt;/td&gt;
        &lt;td&gt;2.391&lt;/td&gt;
        &lt;td&gt;51.3&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;2.366&lt;/td&gt;
        &lt;td&gt;53.2&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;100&lt;/td&gt;
        &lt;td&gt;2.361&lt;/td&gt;
        &lt;td&gt;51&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;2.338&lt;/td&gt;
        &lt;td&gt;52.1&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flwtz503uhmj0p9xc1ot1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flwtz503uhmj0p9xc1ot1.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;（99% response time trend comparison, higher means longer time）&lt;/center&gt;

&lt;p&gt;Analysis results: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Concurrency has little effect on both sides, response time and throughput are stable, and there is almost no difference in performance between the two.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7、Create Branch
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
    &lt;tr&gt;
        &lt;th rowspan="2"&gt;Threads&lt;/th&gt;
        &lt;th colspan="3"&gt;TiDB For PostgreSQL&lt;/th&gt;
        &lt;th colspan="3"&gt;YugabyteDB&lt;/th&gt;  
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;th&gt;99 Line(s)&lt;/th&gt;
        &lt;th&gt;Throughput(/sec)&lt;/th&gt;
        &lt;th&gt;Error(%)&lt;/th&gt;  
        &lt;th&gt;99 Line(s)&lt;/th&gt;
        &lt;th&gt;Throughput(/sec)&lt;/th&gt;
        &lt;th&gt;Error(%)&lt;/th&gt;  
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;10&lt;/td&gt;
        &lt;td&gt;4.08&lt;/td&gt;
        &lt;td&gt;3.9&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;15.186&lt;/td&gt;
        &lt;td&gt;3.2&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;20&lt;/td&gt;
        &lt;td&gt;8.386&lt;/td&gt;
        &lt;td&gt;4.1&lt;/td&gt;
        &lt;td&gt;0&lt;/td&gt;
        &lt;td&gt;27.249&lt;/td&gt;
        &lt;td&gt;3.2&lt;/td&gt;
        &lt;td&gt;1.5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;50&lt;/td&gt;
        &lt;td&gt;59.681&lt;/td&gt;
        &lt;td&gt;1.8&lt;/td&gt;
        &lt;td&gt;51.3&lt;/td&gt;
        &lt;td&gt;67.882&lt;/td&gt;
        &lt;td&gt;1.8&lt;/td&gt;
        &lt;td&gt;42.6&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;100&lt;/td&gt;
        &lt;td&gt;100.633&lt;/td&gt;
        &lt;td&gt;3.2&lt;/td&gt;
        &lt;td&gt;75.9&lt;/td&gt;
        &lt;td&gt;60.061&lt;/td&gt;
        &lt;td&gt;7.4&lt;/td&gt;
        &lt;td&gt;82.6&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsx3pqfsghgc92jc9q6j4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsx3pqfsghgc92jc9q6j4.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;（99% response time trend comparison, higher means longer time）&lt;/center&gt;

&lt;p&gt;Result analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When the concurrency is relatively small, the performance of TiDB For PostgreSQL is significantly better than that of YugabyteDB, and the error rates on both sides increase rapidly after the concurrency is increased.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8、Create Issue
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
    &lt;tr&gt;
        &lt;th rowspan="2"&gt;Threads&lt;/th&gt;
        &lt;th colspan="3"&gt;TiDB For PostgreSQL&lt;/th&gt;
        &lt;th colspan="3"&gt;YugabyteDB&lt;/th&gt;  
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;th&gt;99 Line(s)&lt;/th&gt;
        &lt;th&gt;Throughput(/sec)&lt;/th&gt;
        &lt;th&gt;Error(%)&lt;/th&gt;  
        &lt;th&gt;99 Line(s)&lt;/th&gt;
        &lt;th&gt;Throughput(/sec)&lt;/th&gt;
        &lt;th&gt;Error(%)&lt;/th&gt;  
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;10&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;100&lt;/td&gt;
        &lt;td&gt;17.284&lt;/td&gt;
        &lt;td&gt;6.4&lt;/td&gt;
        &lt;td&gt;69.1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;20&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;100&lt;/td&gt;
        &lt;td&gt;10.818&lt;/td&gt;
        &lt;td&gt;11&lt;/td&gt;
        &lt;td&gt;79.5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;50&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;100&lt;/td&gt;
        &lt;td&gt;5.877&lt;/td&gt;
        &lt;td&gt;20&lt;/td&gt;
        &lt;td&gt;92.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;100&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;100&lt;/td&gt;
        &lt;td&gt;10.084&lt;/td&gt;
        &lt;td&gt;21.8&lt;/td&gt;
        &lt;td&gt;93.4&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Result analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TiDB For PostgreSQL cannot yet support the creation of Issues, and the error rate is 100%.&lt;/li&gt;
&lt;li&gt;YugabyteDB can create Issues, but in the case of concurrency, the error rate is also very high, and the response time is very long.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summarize
&lt;/h2&gt;

&lt;p&gt;In this test result, in most scenarios, GitLab running on YugabyteDB has slightly better performance than TiDB For PostgreSQL, which can be used as a performance reference for these two databases to a certain extent. At the same time, TiDB For PostgreSQL has some differences in compatibility. Supported features.&lt;/p&gt;

&lt;p&gt;However, there are some reasons that may also affect the test results, including differences in the underlying data on both sides, differences in warehouse size, etc., because the above test scenarios involve not only database reading and writing, but also a large part of file operations.&lt;/p&gt;

&lt;p&gt;On the other hand, from the perspective of the underlying architecture of the two, YugabyteDB's computing and storage layers are both in the TServer node. Compared with the deployment structure of TiDB For PostgreSQL, it is equivalent to at least 2 fewer network requests, which is also a factor that affects the stress test results. one.&lt;/p&gt;

&lt;p&gt;TiDB For PostgreSQL is still in the process of continuous improvement, and this test result can also provide guidance for product development.&lt;/p&gt;

</description>
      <category>gitlab</category>
      <category>yugabytedb</category>
      <category>tidb</category>
      <category>postgres</category>
    </item>
    <item>
      <title>Compatibility of GitLab on CockroachDB and YugabyteDB (II) - Read and Write Scenario Testing</title>
      <dc:creator>dcopensource</dc:creator>
      <pubDate>Wed, 08 Jun 2022 07:08:37 +0000</pubDate>
      <link>https://forem.com/dcopensource/compatibility-of-gitlab-on-cockroachdb-and-yugabytedb-ii-read-and-write-scenario-testing-33cg</link>
      <guid>https://forem.com/dcopensource/compatibility-of-gitlab-on-cockroachdb-and-yugabytedb-ii-read-and-write-scenario-testing-33cg</guid>
      <description>&lt;h2&gt;
  
  
  Testing Background
&lt;/h2&gt;

&lt;p&gt;GitLab is a globally popular source code management tool. In earlier versions, users could choose to use either MySQL or PostgreSQL, but since version 12.1.0, the official support for MySQL has been dropped completely.&lt;/p&gt;

&lt;p&gt;Many of the features in the new version of GitLab are based on PostgreSQL, which is the benchmark for many products that use PostgreSQL as the underlying data store.&lt;/p&gt;

&lt;p&gt;Imagine a scenario where a large group is divided into divisions and each division or even a small team may maintain its own GitLab, making it tricky to manage these repositories from the group level. For example.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Versioning issues (open source and commercial versions, high and low versions)&lt;/li&gt;
&lt;li&gt;Fine-grained permission control&lt;/li&gt;
&lt;li&gt;Data backups&lt;/li&gt;
&lt;li&gt;Infrastructure utilization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Having a unified GitLab environment with good scalability and high availability would certainly be the best solution. But the traditional standalone PostgreSQL database does not meet the above needs, so can we consider running GitLab on a distributed database?&lt;/p&gt;

&lt;p&gt;CockroachDB and YugabyteDB are relatively well-known new open source distributed databases that implement the PG protocol. This series of review articles is used to compare how well these two databases support GitLab, and to a certain extent reflects the compatibility with standard PostgreSQL.&lt;/p&gt;

&lt;p&gt;In the previous article &lt;a href="https://dev.to/dcopensource/compatibility-of-gitlab-on-cockroachdb-and-yugabytedb-i-system-initialization-28m3"&gt;"System Initialization"&lt;/a&gt;, we concluded that CockroachDB could not be started because it could not automatically create database schema through GitLab's setup program, while YugabyteDB could start GitLab normally with all normal initialization steps.&lt;/p&gt;

&lt;p&gt;In this test, we first imported a standard GitLab library and the underlying data into these two databases to see if GitLab could be started normally, and then we selected a part of GitLab's core business scenarios to do a comparison test to see how compatible they are.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test Environment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CockroachDB
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;  &lt;span class="n"&gt;defaultdb&lt;/span&gt;&lt;span class="o"&gt;=#&lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;version&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                                        &lt;span class="k"&gt;version&lt;/span&gt;
  &lt;span class="c1"&gt;------------------------------------------------------------------------------------&lt;/span&gt;
   &lt;span class="n"&gt;CockroachDB&lt;/span&gt; &lt;span class="n"&gt;CCL&lt;/span&gt; &lt;span class="n"&gt;v22&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gnu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;built&lt;/span&gt; &lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;47&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;go1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;YugabyteDB
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;  &lt;span class="n"&gt;gitlab&lt;/span&gt;&lt;span class="o"&gt;=#&lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;version&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                                                                                           &lt;span class="k"&gt;version&lt;/span&gt;
  &lt;span class="c1"&gt;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;/span&gt;
   &lt;span class="n"&gt;PostgreSQL&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;YB&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b0&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gnu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;compiled&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;clang&lt;/span&gt; &lt;span class="k"&gt;version&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;yugabyte&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;llvm&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;bdb147e675d8c87cee72cc1f87c4b82855977d94&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;bit&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;GitLab
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  GitLab information
  Version:        12.1.0-ee
  Revision:       1f2e6f3f6d8
  Directory:      /home/git/gitlab
  DB Adapter:     PostgreSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Test Scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scene Type&lt;/th&gt;
&lt;th&gt;Scene name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;read (9)&lt;/td&gt;
&lt;td&gt;- Project List &lt;br&gt;- Project View &lt;br&gt;- Repository View &lt;br&gt;- Branch List &lt;br&gt;- Issue List &lt;br&gt;- Issue View &lt;br&gt;- Merge Request List &lt;br&gt;- Merge Request View &lt;br&gt;- Project Members&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;write (8)&lt;/td&gt;
&lt;td&gt;- New Project &lt;br&gt;- GitLab Import &lt;br&gt;- New Commit &lt;br&gt;- Create Branch &lt;br&gt;- Create Issue &lt;br&gt;- Create Merge Request &lt;br&gt;- PR Merge &lt;br&gt;- Add Project Member&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Testing Process
&lt;/h2&gt;

&lt;p&gt;To keep it simple, let's do the data migration directly using pg_dump.&lt;/p&gt;

&lt;p&gt;First, export the schema and data from the standard library to the sql file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pg_dump --host 10.3.70.132 --port 32298 --user postgres --no-owner -W gitlabhq_production &amp;gt; /root/gitlabhq_production.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. CockroachDB Data Migration
&lt;/h3&gt;

&lt;p&gt;Here the psql client is used to import the backed up sql, if an error occurs during execution it will be automatically skipped and the error message will be printed out as follows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;psql --host 10.3.70.189 --port 26258 --user root gitlab -f /root/gitlabhq_production.sql &amp;gt; pg_import_crdb.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observations from the output error messages contain the following two main categories.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Description:  source SQL:
CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public
                                            ^
Tip:  You have attempted to use a feature that is not yet implemented.
See: https://go.crdb.dev/issue-v/74777/v22.1
psql:/root/gitlabhq_production.sql:30: ERROR:  at or near "pg_trgm": syntax error: unimplemented: this syntax
Description:  source SQL:
COMMENT ON EXTENSION pg_trgm IS 'text similarity measurement and index searching based on trigrams'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The error reported above still says that extension is not compatible with the problem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Description:  You have attempted to use a feature that is not yet implemented.
See: https://go.crdb.dev/issue-v/47420/v22.1
psql:/root/gitlabhq_production.sql:31396: ERROR:  at or near ".": syntax error: unimplemented: this syntax
Tip:  source SQL:
CREATE INDEX index_issues_on_description_trigram ON public.issues USING gin (description public.gin_trgm_ops)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This error is due to the fact that CockroachDB does not support operator class yet, but these two errors are related to indexes and are not expected to have much impact on DML operations, so ignore them for now.&lt;/p&gt;

&lt;p&gt;Look at the database situation after the sql file is imported.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;gitlab&lt;/span&gt;&lt;span class="o"&gt;=#&lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relkind&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pg_class&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt; &lt;span class="k"&gt;left&lt;/span&gt; &lt;span class="k"&gt;join&lt;/span&gt; &lt;span class="n"&gt;pg_namespace&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relnamespace&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nspname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'public'&lt;/span&gt; &lt;span class="k"&gt;group&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relkind&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="n"&gt;relkind&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;
&lt;span class="c1"&gt;---------+-------&lt;/span&gt;
 &lt;span class="n"&gt;r&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;249&lt;/span&gt;
 &lt;span class="n"&gt;i&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;890&lt;/span&gt;
 &lt;span class="n"&gt;S&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;231&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="k"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Everything works except for about 10 indexes short. At this point&lt;/strong&gt;, point the GitLab database to this new repository, start the program and see if the page opens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; git &lt;span class="nt"&gt;-H&lt;/span&gt; editor config/database.yml
&lt;span class="nb"&gt;sudo&lt;/span&gt; /etc/init.d/gitlab restart


&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rack-timeout &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;oMeadFm1kN1 &lt;span class="nb"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;60000ms &lt;span class="nv"&gt;state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ready
Started GET &lt;span class="s2"&gt;"/users/sign_in"&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;10.3.74.126 at 2022-05-31 16:19:18 +0800
Processing by SessionsController#new as HTML
Completed 200 OK &lt;span class="k"&gt;in &lt;/span&gt;55ms &lt;span class="o"&gt;(&lt;/span&gt;Views: 32.3ms | ActiveRecord: 9.7ms | Elasticsearch: 0.0ms&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rack-timeout &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;oMeadFm1kN1 &lt;span class="nb"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;60000ms &lt;span class="nv"&gt;service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;291ms &lt;span class="nv"&gt;state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;completed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the logs, we can see that the login page jumps normally without errors. Then use the existing user to see if the login is successful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hqROVCkF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/5388d86867814009ac40d4cb17eddda9.gif%23pic_center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hqROVCkF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/5388d86867814009ac40d4cb17eddda9.gif%23pic_center" alt="Image description" width="880" height="550"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  2. YugabyteDB Data Migration
&lt;/h3&gt;

&lt;p&gt;Import the sql file into YugabyteDB in the same way as before.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;psql --host 10.3.70.189 --port 5434 --user postgres gitlab -f /root/gitlabhq_production.sql &amp;gt; pg_import_ygdb.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;About the implementation of more than 1 hour, the whole process did not report errors&lt;/strong&gt;, check the database object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;gitlab&lt;/span&gt;&lt;span class="o"&gt;=#&lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relkind&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pg_class&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt; &lt;span class="k"&gt;left&lt;/span&gt; &lt;span class="k"&gt;join&lt;/span&gt; &lt;span class="n"&gt;pg_namespace&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relnamespace&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nspname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'public'&lt;/span&gt; &lt;span class="k"&gt;group&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relkind&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="n"&gt;relkind&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;
&lt;span class="c1"&gt;---------+-------&lt;/span&gt;
 &lt;span class="n"&gt;S&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;231&lt;/span&gt;
 &lt;span class="n"&gt;i&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;903&lt;/span&gt;
 &lt;span class="n"&gt;r&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;249&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="k"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Consistent with the standard postgreSQL Schema.&lt;/p&gt;

&lt;p&gt;Modified the database connection and restarted GitLab, then tried to open the page to log in to the existing user, and found that the login was successful and jumped to the home page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iUEMYEnE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/7a7fe776a2274703a38a5fe8e959ea7f.gif%23pic_center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iUEMYEnE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/7a7fe776a2274703a38a5fe8e959ea7f.gif%23pic_center" alt="Image description" width="880" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Scene Comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scene Type&lt;/th&gt;
&lt;th&gt;CockroachDB&lt;/th&gt;
&lt;th&gt;YugabyteDB&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Project List&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Both are supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Project View&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CTtEg0gD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/64042881481b4666a04015dccecf14b1.gif%23pic_center" alt="" width="880" height="517"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t4ItiRW4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/020801c84a59493cacbacbed3dad1597.gif%23pic_center" alt="" width="880" height="512"&gt;&lt;/td&gt;
&lt;td&gt;Both are supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repository View&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h9lofV-M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/5642c43221214b6e906796e852c76665.gif%23pic_center" alt="" width="880" height="521"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wk3rEoPO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/80390c149797448b8e436c284ec0efdf.gif%23pic_center" alt="" width="880" height="519"&gt;&lt;/td&gt;
&lt;td&gt;Both are supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Branch List&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pfDOTA1A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/6134854bbaa949f9b3a2e59fd35ad832.gif%23pic_center" alt="" width="880" height="522"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PIO8gs-8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/b297d6390f6842cbb44646f001f842d3.gif%23pic_center" alt="" width="880" height="515"&gt;&lt;/td&gt;
&lt;td&gt;Both are supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Issue List&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hreDLtP9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/6f334d4d572c4935aaea267304ca3b7c.gif%23pic_center" alt="" width="880" height="518"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5l3g-VBQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/b8c0e89d466d4948b33ac0ff1d7b85e4.gif%23pic_center" alt="" width="" height=""&gt;&lt;/td&gt;
&lt;td&gt;Both are supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Issue View&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rqwxFs1N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/24ffa335abe14f689c703aa2ba007cd2.gif%23pic_center" alt="" width="880" height="517"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9kSbGunb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/5e05c193920645b9b6fbc7f196091e79.gif%23pic_center" alt="" width="880" height="540"&gt;&lt;/td&gt;
&lt;td&gt;Both are supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Merge Request List&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_-71GwaX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/512539fd044841ccbb5b98274030dc68.gif%23pic_center" alt="" width="880" height="519"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7wJuw1qf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/eb379bf48f43455ab10876342a21b469.gif%23pic_center" alt="" width="880" height="530"&gt;&lt;/td&gt;
&lt;td&gt;Both are supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Merge Request View&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8k7ZcLDZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/bc2559ba8b714f8e875da11b79a0007c.gif%23pic_center" alt="" width="880" height="518"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HbZGmgOr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/a545c1dcc3e3439e91acb041c723585e.gif%23pic_center" alt="" width="880" height="527"&gt;&lt;/td&gt;
&lt;td&gt;Both are supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Project Members&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zh4ZYJ5B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/5e8ed56367c84b91a6796391cbdf9556.gif%23pic_center" alt="" width="880" height="521"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XYdd5DpH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/8e13bb8b2b3943a1a5831cecb862bf65.gif%23pic_center" alt="" width="880" height="542"&gt;&lt;/td&gt;
&lt;td&gt;Both are supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New Project&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fTW3PqR0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/682678986eb24313bca0c2047ecda86e.gif%23pic_center" alt="" width="880" height="511"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qqZ3RiNt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/3996908a0e9f4a809f80198b366194e9.gif%23pic_center" alt="" width="880" height="512"&gt;&lt;/td&gt;
&lt;td&gt;CockroachDB: Go to the Create Project page and return 500 exceptions, logging the error message "ActionView::Template::Error (PG::UndefinedColumn: ERROR: column "namespaces.rowid" does not exist")&lt;br&gt;&lt;br&gt;YugabyteDB: It keeps loading after submitting the import request, observing the log without error, and jumping to the created project page after some time.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitLab Import&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4Ydx9e7L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/49d4b23d8f7048f3a73b7679d1a850c6.gif%23pic_center" alt="" width="880" height="485"&gt;&lt;/td&gt;
&lt;td&gt;CockroachDB: Can't go to the new project page, can't import project.&lt;br&gt;&lt;br&gt;YugabyteDB: It keeps loading after submitting the import request, and no error is reported in the log. I suspect it is a gitlab permission problem, I restarted the gitlab program with root user and imported successfully.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New Commit&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jiu9wPlZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/61a2300447844cf995b2808aad130d45.gif%23pic_center" alt="" width="880" height="517"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rHV2cdpn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/036c0688024949218d7a01f87474115e.gif%23pic_center" alt="" width="880" height="525"&gt;&lt;/td&gt;
&lt;td&gt;Both are supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create Branch&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AMr7ayZ0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/7c0071abd56446759584f433b698f70f.gif%23pic_center" alt="" width="880" height="515"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6vUUC3cJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/b35afa0bcfbf4647a257d47390a0e7e3.gif%23pic_center" alt="" width="880" height="528"&gt;&lt;/td&gt;
&lt;td&gt;Both are supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create Issue&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sRIVXOx9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/a76c79f5c0f84173a037b8019299b9ae.gif%23pic_center" alt="" width="880" height="514"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pEQ3scJ3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/2f505aac1142458699151d05a7a5a322.gif%23pic_center" alt="" width="880" height="540"&gt;&lt;/td&gt;
&lt;td&gt;Both are supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create Merge Request&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--obi2HWvD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/b3e7ecd9aa3845228071da9c531cef68.gif%23pic_center" alt="" width="880" height="522"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rwffjiTx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/342ad1a9d28049c2be2681503bae93ec.gif%23pic_center" alt="" width="880" height="524"&gt;&lt;/td&gt;
&lt;td&gt;Both are supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PR Merge&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---phGWyBP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/8d6af1b9c2d54f108e67ca479c648db9.gif%23pic_center" alt="" width="880" height="515"&gt;&lt;/td&gt;
&lt;td&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LcHkpasW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/66c1173189d940cc97d29a701a270703.gif%23pic_center" alt="" width="880" height="528"&gt; &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yFGwXYWR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/493067a77940453d817e5069bcb98199.gif%23pic_center" alt="" width="880" height="512"&gt;
&lt;/td&gt;
&lt;td&gt;CockroachDB and YugabyteDB have the same situation.&lt;br&gt;&lt;br&gt;After submitting the merge request, the page continues to load, and after a period of time, the page shows an error message and cannot submit merge again, and there is no exception in the log.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add Project Member&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eIHJC8By--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/3b91377878c4401793a866b4cb5a9849.gif%23pic_center" alt="" width="880" height="520"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xJ2C5Eyx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://img-blog.csdnimg.cn/77d1ca0d0e97470cb6504cf586ab8cc0.gif%23pic_center" alt="" width="880" height="542"&gt;&lt;/td&gt;
&lt;td&gt;Both are supported&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Test  Conclusion
&lt;/h2&gt;

&lt;p&gt;1、CockroachDB has 3 final failures in all tested scenarios, which are New Project, Import Existing GitLab Project, PR Merge.&lt;/p&gt;

&lt;p&gt;2、YugabyteDB has 1 final failure in all the tested scenarios, namely PR Merge.&lt;/p&gt;

&lt;p&gt;From the results of this test, YugabyteDB is more compatible with GitLab. It is necessary to further investigate whether the PR Merge error is related to the database.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Next Step
&lt;/h2&gt;

&lt;p&gt;The next step will be to analyze and locate the problems found in this test, and then try to minimally modify the Gitlab source code to see if it is compatible with the test failure scenario.&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>gitlab</category>
      <category>yugabyted</category>
      <category>cockroachdb</category>
    </item>
    <item>
      <title>Compatibility of GitLab on CockroachDB and YugabyteDB (I) - System Initialization</title>
      <dc:creator>dcopensource</dc:creator>
      <pubDate>Wed, 08 Jun 2022 06:52:33 +0000</pubDate>
      <link>https://forem.com/dcopensource/compatibility-of-gitlab-on-cockroachdb-and-yugabytedb-i-system-initialization-28m3</link>
      <guid>https://forem.com/dcopensource/compatibility-of-gitlab-on-cockroachdb-and-yugabytedb-i-system-initialization-28m3</guid>
      <description>&lt;h2&gt;
  
  
  Testing Background
&lt;/h2&gt;

&lt;p&gt;GitLab is a globally popular source code management tool. In earlier versions, users could choose to use either MySQL or PostgreSQL, but since version 12.1.0, the official support for MySQL has been dropped completely.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QlpdONnM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/47v3diqiois9431gf4dy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QlpdONnM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/47v3diqiois9431gf4dy.png" alt="Image description" width="880" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Many of the features in the new version of GitLab are based on PostgreSQL, which is the benchmark for many products that use PostgreSQL as the underlying data store.&lt;/p&gt;

&lt;p&gt;Imagine a scenario where a large group is divided into divisions and each division or even a small team may maintain its own GitLab, making it tricky to manage these repositories from the group level. For example.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Versioning issues (open source and commercial versions, high and low versions)&lt;/li&gt;
&lt;li&gt;Fine-grained permission control&lt;/li&gt;
&lt;li&gt;Data backups&lt;/li&gt;
&lt;li&gt;Infrastructure utilization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Having a unified GitLab environment with good scalability and high availability would certainly be the best solution. But the traditional standalone PostgreSQL database does not meet the above needs, so can we consider running GitLab on a distributed database?&lt;/p&gt;

&lt;p&gt;CockroachDB and YugabyteDB are relatively well-known new open source distributed databases that implement the PG protocol, and according to the descriptions on their respective official websites.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;CockroachDB supports the PostgreSQL wire protocol and the majority of PostgreSQL syntax. This means that existing applications built on PostgreSQL can often be migrated to CockroachDB without changing application code. （&lt;a href="https://www.cockroachlabs.com/docs/v21.1/postgresql-compatibility.html"&gt;reference&lt;/a&gt;）&lt;/p&gt;

&lt;p&gt;YugabyteDB is a high-performance, cloud-native distributed SQL database that aims to support all PostgreSQL features. （&lt;a href="https://github.com/yugabyte/yugabyte-db"&gt;reference&lt;/a&gt;）&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;CockroachDB says it supports most PG syntax, and YugabyteDB says it supports all PG features. This series of review articles is used to compare how well these two databases support GitLab, and to a certain extent reflects the compatibility with standard PostgreSQL.&lt;/p&gt;
&lt;h2&gt;
  
  
  Test Environment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CockroachDB
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;  &lt;span class="n"&gt;defaultdb&lt;/span&gt;&lt;span class="o"&gt;=#&lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;version&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                                           &lt;span class="k"&gt;version&lt;/span&gt;
  &lt;span class="c1"&gt;-----------------------------------------------------------------------------------------&lt;/span&gt;
   &lt;span class="n"&gt;CockroachDB&lt;/span&gt; &lt;span class="n"&gt;CCL&lt;/span&gt; &lt;span class="n"&gt;v21&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;unknown&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gnu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;built&lt;/span&gt; &lt;span class="mi"&gt;2021&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;go1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;YugabyteDB
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;  &lt;span class="n"&gt;postgres&lt;/span&gt;&lt;span class="o"&gt;=#&lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;version&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                                                    &lt;span class="k"&gt;version&lt;/span&gt;
  &lt;span class="c1"&gt;------------------------------------------------------------------------------------------------------------&lt;/span&gt;
   &lt;span class="n"&gt;PostgreSQL&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;YB&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b0&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gnu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;compiled&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;gcc&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Homebrew&lt;/span&gt; &lt;span class="n"&gt;gcc&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;_4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;bit&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;GitLab
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  GitLab information
  Version:        12.1.0-ee
  Revision:       1f2e6f3f6d8
  Directory:      /home/git/gitlab
  DB Adapter:     PostgreSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;GitLab deployed with standard PostgreSQL contains the following database schema:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;  &lt;span class="n"&gt;gitlab_production&lt;/span&gt;&lt;span class="o"&gt;=#&lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relkind&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pg_class&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt; &lt;span class="k"&gt;left&lt;/span&gt; &lt;span class="k"&gt;join&lt;/span&gt; &lt;span class="n"&gt;pg_namespace&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relnamespace&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nspname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'public'&lt;/span&gt; &lt;span class="k"&gt;group&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relkind&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="n"&gt;relkind&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;
  &lt;span class="c1"&gt;---------+-------&lt;/span&gt;
   &lt;span class="n"&gt;r&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;249&lt;/span&gt;
   &lt;span class="n"&gt;i&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;903&lt;/span&gt;
   &lt;span class="n"&gt;S&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;231&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="k"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  CockroachDB Startup Process
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Database initialization
&lt;/h3&gt;

&lt;p&gt;Execute the GitLab setup program to generate the required database schema.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dc@dc-virtual-machine:/home/git/gitlab&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; git &lt;span class="nt"&gt;-H&lt;/span&gt; bundle &lt;span class="nb"&gt;exec &lt;/span&gt;rake gitlab:setup &lt;span class="nv"&gt;RAILS_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production
This will create the necessary database tables and seed the database.
You will lose any previous data stored &lt;span class="k"&gt;in &lt;/span&gt;the database.
Do you want to &lt;span class="k"&gt;continue&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;yes&lt;/span&gt;/no&lt;span class="o"&gt;)&lt;/span&gt;? &lt;span class="nb"&gt;yes

&lt;/span&gt;Dropped database &lt;span class="s1"&gt;'gitlab'&lt;/span&gt;
Created database &lt;span class="s1"&gt;'gitlab'&lt;/span&gt;
&lt;span class="nt"&gt;--&lt;/span&gt; enable_extension&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"pg_trgm"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
rake aborted!
ActiveRecord::StatementInvalid: PG::FeatureNotSupported: ERROR:  unimplemented: extension &lt;span class="s2"&gt;"pg_trgm"&lt;/span&gt; is not yet supported
HINT:  You have attempted to use a feature that is not yet implemented.
See: https://go.crdb.dev/issue-v/51137/v21.2
: CREATE EXTENSION IF NOT EXISTS &lt;span class="s2"&gt;"pg_trgm"&lt;/span&gt;
/home/git/gitlab/config/initializers/peek.rb:18:in &lt;span class="sb"&gt;`&lt;/span&gt;async_exec_params&lt;span class="s1"&gt;'
/home/git/gitlab/config/initializers/peek.rb:18:in `exec_params'&lt;/span&gt;
/home/git/gitlab/vendor/bundle/ruby/2.6.0/gems/activerecord-5.2.3/lib/active_record/connection_adapters/postgresql_adapter.rb:611:in &lt;span class="sb"&gt;`&lt;/span&gt;block &lt;span class="o"&gt;(&lt;/span&gt;2 levels&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;exec_no_cache&lt;span class="s1"&gt;'
....
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see from the output above, &lt;strong&gt;GitLab initialization relies on PostgreSQL's Extension feature, but unfortunately CockroachDB does not currently support it, and fails in the first step&lt;/strong&gt;, when no objects are created in the database.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;gitlab&lt;/span&gt;&lt;span class="o"&gt;=#&lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relkind&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pg_class&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt; &lt;span class="k"&gt;left&lt;/span&gt; &lt;span class="k"&gt;join&lt;/span&gt; &lt;span class="n"&gt;pg_namespace&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relnamespace&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nspname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'public'&lt;/span&gt; &lt;span class="k"&gt;group&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relkind&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;Empty&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Visit GitLab
&lt;/h3&gt;

&lt;p&gt;When we visit the main GitLab page it will return a 502 error message.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RLyevxPr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c7o0cjy57zrb0tr9aoas.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RLyevxPr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c7o0cjy57zrb0tr9aoas.png" alt="Image description" width="880" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the logs, it is because the SQL execution could not find the target table when it reported the error.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation &lt;span class="s2"&gt;"geo_nodes"&lt;/span&gt; does not exist
:               SELECT a.attname, format_type&lt;span class="o"&gt;(&lt;/span&gt;a.atttypid, a.atttypmod&lt;span class="o"&gt;)&lt;/span&gt;,
                     pg_get_expr&lt;span class="o"&gt;(&lt;/span&gt;d.adbin, d.adrelid&lt;span class="o"&gt;)&lt;/span&gt;, a.attnotnull, a.atttypid, a.atttypmod,
                     c.collname, col_description&lt;span class="o"&gt;(&lt;/span&gt;a.attrelid, a.attnum&lt;span class="o"&gt;)&lt;/span&gt; AS comment
                FROM pg_attribute a
                LEFT JOIN pg_attrdef d ON a.attrelid &lt;span class="o"&gt;=&lt;/span&gt; d.adrelid AND a.attnum &lt;span class="o"&gt;=&lt;/span&gt; d.adnum
                LEFT JOIN pg_type t ON a.atttypid &lt;span class="o"&gt;=&lt;/span&gt; t.oid
                LEFT JOIN pg_collation c ON a.attcollation &lt;span class="o"&gt;=&lt;/span&gt; c.oid AND a.attcollation &amp;lt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; t.typcollation
               WHERE a.attrelid &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'"geo_nodes"'&lt;/span&gt;::regclass
                 AND a.attnum &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 0 AND NOT a.attisdropped
               ORDER BY a.attnum
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Update database version
&lt;/h3&gt;

&lt;p&gt;Considering that the current version of CockroachDB is not the latest version, is it possible that the latest version already supports extension function, try to upgrade the version to latest-v22.1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;defaultdb&lt;/span&gt;&lt;span class="o"&gt;=#&lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;version&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                                      &lt;span class="k"&gt;version&lt;/span&gt;
&lt;span class="c1"&gt;------------------------------------------------------------------------------------&lt;/span&gt;
 &lt;span class="n"&gt;CockroachDB&lt;/span&gt; &lt;span class="n"&gt;CCL&lt;/span&gt; &lt;span class="n"&gt;v22&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gnu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;built&lt;/span&gt; &lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;47&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;go1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Executing setup again to create the database, I still find the same problem "&lt;strong&gt;ActiveRecord::StatementInvalid: PG::FeatureNotSupported: ERROR: unimplemented: extension "pg_trgm " is not yet supported&lt;/strong&gt;", indicating that the extension feature is not supported in the new version either.&lt;/p&gt;

&lt;h2&gt;
  
  
  YugabyteDB Startup Process
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Database initialization
&lt;/h3&gt;

&lt;p&gt;Modify the GitLab configuration file to switch the database connection to YugabyteDB and initialize a new repository in the same way.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dc@dc-virtual-machine:/home/git/gitlab&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; git &lt;span class="nt"&gt;-H&lt;/span&gt; bundle &lt;span class="nb"&gt;exec &lt;/span&gt;rake gitlab:setup &lt;span class="nv"&gt;RAILS_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production
This will create the necessary database tables and seed the database.
You will lose any previous data stored &lt;span class="k"&gt;in &lt;/span&gt;the database.
Do you want to &lt;span class="k"&gt;continue&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;yes&lt;/span&gt;/no&lt;span class="o"&gt;)&lt;/span&gt;? &lt;span class="nb"&gt;yes

&lt;/span&gt;Dropped database &lt;span class="s1"&gt;'gitlab'&lt;/span&gt;
Created database &lt;span class="s1"&gt;'gitlab'&lt;/span&gt;
&lt;span class="nt"&gt;--&lt;/span&gt; enable_extension&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"pg_trgm"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
   -&amp;gt; 2.5496s
&lt;span class="nt"&gt;--&lt;/span&gt; enable_extension&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"plpgsql"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
   -&amp;gt; 0.1143s
&lt;span class="nt"&gt;--&lt;/span&gt; create_table&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"abuse_reports"&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt;:id&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;:serial, :force&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;:cascade&lt;span class="o"&gt;})&lt;/span&gt;
   -&amp;gt; 0.3709s
&lt;span class="nt"&gt;--&lt;/span&gt; create_table&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"appearances"&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt;:id&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;:serial, :force&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;:cascade&lt;span class="o"&gt;})&lt;/span&gt;
   -&amp;gt; 0.3022s
...
...
&lt;span class="nt"&gt;--&lt;/span&gt; create_table&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"issue_tracker_data"&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt;:force&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;:cascade&lt;span class="o"&gt;})&lt;/span&gt;
   -&amp;gt; 3.7627s
&lt;span class="nt"&gt;--&lt;/span&gt; create_table&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"issues"&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt;:id&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;:serial, :force&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;:cascade&lt;span class="o"&gt;})&lt;/span&gt;
rake aborted!
ActiveRecord::StatementInvalid: PG::InternalError: ERROR:  index method &lt;span class="s2"&gt;"ybgin"&lt;/span&gt; not supported yet
HINT:  See https://github.com/YugaByte/yugabyte-db/issues/1337. Click &lt;span class="s1"&gt;'+'&lt;/span&gt; on the description to raise its priority
: CREATE  INDEX  &lt;span class="s2"&gt;"index_issues_on_description_trigram"&lt;/span&gt; ON &lt;span class="s2"&gt;"issues"&lt;/span&gt; USING gin &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"description"&lt;/span&gt; gin_trgm_ops&lt;span class="o"&gt;)&lt;/span&gt;
/home/git/gitlab/vendor/bundle/ruby/2.6.0/gems/peek-pg-1.3.0/lib/peek/views/pg.rb:17:in &lt;span class="sb"&gt;`&lt;/span&gt;async_exec&lt;span class="s1"&gt;'
/home/git/gitlab/vendor/bundle/ruby/2.6.0/gems/peek-pg-1.3.0/lib/peek/views/pg.rb:17:in `async_exec'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the above output information, we can see that at first setup runs normally and can create extension and table normally, &lt;strong&gt;but after about 20 minutes, it fails to create index, because YugabyteDB can't recognize "gin" type index&lt;/strong&gt;, and the type instead is "ybgin" instead.&lt;/p&gt;

&lt;p&gt;Look at the objects generated by the database up to this point:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;gitlab&lt;/span&gt;&lt;span class="o"&gt;=#&lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relkind&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pg_class&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt; &lt;span class="k"&gt;left&lt;/span&gt; &lt;span class="k"&gt;join&lt;/span&gt; &lt;span class="n"&gt;pg_namespace&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relnamespace&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nspname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'public'&lt;/span&gt; &lt;span class="k"&gt;group&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relkind&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="n"&gt;relkind&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;
&lt;span class="c1"&gt;---------+-------&lt;/span&gt;
 &lt;span class="n"&gt;S&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;113&lt;/span&gt;
 &lt;span class="n"&gt;i&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;391&lt;/span&gt;
 &lt;span class="n"&gt;r&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;117&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="k"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The situation looks a little better than CockroachDB, but still much worse than the full database schema.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Visit GitLab
&lt;/h3&gt;

&lt;p&gt;At this point, the main GitLab page is still inaccessible, and from the logs, I found that the reason for the error is that the target table is missing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rack-timeout &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;7gatOugcqB8 &lt;span class="nb"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;60000ms &lt;span class="nv"&gt;state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ready
Started GET &lt;span class="s2"&gt;"/"&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;10.3.74.126 at 2022-05-27 16:05:31 +0800
Processing by RootController#index as HTML
Completed 500 Internal Server Error &lt;span class="k"&gt;in &lt;/span&gt;78ms &lt;span class="o"&gt;(&lt;/span&gt;ActiveRecord: 58.8ms | Elasticsearch: 0.0ms&lt;span class="o"&gt;)&lt;/span&gt;

ActiveRecord::StatementInvalid &lt;span class="o"&gt;(&lt;/span&gt;PG::UndefinedTable: ERROR:  relation &lt;span class="s2"&gt;"projects"&lt;/span&gt; does not exist
LINE 8:                WHERE a.attrelid &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'"projects"'&lt;/span&gt;::regclass
                                          ^
:               SELECT a.attname, format_type&lt;span class="o"&gt;(&lt;/span&gt;a.atttypid, a.atttypmod&lt;span class="o"&gt;)&lt;/span&gt;,
                     pg_get_expr&lt;span class="o"&gt;(&lt;/span&gt;d.adbin, d.adrelid&lt;span class="o"&gt;)&lt;/span&gt;, a.attnotnull, a.atttypid, a.atttypmod,
                     c.collname, col_description&lt;span class="o"&gt;(&lt;/span&gt;a.attrelid, a.attnum&lt;span class="o"&gt;)&lt;/span&gt; AS comment
                FROM pg_attribute a
                LEFT JOIN pg_attrdef d ON a.attrelid &lt;span class="o"&gt;=&lt;/span&gt; d.adrelid AND a.attnum &lt;span class="o"&gt;=&lt;/span&gt; d.adnum
                LEFT JOIN pg_type t ON a.atttypid &lt;span class="o"&gt;=&lt;/span&gt; t.oid
                LEFT JOIN pg_collation c ON a.attcollation &lt;span class="o"&gt;=&lt;/span&gt; c.oid AND a.attcollation &amp;lt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; t.typcollation
               WHERE a.attrelid &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'"projects"'&lt;/span&gt;::regclass
                 AND a.attnum &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 0 AND NOT a.attisdropped
               ORDER BY a.attnum
&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6eckssoJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ro25liemt91m3vi0t94y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6eckssoJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ro25liemt91m3vi0t94y.png" alt="Image description" width="880" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Update database version
&lt;/h3&gt;

&lt;p&gt;Similarly, we tried to upgrade YugabytesDB to the latest version to see if Gin index compatibility has been completed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;postgres&lt;/span&gt;&lt;span class="o"&gt;=#&lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;version&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                                                                                         &lt;span class="k"&gt;version&lt;/span&gt;
&lt;span class="c1"&gt;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;/span&gt;
 &lt;span class="n"&gt;PostgreSQL&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;YB&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b0&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gnu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;compiled&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;clang&lt;/span&gt; &lt;span class="k"&gt;version&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;yugabyte&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;llvm&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;bdb147e675d8c87cee72cc1f87c4b82855977d94&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;bit&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute the setup program again, the process is relatively smooth, about 30 minutes later the program exits normally without errors. At this point we look at the objects in the database.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;gitlab&lt;/span&gt;&lt;span class="o"&gt;=#&lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relkind&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pg_class&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt; &lt;span class="k"&gt;left&lt;/span&gt; &lt;span class="k"&gt;join&lt;/span&gt; &lt;span class="n"&gt;pg_namespace&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relnamespace&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nspname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'public'&lt;/span&gt; &lt;span class="k"&gt;group&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relkind&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="n"&gt;relkind&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;
&lt;span class="c1"&gt;---------+-------&lt;/span&gt;
 &lt;span class="n"&gt;S&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;231&lt;/span&gt;
 &lt;span class="n"&gt;i&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;903&lt;/span&gt;
 &lt;span class="n"&gt;r&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;249&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="k"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can see that the comparison with the standard PostgreSQL library is exactly the same. Opening a browser to visit the GitLab homepage automatically jumps to the login page, and checking the logs without error reporting.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z6BSWH_5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2d9bn6xii63hscxepg5s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z6BSWH_5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2d9bn6xii63hscxepg5s.png" alt="Image description" width="880" height="475"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Fill out the user registration form and submit, then the new user will be registered successfully and automatically jump to the main page of GitLab.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aChEFWcN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/no5n6az1wceuk68prc6g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aChEFWcN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/no5n6az1wceuk68prc6g.png" alt="Image description" width="880" height="473"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Initially, GitLab functionality is not affected by switching databases. More detailed tests will be presented to you in the next issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test  Conclusion
&lt;/h2&gt;

&lt;p&gt;1、CockroachDB v21.2 does not support Extension function, so GitLab cannot initialize the database, and finally fails to start, but the problem still exists after updating to the latest version v22.1.&lt;/p&gt;

&lt;p&gt;2、YugabyteDB v2.9 does not support Gin Index (Generalized inverted indexes), resulting in an error after creating a part of the table, which also can not be started, but after updating to the latest version v2.13, the problem is solved, and you can access GitLab page and register users normally.&lt;/p&gt;

&lt;p&gt;3、YugabyteDB supports PostgreSQL Extension, CockroachDB does not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Next Step
&lt;/h2&gt;

&lt;p&gt;Next we will try to bypass the GitLab database generation step and import a standard GitLab library with data into CockroachDB and YugabyteDB, select some frequently used read and write scenarios, and then compare their compatibility performance.&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>gitlab</category>
      <category>yugabytedb</category>
      <category>cockroachdb</category>
    </item>
  </channel>
</rss>
