[分享] Gitaly Cluster 如何扩展磁盘

Gitaly 在极狐 GitLab 中用于存储 Git 仓库,在使用 Gitaly Cluster 的情况下,每个 Gitaly 节点上面都存储着全量 Git 仓库数据,Gitaly 节点之间互为副本,一个或多个 Gitaly 节点的损坏并不会影响 Git 数据的完整性和访问。

操作方式

1. 扩展前检查

# 实例整理检查
# rails 节点操作
gitlab-rake gitlab:check

# gitaly 联通性检查
gitlab-rake gitlab:gitaly:check

# praefect 连通 gitaly 检查
# praefect 节点
sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml dial-nodes

# gitaly 回调 gitlab 连通检查
# gitaly 所有节点
sudo /opt/gitlab/embedded/bin/gitaly-hooks check /var/opt/gitlab/gitaly/config.toml

2. 开始扩容

2.1 扩展 gitaly-01 节点

2.1.1 停止 gitaly 服务
gitlab-ctl stop gitaly
2.1.2 调整 git_data_dir
git_data_dirs({
  "gitaly-1" => {
    "path" => "/disk/git-data"  # 修改此路径到新磁盘
  }
})
2.1.3 刷新配置
gitlab-ctl reconfigure
2.1.4 迁移仓库目录
/opt/gitlab/embedded/bin/rsync -avzcP --delete /var/opt/gitlab/git-data /disk --log-file=rsync_git_data.log 2> error.log
2.1.5 启动 gitaly
gitlab-ctl start gitaly
2.1.6 检查仓库同步状态
# praefect pg 节点
gitlab-psql -d praefect_production -c '
SELECT rg.virtual_storage,
       rg.relative_path,
       sr.storage
FROM
  (SELECT virtual_storage,
          relative_path,
          MAX(generation) AS generation
   FROM storage_repositories
   GROUP BY virtual_storage,
            relative_path) rg,
                           storage_repositories sr
WHERE rg.relative_path = sr.relative_path
  AND sr.generation <> rg.generation;'
 
 # 无返回结果即为同步完成,如有结果请等待同步完成

待以上同步完成后继续操作其余节点。

2.2 扩展 gitaly-02 节点

同上

2.3 扩展 gitaly-03 节点

同上

3. 校验仓库一致性

选择最近 20min 内修改过的仓库随机校验一致性。

#!/bin/bash 

PROJECT_IDS=`gitlab-psql -q -t -c "select id from projects where updated_at > now() + interval '-20 M';"`

for ID in $PROJECT_IDS
do
    eval "gitlab-rake gitlab:praefect:replicas[$ID]"
done

适用:GitLab-JH 14.0及以上