PostgreSQL 운영 체제 업그레이드

만일 PostgreSQL이 실행 중인 운영 체제를 업그레이드하면 glibc 2.28의 로케일 데이터 변경 사항의 업그레이드가 데이터베이스 인덱스를 손상시킬 수 있습니다. 이 문제를 피하려면 다음 중 하나를 사용하여 마이그레이션하세요:

이 문제에 대한 GitLab의 대응 방안에 대한 자세한 정보는 epic 8573을 참조하세요.

백업 및 복원

pg_dump 또는 GitLab 백업 도구를 사용하여 db를 제외한 모든 데이터 유형을 백업하고(데이터베이스만 백업) 사용하세요.

복원은 인덱스를 포함한 전체 데이터베이스를 다시 생성합니다.

장점:

  • 복제보다 간단하고 명확합니다.
  • 인덱스와 테이블의 데이터베이스 팽창을 제거하여 디스크 사용량을 줄입니다.

단점:

  • 큰 데이터베이스에는 장애 시간이 길어질 가능성이 높으며, 특히 문제가 됩니다.

복제 및 장애 조치

이전 데이터베이스 서버에서 새 서버로 스트리밍 복제를 설정하세요.

새 서버로 전환하는 계획의 일환으로 영향을 받는 인덱스를 모두 재작성하세요:

이 방법은 GitLab.com에서 사용되었습니다. 이 프로세스 및 다양한 유형의 인덱스 처리 방법에 대해 자세히 알아보려면 Postgres 데이터베이스 클러스터의 운영 체제 업그레이드에 대한 블로그 글을 확인하세요.

장점:

  • 다운타임이 짧으며 필요한 재인덱싱 시간과 유효성 검사 시간만큼입니다.
  • 데이터베이스가 크면 더 빠를 가능성이 높습니다.

단점:

  • 기술적으로 복잡함: 복제 설정 및 필요한 모든 재인덱싱 완료 보장.
  • 데이터베이스 팽창 보존.

glibc 버전 확인

사용 중인 glibc 버전을 확인하려면 ldd --version을 실행하세요.

서버의 glibc 동작을 셸 명령을 사용하여 비교할 수 있습니다.

다음 표는 다양한 운영 체제에 제공된 glibc 버전을 보여줍니다:

운영 체제 glibc 버전
CentOS 7 2.17
RedHat Enterprise 8 2.28
RedHat Enterprise 9 2.34
Ubuntu 18.04 2.27
Ubuntu 20.04 2.31
Ubuntu 22.04 2.35

예를 들어, CentOS 7에서 RedHat Enterprise 8로 업그레이드하는 경우 업그레이드된 운영 체제에서 PostgreSQL을 사용하려면 glibc가 2.17에서 2.28로 업그레이드되기 때문에 언급된 두 방법 중 하나를 사용해야 합니다. 달리 하면 콜레이션 변경을 제대로 처리하지 못하면 GitLab에서 실행자가 태그가 있는 작업을 선택하지 않는 등의 중대한 문제가 발생합니다.

반면에, 만일 PostgreSQL이 이미 glibc 2.28 이상에서 문제 없이 실행 중이라면 추가 조치 없이 인덱스가 계속 작동해야 합니다. 예를 들어, RedHat Enterprise 8(2.28의 glibc)에서 PostgreSQL을 작동시키고 있었고 RedHat Enterprise 9(2.34의 glibc)로 업그레이드하려면 콜레이션 관련 문제가 없어야 합니다.

glibc 콜레이션 버전 확인

PostgreSQL 13 이상의 경우 데이터베이스 콜레이션 버전이 시스템과 일치하는지 다음 SQL 쿼리로 확인할 수 있습니다:

SELECT collname AS COLLATION_NAME,
       collversion AS VERSION,
       pg_collation_actual_version(oid) AS actual_version
FROM pg_collation
WHERE collprovider = 'c';

일치하는 콜레이션 예시

예를 들어, Ubuntu 22.04 시스템에서 적절하게 인덱싱된 시스템의 출력은 다음과 같습니다:

gitlabhq_production=# SELECT collname AS COLLATION_NAME,
       collversion AS VERSION,
       pg_collation_actual_version(oid) AS actual_version
FROM pg_collation
WHERE collprovider = 'c';
 collation_name | version | actual_version
----------------+---------+----------------
 C              |         |
 POSIX          |         |
 ucs_basic      |         |
 C.utf8         |         |
 en_US.utf8     | 2.35    | 2.35
 en_US          | 2.35    | 2.35
(6 rows)

불일치하는 콜레이션 예시

다른 쪽으로, Ubuntu 18.04에서 22.04로 업그레이드한 경우 재인덱싱 없이 다음과 같은 결과가 나타날 수 있습니다:

gitlabhq_production=# SELECT collname AS COLLATION_NAME,
       collversion AS VERSION,
       pg_collation_actual_version(oid) AS actual_version
FROM pg_collation
WHERE collprovider = 'c';
 collation_name | version | actual_version
----------------+---------+----------------
 C              |         |
 POSIX          |         |
 ucs_basic      |         |
 C.utf8         |         |
 en_US.utf8     | 2.27    | 2.35
 en_US          | 2.27    | 2.35
(6 rows)