在極狐GitLab 開發的過程中,因為要持續和上游的代碼保持同步,使得我們在數據庫增加表或者字段時,需要到上游提交 MR,上游 review 完成后需要等代碼同步到 main-jh
之后才可以使用,這就使得整個周期變得比較長。而且由于極狐GitLab 和上游的客戶群體不同,當我們兩邊要同時實現一個功能點的時候,客戶想要支持的需求也是不同的,所以很可能在實現這個需求的時候,兩邊設計的表結構也是完全不同的,這個時候我們可以為這個新功能來使用一個單獨的數據庫。那么這個單獨的數據庫需要考慮到哪些方面呢,我們接著往下看。
structure.sql
。GDK
中。rails db:migrate:main-jh
這樣的 rake 命令來單獨執行極狐GitLab 數據庫的遷移和 rollback。gdk install
JH 數據庫自動創建并運行遷移gdk reconfigure
需要可以更新 jh/config/database.yml
Omnibus GitLab
中添加對極狐GitLab 數據庫的支持,安裝 Omnibus GitLab
后可以自動創建極狐GitLab 數據庫并完成數據庫的初始化。Helm chart
安裝極狐GitLab 的時候,完成極狐GitLab 專屬數據庫的初始化。Docker
安裝極狐GitLab 的時候,完成極狐GitLab 專屬數據庫的初始化。GDK
中添加程序來生成 jh/config/database.yml
文件,并可以創建數據庫并執行遷移。database.yml
中配置 migrations_paths: ['jh/db/migrate']
來指定 migrate 目錄為 jh/db/migrate
,通過配置 schema_migrations_path: 'jh/db/schema_migrations'
來指定 schema_migrations 的目錄為 jh/db/schema_migrations
。用這個方式來實現數據庫遷移的隔離。lib/tasks/gilab/db.rake
文件中生成的,其中 databases = ActiveRecord::Tasks::DatabaseTasks.setup_initial_database_yaml
是找到當前配置的所有數據庫,但是 databases 中并不會包含 jh/config/database.yml
中的配置,這個配置默認讀取的是 config/database.yml
,需要我們通過魔改的方式把 jh/config/database.yml
中的配置加進去。before do
中改變數據庫的連接,使其連接極狐GitLab 專屬數據庫。connects_to
方法指定連接極狐GitLab 專屬數據庫。然后需要連接極狐GitLab 專屬數據庫的 model 直接繼承這個類即可; 二是為 model 單獨添加 connects_to
方法。個人推薦第一個方式。disable_joins: true
即可,相關鏈接: https://guides.rubyonrails.org/active_record_multiple_databases.html#handling-associations-with-joins-across-databasesGDK 側對于 1 和 2 有兩種不同的方案,區別在于 GDK 項目改動的大小,但是無論大小都需要改動 GDK。
GDK
項目中添加寫入極狐GitLab 數據庫配置的腳本,將數據庫配置寫入 jh/config/database.yml
,在 gdk install
和 gdk reconfigure
命令中執行。config/database.yml
的配置并根據此配置來組合極狐GitLab 數據庫的配置并寫入 jh/config/database.yml
文件中。在 GDK
項目中執行 gdk install
和 gdk reconfigure
相關的代碼中加入執行這個 rake 任務的代碼。Omnibus GitLab
項目中添加根據 license 來決定是否添加極狐GitLab 數據庫配置的代碼,如果有對應的 license,需要在安裝過程中自動創建極狐GitLab 的配置文件,在安裝完成后可以初始化數據庫。
- The stateful components, like PostgreSQL or Gitaly (a Git repository storage dataplane), must run outside the cluster on PaaS or compute instances. This configuration is required to scale and reliably service the variety of workloads found in production GitLab environments.
Helm chart 主要用于在 k8s 集群中安裝極狐GitLab,PostgreSQL 服務和 Gitaly 服務都是在 cluster 之外的,如果我們想啟用 GEO,需要在外部的 PostgreSQL 中配置好一個空的數據庫,GitLab 推薦 self-managed
使用 Omnibus-gitlab
來安裝 PostgreSQL 的服務,所以我們無需對 Helm chart 的代碼做修改。