저장소 스토리지
Offering: GitLab Self-Managed
GitLab은 저장소를 저장소 스토리지에 저장합니다. 저장소 스토리지는 저장소가 저장되는 디렉토리를 직접 가리키는 path로 구성될 수 있습니다. 해시 스토리지는 프로젝트 ID의 해시를 기반으로 하는 위치의 디스크에 프로젝트를 저장합니다.
GitLab은 저장소를 저장소 스토리지에 저장합니다. 저장소 스토리지는 다음 중 하나입니다:
저장소 스토리지는 저장소가 저장되는 디렉토리를 직접 가리키는 path로 구성될 수 있습니다. GitLab이 저장소를 포함하는 디렉토리에 직접 접근하는 것은 더 이상 사용되지 않습니다. 물리적 또는 가상 스토리지를 통해 저장소에 접근하도록 GitLab을 구성해야 합니다.
다음에 대한 자세한 내용은:
- Gitaly 구성은 Gitaly 구성을 참조하세요.
- Gitaly 클러스터(Praefect) 구성은 Gitaly 클러스터(Praefect) 구성을 참조하세요.
해시 스토리지#
해시 스토리지는 프로젝트 ID의 해시를 기반으로 하는 위치의 디스크에 프로젝트를 저장합니다. 이렇게 하면 폴더 구조가 변경 불가능해지고 URL에서 디스크 구조로 상태를 동기화할 필요가 없습니다. 즉, 그룹, 사용자 또는 프로젝트의 이름을 변경하면:
- 데이터베이스 트랜잭션만 비용이 발생합니다.
- 즉시 적용됩니다.
해시는 또한 디스크에 저장소를 더 고르게 분산시키는 데 도움이 됩니다. 최상위 디렉토리에는 최상위 네임스페이스의 총 수보다 적은 폴더가 포함됩니다.
해시 형식은 SHA256(project.id)로 계산된 SHA256의 16진수 표현을 기반으로 합니다. 최상위 폴더는 처음 두 문자를 사용하고, 다음 두 문자로 다른 폴더가 이어집니다. 기존 레거시 스토리지 프로젝트와 공존할 수 있도록 특별한 @hashed 폴더에 저장됩니다. 예를 들어:
# Project's repository:
"@hashed/#{hash[0..1]}/#{hash[2..3]}/#{hash}.git"
# Wiki's repository:
"@hashed/#{hash[0..1]}/#{hash[2..3]}/#{hash}.wiki.git"
해시 스토리지 경로 변환#
Git 저장소 문제 해결, 훅 추가, 기타 작업에는 사람이 읽을 수 있는 프로젝트 이름과 해시 스토리지 경로 사이를 변환해야 합니다. 다음을 변환할 수 있습니다:
프로젝트 이름에서 해시 경로로#
히스토리
- 상대 경로 필드가 GitLab 16.3에서 Gitaly 상대 경로에서 이름이 변경되었습니다.
관리자는 다음을 사용하여 프로젝트 이름 또는 ID에서 해시 경로를 조회할 수 있습니다:
- Admin 영역.
- Rails 콘솔.
Admin 영역에서 프로젝트의 해시 경로를 조회하려면:
-
오른쪽 상단 모서리에서 Admin을 선택합니다.
-
개요 > 프로젝트를 선택하고 프로젝트를 선택합니다.
-
상대 경로 필드를 찾습니다. 값은 다음과 유사합니다:
"@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git"
Rails 콘솔을 사용하여 프로젝트의 해시 경로를 조회하려면:
-
Rails 콘솔을 시작합니다.
-
다음 예시와 유사한 명령을 실행합니다(프로젝트 ID 또는 이름 사용):
Project.find(16).disk_path Project.find_by_full_path('group/project').disk_path
해시 경로에서 프로젝트 이름으로#
관리자는 다음을 사용하여 해시 상대 경로에서 프로젝트 이름을 조회할 수 있습니다:
- Rails 콘솔.
*.git디렉토리의config파일.
Rails 콘솔을 사용하여 프로젝트 이름을 조회하려면:
-
Rails 콘솔을 시작합니다.
-
다음 예시와 유사한 명령을 실행합니다:
ProjectRepository.find_by(disk_path: '@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9').project
해당 명령의 인용된 문자열은 GitLab 서버에서 찾을 수 있는 디렉토리 트리입니다. 예를 들어 기본 Linux 패키지 설치의 경우 디렉토리 이름 끝의 .git을 제거한 /var/opt/gitlab/git-data/repositories/@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git이 됩니다.
출력에는 프로젝트 ID와 프로젝트 이름이 포함됩니다. 예를 들어:
=> #
해시 경로에서 프로젝트 전체 경로로#
Rails 콘솔을 사용하여 프로젝트의 전체 경로를 조회하려면:
-
Rails 콘솔을 시작합니다.
-
다음 예시와 유사한 명령을 실행합니다:
ProjectRepository.find_by(disk_path: '@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9').project.full_path예시에서 해당 명령의 인용된 문자열은 GitLab 서버의 디렉토리 트리입니다. 예를 들어 기본 Linux 패키지 설치의 경우 이 문자열은 디렉토리 이름 끝의
.git을 제거한/var/opt/gitlab/git-data/repositories/@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git이 됩니다.
출력에는 프로젝트의 전체 경로가 포함됩니다. 예를 들어:
=> "it/supportteam/ticketsystem"
해시 객체 풀#
객체 풀은 공개 및 내부 프로젝트의 포크를 중복 제거하는 데 사용되는 저장소이며 소스 프로젝트의 객체를 포함합니다. objects/info/alternates를 사용하여 소스 프로젝트와 포크는 공유 객체에 객체 풀을 사용합니다.
소스 프로젝트에서 하우스키핑이 실행될 때 객체가 소스 프로젝트에서 객체 풀로 이동됩니다. 객체 풀 저장소는 @hashed 대신 @pools라는 디렉토리에 일반 저장소와 유사하게 저장됩니다.
# object pool paths
"@pools/#{hash[0..1]}/#{hash[2..3]}/#{hash}.git"
@pools 디렉토리에 저장된 객체 풀 저장소에서 git prune 또는 git gc를 실행하지 마세요. 이렇게 하면 객체 풀에 의존하는 일반 저장소에서 데이터가 손실될 수 있습니다.
해시 객체 풀 스토리지 경로 변환#
Rails 콘솔을 사용하여 프로젝트의 객체 풀을 조회하려면:
-
Rails 콘솔을 시작합니다.
-
다음 예시와 유사한 명령을 실행합니다:
project_id = 1 pool_repository = Project.find(project_id).pool_repository pool_repository = Project.find_by_full_path('group/project').pool_repository # Get more details about the pool repository pool_repository.source_project pool_repository.member_projects pool_repository.shard pool_repository.disk_path
그룹 위키 스토리지#
@hashed 디렉토리에 저장되는 프로젝트 위키와 달리 그룹 위키는 @groups라는 디렉토리에 저장됩니다. 프로젝트 위키와 마찬가지로 그룹 위키는 해시 스토리지 폴더 규칙을 따르지만, 프로젝트 ID 대신 그룹 ID의 해시를 사용합니다.
예를 들어:
# group wiki paths
"@groups/#{hash[0..1]}/#{hash[2..3]}/#{hash}.wiki.git"
Gitaly 클러스터(Praefect) 스토리지#
Gitaly 클러스터(Praefect)가 사용되는 경우 Praefect가 스토리지 위치를 관리합니다. Praefect가 저장소에 사용하는 내부 경로는 해시 경로와 다릅니다. 자세한 내용은 Praefect 생성 복제본 경로를 참조하세요.
저장소 파일 아카이브 캐시#
사용자는 다음 중 하나를 사용하여 저장소의 아카이브를 .zip 또는 .tar.gz와 같은 형식으로 다운로드할 수 있습니다:
- GitLab UI.
- 저장소 API.
GitLab은 이 아카이브를 GitLab 서버의 디렉토리에 캐시로 저장합니다.
캐시의 위치는 설치 방법에 따라 다릅니다:
- Linux 패키지 인스턴스의 경우 파일 아카이브 캐시의 기본 디렉토리는
/var/opt/gitlab/gitlab-rails/shared/cache/archive입니다./etc/gitlab/gitlab.rb의gitlab_rails['gitlab_repository_downloads_path']설정으로 구성할 수 있습니다. - Helm 차트 인스턴스의 경우 캐시는
/srv/gitlab/shared/cache/archive에 저장됩니다. 디렉토리는 구성할 수 없습니다.
Sidekiq에서 실행되는 백그라운드 job이 이 디렉토리에서 오래된 아카이브를 주기적으로 삭제합니다. 이러한 이유로 이 디렉토리는 모든 Sidekiq 및 GitLab Workhorse 노드에서 접근할 수 있어야 합니다. Sidekiq이 GitLab Workhorse에서 사용하는 것과 동일한 디렉토리에 접근할 수 없는 경우 디렉토리가 포함된 디스크가 가득 찹니다.
캐시를 완전히 비활성화할 수도 있습니다:
캐시를 비활성화하려면:
-
Puma를 실행하는 모든 노드에
WORKHORSE_ARCHIVE_CACHE_DISABLED환경 변수를 설정합니다:sudo -e /etc/gitlab/gitlab.rbgitlab_rails['env'] = { 'WORKHORSE_ARCHIVE_CACHE_DISABLED' => '1' } -
변경 사항이 적용되도록 업데이트된 노드를 재구성합니다:
sudo gitlab-ctl reconfigure
캐시를 비활성화하려면 --set gitlab.webservice.extraEnv.WORKHORSE_ARCHIVE_CACHE_DISABLED="1"을 사용하거나 값 파일에 다음을 지정합니다:
gitlab:
webservice:
extraEnv:
WORKHORSE_ARCHIVE_CACHE_DISABLED: "1"
객체 스토리지 지원#
이 표는 어떤 저장 가능한 객체가 각 스토리지 유형에 저장될 수 있는지 보여줍니다:
| 저장 가능한 객체 | 해시 스토리지 | S3 호환 |
|---|---|---|
| 저장소 | Yes | - |
| 첨부 파일 | Yes | - |
| 아바타 | No | - |
| 페이지 | No | - |
| Docker 레지스트리 | No | - |
| CI/CD job 로그 | No | - |
| CI/CD 아티팩트 | No | Yes |
| CI/CD 캐시 | No | Yes |
| LFS 객체 | Similar | Yes |
| 저장소 풀 | Yes | - |
새 저장소가 저장되는 위치 구성#
여러 저장소 스토리지를 구성한 후 새 저장소가 저장되는 위치를 선택할 수 있습니다:
- 오른쪽 상단 모서리에서 Admin을 선택합니다.
- 설정 > 저장소를 선택합니다.
- 저장소 스토리지를 확장합니다.
- 새 저장소를 위한 스토리지 노드 필드에 값을 입력합니다.
- 변경 사항 저장을 선택합니다.
각 저장소 스토리지 경로에는 0-100의 가중치를 할당할 수 있습니다. 새 프로젝트가 만들어질 때 이러한 가중치는 저장소가 생성되는 스토리지 위치를 결정하는 데 사용됩니다.
특정 저장소 스토리지 경로의 가중치가 다른 저장소 스토리지 경로에 비해 높을수록 더 자주 선택됩니다((storage weight) / (sum of all weights) * 100 = chance %).
기본적으로 저장소 가중치가 이전에 구성되지 않은 경우:
default의 가중치는100.- 다른 모든 스토리지의 가중치는
0.
모든 스토리지 가중치가 0인 경우(예: default가 존재하지 않을 때), GitLab은 구성 또는 default의 존재에 관계없이 default에 새 저장소를 만들려고 시도합니다. 자세한 내용은 추적 이슈를 참조하세요.
저장소 이동#
저장소를 다른 저장소 스토리지로 이동하려면(예: default에서 storage2로) Gitaly 클러스터(Praefect)로 마이그레이션과 동일한 프로세스를 사용하세요.
