두 개의 단일 노드 사이트에 대한 Geo 설정

Tier: 프리미엄, 얼티메이트 Offering: Self-managed

다음 가이드는 외부 서비스가 설정되지 않은 두 Linux 패키지 인스턴스를 사용하여 두 개의 단일 노드 사이트 설치에 대한 GitLab Geo 배포를 간결하게 안내합니다.

필수 사항:

  • 독립적으로 작동하는 GitLab 사이트가 적어도 두 개 있어야 합니다. 사이트를 만들려면 GitLab 참조 아키텍처 설명서를 참조하세요.
    • 한 GitLab 사이트는 Geo 기본 사이트로 사용됩니다. 각 Geo 사이트에 서로 다른 참조 아키텍처 크기를 사용할 수 있습니다. 이미 작동 중인 GitLab 인스턴스가 있는 경우 해당 인스턴스를 기본 사이트로 사용할 수 있습니다.
    • 두 번째 GitLab 사이트는 Geo 보조 사이트로 사용됩니다. Geo는 여러 보조 사이트를 지원합니다.
  • Geo 기본 사이트에는 적어도 GitLab 프리미엄 라이선스가 있어야 합니다. 모든 사이트에는 하나의 라이선스만 필요합니다.
  • 모든 사이트가 Geo 실행 요구 사항을 충족하는지 확인하세요.

Linux 패키지(Omnibus)를 위한 Geo 설정

필수 사항:

  • PostgreSQL 12 이상을 사용합니다. 이는 pg_basebackup 도구가 포함되어 있어야 합니다.

기본 사이트 구성

  1. GitLab 기본 사이트에 SSH로 로그인한 후 root로 전환합니다.

    sudo -i
    
  2. /etc/gitlab/gitlab.rb에 고유한 Geo 사이트 이름을 추가합니다.

    ##
    ## Geo 사이트의 고유 식별자. 자세한 내용은
    ## https://docs.gitlab.com/ee/administration/geo_sites.html#common-settings를 참조하세요.
    ##
    gitlab_rails['geo_node_name'] = '<여기에_사이트_이름_입력>'
    
  3. 변경 사항을 적용하려면 기본 사이트를 다시 구성합니다.

    gitlab-ctl reconfigure
    
  4. 해당 사이트를 기본 Geo 사이트로 정의합니다.

    gitlab-ctl set-geo-primary-node
    

    이 명령은 /etc/gitlab/gitlab.rb에 정의된 external_url을 사용합니다.

  5. gitlab 데이터베이스 사용자를 위한 암호를 생성합니다.

    1. 원하는 암호의 MD5 해시를 생성합니다.

       gitlab-ctl pg-password-md5 gitlab
       # 암호 입력: <여기에_암호_입력>
       # 암호 확인: <여기에_암호_입력>
       # fca0b89a972d69f00eb3ec98a5838484
      
    2. /etc/gitlab/gitlab.rb을 편집합니다.

       # `gitlab-ctl pg-password-md5 gitlab`로 생성된 해시로 채웁니다.
       postgresql['sql_user_password'] = '<여기에_암호의_md5_해시_입력>'
      
       # Puma 또는 Sidekiq를 실행하는 모든 노드는 아래와 같이 데이터베이스
       # 암호를 지정해야 합니다. 고가용성 설정인 경우 모든 응용 프로그램 노드에
       # 이 설정이 있어야 합니다.
       gitlab_rails['db_password'] = '<여기에_암호_입력>'
      
  6. 데이터베이스 복제 사용자를 위한 암호를 정의합니다. /etc/gitlab/gitlab.rb에서 정의된 사용자를 사용하세요. 기본값은 gitlab_replicator입니다.

    1. 원하는 암호의 MD5 해시를 생성합니다.

       gitlab-ctl pg-password-md5 gitlab_replicator
      
       # 암호 입력: <여기에_암호_입력>
       # 암호 확인: <여기에_암호_입력>
       # 950233c0dfc2f39c64cf30457c3b7f1e
      
    2. /etc/gitlab/gitlab.rb을 편집합니다.

       # `gitlab-ctl pg-password-md5 gitlab_replicator`로 생성된 해시로 채웁니다.
       postgresql['sql_replication_password'] = '<여기에_암호의_md5_해시_입력>'
      
    3. 선택 사항. Linux 패키지로 관리되지 않는 외부 데이터베이스를 사용하는 경우 gitlab_replicator 사용자를 만들고 해당 사용자의 암호를 수동으로 정의해야 합니다.

      --- 새로운 'replicator' 사용자 생성
      CREATE USER gitlab_replicator;
      
      --- 암호 설정 및 복제 권한 부여
      ALTER USER gitlab_replicator WITH REPLICATION ENCRYPTED PASSWORD '<복제_암호>';
      
  7. /etc/gitlab/gitlab.rb에서 geo_primary_role을 사용하도록 역할을 설정합니다.

    ## Geo 기본 역할
    roles(['geo_primary_role'])
    
  8. PostgreSQL이 네트워크 인터페이스에서 수신하도록 구성합니다.

    1. Geo 사이트의 주소를 조회하려면 Geo 사이트에 SSH로 연결한 후 다음 명령을 실행합니다.

      ##
      ## 사설 주소
      ##
      ip route get 255.255.255.255 | awk '{print "Private address:", $NF; exit}'
      
      ##
      ## 공용 주소
      ##
      echo "External address: $(curl --silent "ipinfo.io/ip")"
      

      대부분의 경우, 다음 주소를 사용하여 GitLab Geo를 구성합니다:

      구성 주소
      postgresql['listen_address'] 기본 사이트의 공용 또는 VPC 사설 주소.
      postgresql['md5_auth_cidr_addresses'] 기본 사이트와 보조 사이트의 공용 또는 VPC 사설 주소.

      Google Cloud Platform, SoftLayer 또는 기타 가상 사설 클라우드(VPC)를 제공하는 공급업체를 사용하는 경우, postgresql['md5_auth_cidr_addresses']postgresql['listen_address']에서 기본과 보조 사이트의 사설 주소(VPC의 경우 “내부 주소”에 해당)를 사용할 수 있습니다.

      참고: 0.0.0.0 또는 *listen_address로 사용해야 하는 경우, postgresql['md5_auth_cidr_addresses'] 설정에 127.0.0.1/32를 추가하여 Rails가 127.0.0.1을 통해 연결할 수 있도록 해야 합니다. 자세한 내용은 issue 5258를 참조하세요.

      네트워크 구성에 따라 제시된 주소가 잘못될 수 있습니다. 기본와 보조 사이트가 로컬 영역 네트워크, Amazon의 VPC 또는 Google의 VPC와 같은 가용성 영역을 연결하는 가상 네트워크를 통해 연결되는 경우, PostgreSQL[‘md5_auth_cidr_addresses’] 설정에서 보조 사이트 사설 주소를 사용해야 합니다.

    2. /etc/gitlab/gitlab.rb에 다음 줄을 추가합니다. 주소는 네트워크 구성에 맞게 적절히 대체하세요.

      ##
      ## 기본 주소
      ## - '<기본_노드_IP>'를 Geo 기본 노드의 공용 또는 VPC 주소로 교체하세요.
      ##
      postgresql['listen_address'] = '<기본_사이트_IP>'
      
      ##
      # PostgreSQL 클라이언트 인증을 기본 및 보조 IP에서 허용합니다. 이 IP는 예를 들어 CIDR 형식으로 공용 또는 VPC 주소일 수 있습니다. ['198.51.100.1/32', '198.51.100.2/32']와 같이요.
      ##
      postgresql['md5_auth_cidr_addresses'] = ['<기본_사이트_IP>/32', '<보조_사이트_IP>/32']
      
  9. PostgreSQL이 개인 주소에서 수신하고 재시작한 후 듣고 있는지 확인하기 위해 netstat -plnt | grep 5432를 실행합니다.

  10. PostgreSQL 트래픽을 보호하기 위해 인증서가 자동으로 생성되었습니다. eavesdroppers에서 PostgreSQL 트래픽을 보호하기 위해 인증서를 보조 사이트에 복사합니다.

    1. 기본 사이트에서 server.crt의 사본을 만듭니다.

      cat ~gitlab-psql/data/server.crt
      
    2. 나중에 보조 사이트를 구성할 때 출력을 저장합니다. 인증서는 민감한 데이터가 아닙니다.

    일반적인 PostgreSQL 공통 이름으로 인증서가 자동으로 생성되었습니다. 호스트 이름 불일치 오류를 방지하려면 데이터베이스를 복제할 때 verify-ca 모드를 사용해야 합니다.

보조 서버 구성

  1. GitLab 보조 사이트에 SSH를 하고 root로 로그인합니다.

    sudo -i
    
  2. 사이트가 구성되기 전에 어떤 명령도 실행되지 않도록 하려면 응용 프로그램 서버와 Sidekiq를 중지합니다.

    gitlab-ctl stop puma
    gitlab-ctl stop sidekiq
    
  3. 주 사이트 PostgreSQL 서버로의 TCP 연결을 확인합니다: TCP 연결 확인

    gitlab-rake gitlab:tcp_check[<primary_site_ip>,5432]
    

    만약 이 단계에서 실패하면, 잘못된 IP 주소를 사용하고 있거나 방화벽이 사이트 접속을 막고 있을 수 있습니다. IP 주소를 확인하고 공용 주소와 사설 주소의 차이에 유의하십시오. 방화벽이 있다면, 보조 사이트가 5432 포트로 주 사이트에 연결할 수 있도록 허용되어 있는지 확인하십시오.

  4. 보조 사이트에서 server.crt라는 파일을 만들고 주 사이트를 구성할 때 만든 인증서 사본을 추가합니다.

    editor server.crt
    
  5. 보조 사이트에서 PostgreSQL TLS 확인을 설정하려면 server.crt를 설치합니다.

    install \
       -D \
       -o gitlab-psql \
       -g gitlab-psql \
       -m 0400 \
       -T server.crt ~gitlab-psql/.postgresql/root.crt
    

    이제 PostgreSQL은 TLS 연결을 확인할 때 정확히 이 인증서만 인식합니다. 이 인증서는 주 사이트에서만 가지고 있는 개인 키로 복제할 수 있습니다.

  6. gitlab-psql 사용자가 주 사이트 데이터베이스에 연결할 수 있는지 테스트합니다. 기본 Linux 패키지 이름은 gitlabhq_production입니다.

    sudo \
       -u gitlab-psql /opt/gitlab/embedded/bin/psql \
       --list \
       -U gitlab_replicator \
       -d "dbname=gitlabhq_production sslmode=verify-ca" \
       -W \
       -h <primary_site_ip>
    

    프롬프트가 나타나면 gitlab_replicator 사용자에 대해 설정한 평문 암호를 입력하십시오. 모든 것이 올바르게 작동했다면, 주 사이트 데이터베이스 목록이 표시됩니다.

  7. /etc/gitlab/gitlab.rb를 편집하고 역할을 geo_secondary_role로 설정합니다.

    ##
    ## Geo 보조 역할
    ## - 종속 플래그를 자동으로 구성하여 Geo를 활성화합니다.
    ##
    roles(['geo_secondary_role'])
    

    자세한 내용은 Geo 역할을 참조하십시오.

  8. PostgreSQL을 구성하려면, /etc/gitlab/gitlab.rb를 편집하고 다음을 추가합니다.

    ##
    ## 보조 주소
    ## - '<secondary_site_ip>'를 Geo 보조 사이트의 공용 또는 VPC 주소로 바꿉니다.
    ##
    postgresql['listen_address'] = '<secondary_site_ip>'
    postgresql['md5_auth_cidr_addresses'] = ['<secondary_site_ip>/32']
    
    ##
    ## 데이터베이스 자격 증명 암호 (주 사이트에서 이전에 정의됨)
    ## - 기존 값과 동일한 값으로 여기서 재현합니다.
    ##
    postgresql['sql_replication_password'] = '<md5_hash_of_your_password>'
    postgresql['sql_user_password'] = '<md5_hash_of_your_password>'
    gitlab_rails['db_password'] = '<your_password_here>'
    

    IP 주소를 네트워크 구성과 일치하도록 교체해야 합니다.

  9. 변경 사항을 적용하려면 GitLab을 재구성합니다.

    gitlab-ctl reconfigure
    
  10. IP 주소 변경을 적용하려면 PostgreSQL을 다시 시작합니다.

    gitlab-ctl restart postgresql
    

데이터베이스 복제

보조 사이트의 데이터베이스를 주 사이트의 데이터베이스에 연결합니다. 아래 스크립트를 사용하여 데이터베이스를 복제하고 스트리밍 복제에 필요한 파일을 만들 수 있습니다.

이 스크립트는 기본 Linux 패키지 디렉토리를 사용합니다. 기본값을 변경했다면 스크립트에서 디렉터리와 경로 이름을 자체 이름으로 바꿔야 합니다.

경고: 복제 스크립트는 보조 사이트에서만 실행해야 합니다. 이 스크립트는 pg_basebackup를 실행하기 전에 모든 PostgreSQL 데이터를 제거하므로 데이터 손실이 발생할 수 있습니다.

데이터베이스를 복제하려면:

  1. GitLab 보조 사이트에 SSH를 하고 root로 로그인합니다.

    sudo -i
    
  2. 보조 사이트에서 데이터베이스에 대해 복제 슬롯 이름으로 사용할 데이터베이스 친화적인 이름을 선택합니다. 예를 들어, 도메인이 secondary.geo.example.com인 경우, secondary_example을 슬롯 이름으로 사용합니다. 복제 슬롯 이름은 소문자, 숫자 및 밑줄 문자만 포함해야 합니다.

  3. 아래 명령을 실행하여 데이터베이스를 백업하고 복원하고 복제를 시작합니다.

    경고: 각 Geo 보조 사이트는 고유한 복제 슬롯 이름을 가져야 합니다. 두 개의 보조 사이트 간에 동일한 슬롯 이름을 사용하는 것은 PostgreSQL 복제를 중단시킵니다.

    gitlab-ctl replicate-geo-database \
       --slot-name=<secondary_site_name> \
       --host=<primary_site_ip> \
       --sslmode=verify-ca
    

    프롬프트가 나타나면 gitlab_replicator에 대해 설정한 평문 암호를 입력하십시오.

복제 프로세스가 완료되었습니다.

새 보조 사이트 구성

복제 프로세스가 완료되면 인증된 SSH 키를 빠르게 찾을 수 있도록 구성해야 합니다.

참고: 인증은 기본 사이트에서 처리됩니다. 보조 사이트에 사용자 지정 인증을 설정하지 마십시오. 어드민 영역에 액세스가 필요한 변경 사항은 기본 사이트에서 수행해야 합니다. 보조 사이트는 읽기 전용 복사본이기 때문입니다.

비밀 GitLab 값 수동 복제

GitLab은 /etc/gitlab/gitlab-secrets.json에 여러 비밀 값을 저장합니다. 이 JSON 파일은 각 사이트 노드에서 동일해야 합니다. 모든 보조 사이트에 비밀 파일을 수동으로 복제해야 하지만, issue 3789에서 이 동작을 변경하는 것을 제안하고 있습니다.

  1. 기본 사이트의 Rails 노드에 SSH로 로그인하고 아래 명령을 실행합니다.

    sudo cat /etc/gitlab/gitlab-secrets.json
    

    이 명령은 JSON 형식으로 복제해야 하는 비밀 값을 표시합니다.

  2. 보조 지오 사이트의 각 노드에 SSH로 로그인하고 root로 전환합니다.

    sudo -i
    
  3. 기존 비밀을 백업합니다.

    mv /etc/gitlab/gitlab-secrets.json /etc/gitlab/gitlab-secrets.json.`date +%F`
    
  4. 기본 사이트 Rails 노드에서 /etc/gitlab/gitlab-secrets.json을 각 보조 사이트 노드로 복사합니다. 파일 내용을 노드 간에 복사하여 붙여넣을 수도 있습니다.

    sudo editor /etc/gitlab/gitlab-secrets.json
    
    # 기본 사이트에서 실행한 `cat` 명령의 출력을 붙여넣기
    # 저장하고 종료
    
  5. 파일 권한이 올바른지 확인합니다.

    chown root:root /etc/gitlab/gitlab-secrets.json
    chmod 0600 /etc/gitlab/gitlab-secrets.json
    
  6. 변경 사항을 적용하려면 각 Rails, Sidekiq 및 Gitaly 보조 사이트 노드를 다시 구성합니다.

    gitlab-ctl reconfigure
    gitlab-ctl restart
    

기본 사이트 SSH 호스트 키 수동 복제

  1. 보조 사이트의 각 노드에 SSH로 로그인하고 root로 전환합니다.

    sudo -i
    
  2. 기존 SSH 호스트 키를 백업합니다.

    find /etc/ssh -iname 'ssh_host_*' -exec cp {} {}.backup.`date +%F` \;
    
  3. 기본 사이트로부터 OpenSSH 호스트 키를 복사합니다.

    • 일반적으로 SSH 트래픽을 제공하는 기본 사이트 노드 중 하나로 root 또는 sudo 권한이 있는 사용자로 액세스할 수 있는 경우:

      # 보조 사이트에서 실행하며 서버의 IP 또는 FQDN에 대해 `<primary_site_fqdn>`을 변경함
      scp root@<primary_node_fqdn>:/etc/ssh/ssh_host_*_key* /etc/ssh
      
    • sudo 권한을 사용하는 사용자를 통해서만 액세스할 수 있는 경우:

      # 기본 사이트 노드에서 실행:
      sudo tar --transform 's/.*\///g' -zcvf ~/geo-host-key.tar.gz /etc/ssh/ssh_host_*_key*
      
      # 각 보조 사이트 노드에서 실행:
      scp <user_with_sudo>@<primary_site_fqdn>:geo-host-key.tar.gz .
      tar zxvf ~/geo-host-key.tar.gz -C /etc/ssh
      
  4. 각 보조 사이트 노드에 대해 파일 권한이 올바른지 확인합니다.

    chown root:root /etc/ssh/ssh_host_*_key*
    chmod 0600 /etc/ssh/ssh_host_*_key
    
  5. 키 지문이 일치하는지 확인하려면 각 사이트의 기본 및 보조 노드에서 다음 명령을 실행합니다.

    for file in /etc/ssh/ssh_host_*_key; do ssh-keygen -lf $file; done
    

    다음과 유사한 출력을 얻어야 합니다.

    1024 SHA256:FEZX2jQa2bcsd/fn/uxBzxhKdx4Imc4raXrHwsbtP0M root@serverhostname (DSA)
    256 SHA256:uw98R35Uf+fYEQ/UnJD9Br4NXUFPv7JAUln5uHlgSeY root@serverhostname (ECDSA)
    256 SHA256:sqOUWcraZQKd89y/QQv/iynPTOGQxcOTIXU/LsoPmnM root@serverhostname (ED25519)
    2048 SHA256:qwa+rgir2Oy86QI+PZi/QVR+MSmrdrpsuH7YyKknC+s root@serverhostname (RSA)
    

    두 노드에서 출력이 동일해야 합니다.

  6. 기존 개인 키에 올바른 공개 키가 있는지 확인합니다.

    # 개인 키의 지문을 출력합니다:
    for file in /etc/ssh/ssh_host_*_key; do ssh-keygen -lf $file; done
    
    # 공개 키의 지문을 출력합니다:
    for file in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf $file; done
    

    공개 및 비공개 키 명령에 대한 출력이 동일한 지문을 생성해야 합니다.

  7. 각 보조 사이트 노드에서 sshd를 재시작합니다.

    # Debian 또는 Ubuntu 설치
    sudo service ssh reload
    
    # CentOS 설치
    sudo service sshd reload
    
  8. SSH가 여전히 작동하는지 확인하기 위해 새 터미널에서 GitLab 보조 서버로 SSH합니다. 연결할 수 없는 경우 올바른 권한을 가졌는지 확인하십시오.

보조 사이트 추가

  1. 보조 사이트의 각 Rails 및 Sidekiq 노드에 SSH를 통해 루트로 로그인합니다:

    sudo -i
    
  2. /etc/gitlab/gitlab.rb를 편집하고 사이트에 고유한 이름을 추가합니다.

    ##
    ## Geo 사이트에 대한 고유 식별자. 자세한 내용은
    ## https://docs.gitlab.com/ee/administration/geo_sites.html#common-settings 를 참조하세요.
    ##
    gitlab_rails['geo_node_name'] = '<site_name_here>'
    

    고유한 이름을 저장하여 다음 단계에 사용합니다.

  3. 변경 사항을 적용하려면 보조 사이트의 각 Rails 및 Sidekiq 노드를 다시 구성합니다.

    gitlab-ctl reconfigure
    
  4. 기본 노드 GitLab 인스턴스로 이동합니다:
    1. 왼쪽 사이드바에서 하단에 있는 관리 영역을 선택합니다.
    2. Geo > 사이트를 선택합니다.
    3. 사이트 추가를 선택합니다.

      보조 사이트 추가

    4. 이름에는 /etc/gitlab/gitlab.rbgitlab_rails['geo_node_name']의 값을 입력합니다. 값은 정확히 일치해야 합니다.
    5. 외부 URL에는 /etc/gitlab/gitlab.rbexternal_url의 값을 입력합니다. 값이 /로 끝나는 경우에는 괜찮지만, 그렇지 않으면 값은 정확히 일치해야 합니다.
    6. 선택 사항. 내부 URL (선택 사항)에서 주요 사이트에 대한 내부 URL을 입력합니다.
    7. 선택 사항. 보조 사이트에서 복제해야 하는 그룹 또는 저장소 샤드를 선택합니다. 모두 복제하려면 필드를 비워 둡니다. 선택적 동기화를 참조하세요.
    8. 변경 사항 저장을 선택합니다.
  5. 보조 사이트의 각 Rails 및 Sidekiq 노드에 SSH를 통해 로그인하여 서비스를 재시작합니다:

    gitlab-ctl restart
    
  6. Geo 설정에 대한 일반적인 문제가 있는지 확인하려면 다음을 실행합니다:

    gitlab-rake gitlab:geo:check
    

    확인 사항 중 하나라도 실패하는 경우 문제 해결 문서를 참조하세요.

  7. 보조 사이트에 연결할 수 있는지 확인하려면 주요 사이트의 Rails 또는 Sidekiq 서버에 SSH로 로그인합니다:

    gitlab-rake gitlab:geo:check
    

    확인 사항 중 하나라도 실패하는 경우 문제 해결 문서를 확인하세요.

보조 사이트가 Geo 관리 페이지에 추가되고 다시 시작되면, 사이트는 자동으로 백필(backfill)이라는 프로세스로 기본 사이트에서 누락된 데이터를 복제하기 시작합니다.

한편, 기본 사이트는 각 보조 사이트에게 변경 사항을 즉시 처리할 수 있도록 알립니다.

보조 사이트가 실행되고 접근 가능한지 확인하세요. 주요 사이트에서 사용한 것과 동일한 자격 증명으로 보조 사이트에 로그인할 수 있습니다.

HTTP/HTTPS 및 SSH를 통한 Git 액세스 활성화

Geo는 HTTP/HTTPS를 통해 저장소를 동기화하므로 본 복제 방법을 활성화해야 합니다. 이는 기본적으로 활성화됩니다. 기존 사이트를 Geo로 변환하는 경우 복제 방법이 활성화되어 있는지 확인해야 합니다.

기본 사이트에서 다음을 수행하세요:

  1. 왼쪽 사이드바에서 하단에 있는 관리 영역을 선택합니다.
  2. 설정 > 일반을 선택합니다.
  3. 가시성 및 액세스 제어를 확장합니다.
  4. Git을 SSH로 사용하는 경우:
    1. 활성화된 Git 액세스 프로토콜SSH 및 HTTP(S)로 설정되었는지 확인합니다.
    2. 기본 및 보조 사이트에서 데이터베이스에서 SSH 키의 빠른 조회를 따릅니다.
  5. Git을 SSH로 사용하지 않는 경우 활성화된 Git 액세스 프로토콜Only HTTP(S)로 설정합니다.

보조 사이트의 올바른 작동 확인

기본 사이트에서 사용한 자격 증명으로 보조 사이트에 로그인할 수 있습니다.

로그인한 후:

  1. 왼쪽 사이드바에서 하단에 있는 관리 영역을 선택합니다.
  2. Geo > 사이트를 선택합니다.
  3. 사이트가 올바르게 보조 Geo 사이트로 식별되는지, 그리고 Geo가 활성화되었는지 확인합니다.

초기 복제에는 시간이 걸릴 수 있습니다. 기본 사이트 브라우저에서 기본 사이트 Geo 사이트 대시보드에서 각 Geo 사이트의 동기화 프로세스를 모니터링할 수 있습니다.

Geo 대시보드

관련 주제