객체 스토리지 환경에 최적화된 Git 구현 방식 소개
You can run Git on object storage if you re-make packfiles
Hacker News기존 Git의 핵심 구조인 팩파일은 로컬 디스크 및 mmap 환경에 최적화되어 있어, 네트워크 기반 객체 스토리지에서는 성능 병목 현상이 발생했습니다.
- 이 문제를 해결하기 위해 저자는 객체 스토리지 네이티브한 컬럼형 저장 방식을 가진 자체적인 'Packfile v2' 포맷을 개발하여 Git 구동의 효율성을 혁신적으로 개선했습니다.
- 새로운 방식은 실제 운영 규모의 대규모 레포지토리에서도 높은 성능을 유지하며, 클라이언트 측 코드 변경 없이 객체 스토리지 환경에서 Git 사용을 가능하게 합니다.
- 이 솔루션은 Git의 로컬 디스크 의존성을 우회하여 분산 시스템에 적합한 아키텍처를 제시했다는 점에서 큰 의미가 있습니다.
기존의 Git은 객체를 묶어 저장하는 '팩파일'을 사용하는데, 이 포맷은 로컬 디스크나 mmap(메모리 매핑) 환경에 맞춰 설계되었습니다. 따라서 네트워크 기반의 객체 스토리지 환경에서 사용할 경우 성능 병목 현상이 발생합니다. 파일 시스템에서의 읽기 속도는 매우 빠르지만, 객체 스토리지를 통한 네트워크 왕복 시간(roundtrip)은 최소 10밀리초(ms) 이상이 소요되어 기존 방식으로는 효율적인 구동이 어렵습니다.
이러한 문제를 해결하기 위해 저자는 자체적으로 'Packfile v2'라는 새로운 포맷을 개발했습니다. 이 포맷은 객체 스토리지 환경에 네이티브하도록 설계된 컬럼형 저장 방식을 채택하여, Git의 모든 데이터를 일반적인 파일 시스템 의존성을 우회하고 객체 형태로 저장할 수 있게 합니다. 이 방식은 클라이언트 측 코드 변경 없이도 실제 운영 규모의 대규모 레포지토리에서 높은 성능을 유지하는 것이 가능합니다.
새로운 아키텍처는 객체 스토리지의 특성을 활용하여 Git 데이터를 관리합니다. 기존에는 팩파일 내의 오프셋 정보를 이용해 특정 데이터 블록에 접근했지만, 객체 스토리지 환경에서는 이 과정이 복잡했습니다. 따라서 새로운 포맷은 객체 스토리지가 제공하는 랜덤 액세스 스캔 기능을 효과적으로 사용하여, 분산 시스템 환경에서도 Git 데이터를 효율적으로 읽고 쓸 수 있도록 구현되었습니다.