번들 PgBouncer 서비스 사용하기


Tier: Free, Premium, Ultimate
Offering: Self-managed
note

PgBouncer는 gitlab-ee 패키지에 번들되어 있지만 무료로 사용할 수 있습니다.
지원을 받으려면 프리미엄 구독이 필요합니다.

PgBouncer는 장애 조치 시나리오에서 데이터베이스 연결을 서버 간에 원활하게 마이그레이션하는 데 사용됩니다. 또한, 비장애 허용 설정에서 연결을 풀링하여 응답 시간을 단축하고 리소스 사용량을 줄일 수 있습니다.

GitLab 프리미엄에는 PgBouncer의 번들 버전이 포함되어 있으며 /etc/gitlab/gitlab.rb를 통해 관리할 수 있습니다.

GitLab 설치의 장애 조치 방안으로서의 PgBouncer

이 내용은 새 위치로 이동되었습니다.

GitLab 설치의 비장애 허용 설정으로서의 PgBouncer

  1. gitlab-ctl pg-password-md5 pgbouncer 명령을 사용하여 PGBOUNCER_USER_PASSWORD_HASH를 생성합니다.

  2. gitlab-ctl pg-password-md5 gitlab 명령을 사용하여 SQL_USER_PASSWORD_HASH를 생성합니다. 나중에 평문을 SQL_USER_PASSWORD에 입력합니다.

  3. 데이터베이스 노드에서 /etc/gitlab/gitlab.rb에 다음이 설정되었는지 확인하세요.

    postgresql['pgbouncer_user_password'] = 'PGBOUNCER_USER_PASSWORD_HASH'
    postgresql['sql_user_password'] = 'SQL_USER_PASSWORD_HASH'
    postgresql['listen_address'] = 'XX.XX.XX.Y' # XX.XX.XX.Y는 postgresql이 수신해야 하는 노드의 IP 주소입니다.
    postgresql['md5_auth_cidr_addresses'] = %w(AA.AA.AA.B/32) # AA.AA.AA.B는 pgbouncer 노드의 IP 주소입니다.
    
  4. gitlab-ctl reconfigure 명령을 실행합니다.

    note

    데이터베이스가 이미 실행 중이었더라도, gitlab-ctl restart postgresql 명령으로 재구성 후에 재시작해야 합니다.
  5. PgBouncer를 실행하는 노드에서 /etc/gitlab/gitlab.rb에 다음이 설정되어 있는지 확인하세요.

    pgbouncer['enable'] = true
    pgbouncer['databases'] = {
      gitlabhq_production: {
        host: 'DATABASE_HOST',
        user: 'pgbouncer',
        password: 'PGBOUNCER_USER_PASSWORD_HASH'
      }
    }
    

    각 데이터베이스에 대해 추가 구성 매개변수를 전달할 수 있습니다. 예를 들어:

    pgbouncer['databases'] = {
      gitlabhq_production: {
         ...
         pool_mode: 'transaction'
      }
    }
    

    이러한 매개변수를 사용할 때 주의하십시오. 매개변수의 전체 목록은 PgBouncer 문서를 참조하십시오.

  6. gitlab-ctl reconfigure 명령을 실행합니다.

  7. Puma를 실행하는 노드에서 /etc/gitlab/gitlab.rb에 다음이 설정되어 있는지 확인하세요.

    gitlab_rails['db_host'] = 'PGBOUNCER_HOST'
    gitlab_rails['db_port'] = '6432'
    gitlab_rails['db_password'] = 'SQL_USER_PASSWORD'
    
  8. gitlab-ctl reconfigure 명령을 실행합니다.

  9. 이 시점에서 인스턴스는 PgBouncer를 통해 데이터베이스에 연결해야 합니다. 문제가 있는 경우 문제 해결 섹션을 참조하십시오.

백업

PgBouncer 연결을 통해 GitLab을 백업하거나 복원하지 마십시오. GitLab 장애를 유발할 수 있습니다.

자세한 내용 및 백업 재구성 방법에 대해 더 읽어보기.

모니터링 활성화

모니터링을 활성화하려면 모든 PgBouncer 서버에서 활성화해야 합니다.

  1. /etc/gitlab/gitlab.rb를 만들거나 수정하여 다음 구성을 추가합니다.

    # 프로메테우스를 위한 서비스 검색 활성화
    consul['enable'] = true
    consul['monitoring_service_discovery'] =  true
    
    # Platzholder 치환
    # Y.Y.Y.Y consul1.gitlab.example.com Z.Z.Z.Z
    # 이 치환값을 Consul 서버 노드의 주소로 교체합니다
    consul['configuration'] = {
       retry_join: %w(Y.Y.Y.Y consul1.gitlab.example.com Z.Z.Z.Z),
    }
    
    # 익스포터가 수신 대기하는 네트워크 주소 설정
    node_exporter['listen_address'] = '0.0.0.0:9100'
    pgbouncer_exporter['listen_address'] = '0.0.0.0:9188'
    
  2. 구성을 컴파일하려면 sudo gitlab-ctl reconfigure을 실행합니다.

관리 콘솔

Linux 패키지 설치에서는 PgBouncer 관리 콘솔에 자동으로 연결하는 명령이 제공됩니다. 자세한 사용 방법은 PgBouncer 문서를 참조하십시오.

세션을 시작하려면 다음을 실행하고 pgbouncer 사용자의 암호를 제공하십시오.

sudo gitlab-ctl pgb-console

인스턴스에 대한 기본 정보를 얻으려면:

pgbouncer=# show databases; show clients; show servers;
        name         |   host    | port |      database       | force_user | pool_size | reserve_pool | pool_mode | max_connections | current_connections
---------------------+-----------+------+---------------------+------------+-----------+--------------+-----------+-----------------+---------------------
 gitlabhq_production | 127.0.0.1 | 5432 | gitlabhq_production |            |       100 |            5 |           |               0 |                   1
 pgbouncer           |           | 6432 | pgbouncer           | pgbouncer  |         2 |            0 | statement |               0 |                   0
(2 rows)

 type |   user    |      database       | state  |   addr    | port  | local_addr | local_port |    connect_time     |    request_time     |    ptr    | link
| remote_pid | tls
------+-----------+---------------------+--------+-----------+-------+------------+------------+---------------------+---------------------+-----------+------
+------------+-----
 ...

(총 12개 행)

 ...
(총 8개 행)

(8 rows)

 type |  user  |      database       | state |   addr    | port | local_addr | local_port |    connect_time     |    request_time     |    ptr    | link | rem
ote_pid | tls
------+--------+---------------------+-------+-----------+------+------------+------------+---------------------+---------------------+-----------+------+----
--------+-----
 ...

(총 1개 행)

PgBouncer 우회 절차

Linux 패키지 설치

일부 데이터베이스 변경 사항은 PgBouncer를 통해 직접 수행해야 합니다.

주요 영향을 받는 작업은 데이터베이스 복원데이터베이스 마이그레이션을 포함한 GitLab 업그레이드입니다.

  1. 기본 노드를 찾으려면 데이터베이스 노드에서 다음을 실행합니다.

    sudo gitlab-ctl patroni members
    
  2. 수행 중인 애플리케이션 노드의 /etc/gitlab/gitlab.rb를 편집하고, gitlab_rails['db_host']gitlab_rails['db_port']를 데이터베이스 기본 호스트 및 포트로 업데이트합니다.

  3. 다시 구성을 실행합니다.

    sudo gitlab-ctl reconfigure
    

작업이나 절차를 완료한 후에는 다시 PgBouncer를 사용하도록 변경합니다:

  1. /etc/gitlab/gitlab.rb를 다시 PgBouncer를 가리키도록 변경합니다.
  2. 다시 구성을 실행합니다.

    sudo gitlab-ctl reconfigure
    

Helm 차트 설치

고가용성 배포는 Linux 패키지 기반의 이유로 PgBouncer를 우회해야 합니다. Helm 차트 설치의 경우:

  • 데이터베이스 백업 및 복원 작업은 toolbox 컨테이너에서 수행됩니다.
  • 마이그레이션 작업은 마이그레이션 컨테이너에서 수행됩니다.

각 서브차트에서 PostgreSQL 포트를 재정의하여 이러한 작업을 실행하고 PostgreSQL에 직접 연결할 수 있어야 합니다.

세밀한 튜닝

PgBouncer의 기본 설정은 대부분의 설치에 적합합니다. 특정 경우에는 성능 및 리소스별 변수를 변경하여 처리량을 높이거나 데이터베이스의 메모리 고갈을 제한하는 것이 좋을 수 있습니다.

Linux 패키지 설치의 경우 이러한 변수 및 해당 문서를 공식 PgBouncer 문서에서 찾을 수 있습니다.

아래에 나열된 것은 Linux 패키지 설치의 최상의 변수와 기본값입니다.

  • pgbouncer['max_client_conn'] (기본값: 2048, 서버 파일 디스크립터 제한에 따름) 이것은 PgBouncer의 “프론트엔드” 풀입니다: Rails에서 PgBouncer로의 연결.
  • pgbouncer['default_pool_size'] (기본값: 100) 이것은 PgBouncer의 “백엔드” 풀입니다: PgBouncer에서 데이터베이스로의 연결.

default_pool_size의 이상적인 숫자는 데이터베이스 풀 크기를 정의하기 위해 나열된 서비스 각각의 인스턴스 수에 puma, sidekiqgeo-logcursor의 연결 수를 곱한 것입니다.

하나 이상의 내부 로드 밸런서와 함께 여러 PgBouncer를 사용하는 경우, 각 인스턴스의 default_pool_size를 나눌 수 있어 균일하게 분산된 부하를 보장할 수 있습니다.

pgbouncer['max_client_conn']은 PgBouncer가 수용할 수 있는 연결의 하드 제한입니다. 이를 변경할 필요가 없을 가능성이 높습니다. 해당 제한에 도달하는 경우 내부 로드 밸런서로 추가 PgBouncer를 추가하는 것을 고려해볼 수 있습니다.

Geo 추적 데이터베이스를 가리키는 PgBouncer의 제한을 설정하는 경우, 일반적으로 기본적으로 puma를 무시할 수 있을 것입니다.

문제 해결

PgBouncer를 통한 연결에 문제가 있는 경우, 항상 로그를 확인해야 합니다.

sudo gitlab-ctl tail pgbouncer

추가로, 관리 콘솔show databases 출력을 확인할 수 있습니다. 출력에서 gitlabhq_production 데이터베이스의 host 필드에 값이 있어야 합니다. 또한, current_connections는 1보다 커야 합니다.

메시지: LOG: invalid CIDR mask in address

Geo 문서에 제안된 수정 사항을 확인하세요(../geo/replication/troubleshooting/replication.md#message-log–invalid-cidr-mask-in-address).

메시지: LOG: invalid IP mask "md5": Name or service not known

Geo 문서에 제안된 수정 사항을 확인하세요(../geo/replication/troubleshooting/replication.md#message-log–invalid-ip-mask-md5-name-or-service-not-known).