1. 소개
이 Codelab에서는 Google Compute Engine (GCE) 가상 머신 (VM)에 AlloyDB Omni 고가용성 (HA) 클러스터를 배포하는 방법을 보여줍니다. 이 Codelab을 마치면 관리 작업을 위한 컨트롤 노드와 함께 데이터베이스 노드 3개와 HAProxy 노드 2개로 구성된 HA 참조 아키텍처를 프로비저닝합니다.
기본 요건
- Cloud 콘솔에서 Google Cloud 프로젝트 및 Cloud Shell에 액세스할 수 있습니다.
- Google Cloud SDK (
gcloud)가 설치되고 구성되어 있어야 합니다. gcloud 설치에 대한 자세한 내용은 gcloud-install을 참고하세요. - Terraform v1.9.8이 설치되어 있습니다.
학습할 내용
- AlloyDB Omni용 GCE VM을 만들고 준비하는 방법
- AlloyDB Omni RPM Orchestrator를 설치하고 실행하는 방법
- HA 참조 아키텍처용 AlloyDB Omni RPM을 설치하고 구성하는 방법
필요한 항목
- AlloyDB Omni RPM 및 RPM 조정자의 URL 링크를 가져옵니다. 이를 위해서는 alloydb omni 가입 양식을 작성해야 합니다. 링크는 저장소 URL 서버의 이메일로 전송됩니다. Codelab 중에 사용할 URL을 편리하게 사용할 수 있도록 다음 환경 변수를 초기화합니다.
export ORCHESTRATOR_ANSIBLE_COLLECTION_PATH="..." export ALLOYDB_OMNI_REPOSITORY_URL="..." export ALLOYDB_OMNI_ORCHESTRATOR_REPOSITORY_URL="..." export ALLOYDB_OMNI_COMMON_REPOSITORY_URL=.... export ETCD_REPOSITORY_URL="..." - AlloyDB Omni 배포 스택에 액세스할 수 있는 작동 중인 터미널 이 용도로 Cloud Shell을 사용할 수 있습니다.
2. 설정 및 요구사항
프로젝트 설정
Google Cloud 프로젝트 만들기
- Google Cloud 콘솔의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.
- Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.
Cloud Shell 시작
Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.
Google Cloud 콘솔에서 오른쪽 상단 툴바에 있는 Cloud Shell 아이콘을 클릭합니다.

또는 G를 누른 다음 S를 누릅니다. Google Cloud 콘솔에 있거나 이 링크를 사용하는 경우 이 시퀀스를 통해 Cloud Shell이 활성화됩니다.
환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 완료되면 다음과 같이 표시됩니다.

가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab의 모든 작업은 브라우저 내에서 수행할 수 있습니다. 아무것도 설치할 필요가 없습니다.
3. Google Cloud Compute Engine 가상 머신 만들기
Terraform 스크립트 준비
- 프로젝트 ID와 원하는 클러스터 이름의 환경 변수를 정의합니다. 이러한 내용은 Codelab 전반에 걸쳐 사용됩니다.
참고: Google Cloud 프로젝트 ID는 6~30자(영문 기준)여야 합니다. 자세한 내용은 https://docs.cloud.google.com/resource-manager/docs/creating-managing-projects#before_you_begin을 참고하세요.export PROJECT="your-project-id" export CLUSTER="your-cluster-name" - Google Cloud 계정 사용자로 로그인했는지 확인합니다.
gcloud auth login - 배포용 작업 디렉터리를 만들고 저장소 소스에서 필요한 Terraform 구성 파일을 복사합니다.
mkdir -p ~/alloydb-omni/$PROJECT/$CLUSTER cd ~/alloydb-omni/$PROJECT/$CLUSTER gcloud storage cp gs://alloydb-omni-install/rpm-orchestrator/gce/terraform/*.tf . - 다음 콘텐츠에 따라 참조 아키텍처에 필요한 매개변수를 지정하는
terraform.tfvars파일을 만듭니다.cat > terraform.tfvars <<EOF # Required instance counts for reference architecture db_instance_count = 3 haproxy_instance_count = 2 control_instance_count = 1 # Optional: Customize if needed with the below variables # os_image = "rocky-linux-cloud/rocky-linux-9" # zone = "us-west4-c" # region_1 = "us-west4" # db_instance_type = "c4-highmem-4" # db_disk_type = "hyperdisk-balanced" # db_data_size = "50" # GB # data_dir = "/data" EOF
Terraform 스크립트 실행 및 검증
- 이제 VM을 프로비저닝할 수 있습니다.
terraform init - VM을 만들기 전에 VM 및 기타 리소스를 만드는 데 필요한 액세스 권한이 있는지 확인합니다. 요약하자면 다음 권한이 필요합니다.
roles/compute.admin roles/iam.roleAdmin roles/compute.osAdminLogin roles/iam.serviceAccountCreator roles/iam.serviceAccountUser roles/artifactregistry.repoAdmin roles/storage.objectUser roles/resourcemanager.projectIamAdmin roles/serviceusage.serviceUsageAdmin - 구성을 검증하고 구성을 적용하여 리소스를 프로비저닝합니다.
참고: 배포 구성에서 예상하는 대로 Terraform v1.9.8을 사용하고 있는지 확인하세요.terraform validate terraform apply --auto-approve - Terraform이 완료되면
gcloud를 사용하여 생성된 인스턴스를 나열하여 가상 머신이 성공적으로 생성되었는지 확인합니다. 3개의 DB 노드, 2개의 HAProxy 노드, 제어 VM 및 해당 영역에 해당하는 인스턴스가 표시됩니다. 제어 노드의 영역을 기록합니다. 이 값은 이 Codelab의 뒷부분에서 필요합니다.gcloud compute instances list --filter="name~$CLUSTER" --project=$PROJECTexport ZONE=$(gcloud compute instances list \ --filter="name=$CLUSTER-control" \ --format="value(zone)" --project=$PROJECT)
4. 배포를 위해 VM 준비
제어 노드에 SSH 세션을 만들고 모든 VM (노드라고도 함)에 대한 SSH 액세스를 사용 설정하는 단계를 수행해야 합니다.
- 프로젝트 및 클러스터의 환경 변수가 정의되어 있는지 확인합니다.
export PROJECT="your-project-id" export CLUSTER="your-cluster-name" - SSH 키를 만들고 컨트롤 VM에 로그인할 때 동일한 키를 추가합니다.
# Replace values with your specific GCP project, cluster and zone details ssh-keygen -t ed25519 -f $HOME/.ssh/google_compute_engine gcloud compute os-login ssh-keys add --key-file=$HOME/.ssh/google_compute_engine.pub --project=$PROJECT - SSH 연결을 허용하고 VRRP 트래픽도 허용하는 방화벽 규칙을 만듭니다.
gcloud compute config-ssh --project=$PROJECT gcloud compute firewall-rules create $CLUSTER-allow-ssh --network=$CLUSTER --project=$PROJECT --direction=INGRESS --action=allow --rules=tcp:22 --source-ranges="0.0.0.0/0" gcloud compute firewall-rules create $CLUSTER-allow-vrrp --network=$CLUSTER --project=$PROJECT --allow=112 --source-ranges="0.0.0.0/0" - SSH를 통해 제어 VM에 연결합니다.
gcloud compute ssh "$CLUSTER-control" --zone=$ZONE --project=$PROJECT - 사용자 이름과 동일한 이름으로 제어 노드에 Linux 그룹을 만듭니다.
sudo groupadd $(id -un) sudo usermod -aG $(id -un) $(id -un) - Terraform 설정은 클러스터 이름, 서비스 계정, 프로젝트 이름 등을 포함하는 제어 VM의
/tmp/디렉터리에 몇 가지 구성 스크립트를 만들고 스테이징합니다.제어 노드의 설정 스크립트를 사용하여 제어 노드에서 모든 클러스터 노드로 비밀번호 없는 SSH 액세스를 만듭니다. 중요: service_account 사용자를 적어둡니다. 이 값은 이 Codelab의 뒷부분에서 SSH_USER로 사용됩니다./tmp/setup-ssh-for-cluster.sh - 이 Codelab에서는 모든 노드에서 SELinux를 사용 중지할 수 있습니다. Terraform 스크립트는 이 용도로 사용할 수 있는 '/tmp/run-all.sh'를 추가합니다.
/tmp/run-all.sh sudo setenforce 0 - AlloyDB Omni에 가입하고 링크를 얻었다면 이제 해당 URL을 환경 변수에 추가할 차례입니다.
다음 예와 같이cat >> ~/.codelab.env <<EOF export ORCHESTRATOR_ANSIBLE_COLLECTION_PATH="..." export ALLOYDB_OMNI_REPOSITORY_URL="..." export ALLOYDB_OMNI_ORCHESTRATOR_REPOSITORY_URL="..." export ALLOYDB_OMNI_COMMON_REPOSITORY_URL=.... export ETCD_REPOSITORY_URL="..." EOFterraform/variables.tf파일의 cidr_range 입력 변수에서 환경의 가상 IP를 결정하여 다른 노드와 충돌하지 않도록 합니다.cat >> ~/.codelab.env <<EOF export VIRTUAL_IP="10.1.0.50" EOF
5. 모든 VM에 필수 소프트웨어 구성요소 설치
다음 단계는 VM에 필수 SW 구성요소를 설치하는 것입니다. 이는 제어 노드에서 조정할 수 있습니다. 다음 명령어는 모두 제어 노드에서 실행해야 합니다.
- 아직 제어 노드에 있지 않은 경우 SSH를 통해 제어 VM에 연결합니다.
제어 VM ssh 프롬프트에 있으면 소스 환경 파일을 가져옵니다.gcloud compute ssh "$CLUSTER-control" --zone=$ZONE --project=$PROJECTsource ~/.codelab.env - 제어 노드에서 Ansible과 필요한 Python 라이브러리를 설치합니다.
sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm -y sudo dnf install -y ansible sudo dnf install -y python3-grpcio python3-protobuf python3-googleapis-common-protos python3-grpcio-status - 그런 다음 RPM Orchestrator Ansible 컬렉션 tar 파일을 다운로드하고 설치합니다.
참고: ORCHESTRATOR_ANSIBLE_COLLECTION_PATH 변수 끝에 '/'가 있어야 합니다.gcloud storage cp "gs://${ORCHESTRATOR_ANSIBLE_COLLECTION_PATH#https://storage.googleapis.com/}google-alloydbomni_orchestrator-*.tar.gz" . ansible-galaxy collection install google-alloydbomni_orchestrator-0.1.0-6.tar.gz ansible-galaxy collection list | grep alloydbomni_orchestrator - 오케스트레이터는 Ansible 인벤토리 형식의 배포 사양 파일을 사용하여 클러스터 토폴로지를 파악합니다. 제어 노드에 노드 세부정보가 포함된 deployment_spec.yaml이라는 파일을 만듭니다.
참고: 생성된 파일을 검토하여 유효한 값을 참조하는지 확인합니다.cat > deployment_spec.yaml <<EOF alloydbomni: vars: cluster_manager: name: "$CLUSTER" etcd: setup: true config_forcewrite: true alloydbomni: major_version: "18" repo_url: $ALLOYDB_OMNI_REPOSITORY_URL alloydbomni_monitor: repo_url: $ALLOYDB_OMNI_COMMON_REPOSITORY_URL alloydbomni_cluster_manager: repo_url: $ALLOYDB_OMNI_ORCHESTRATOR_REPOSITORY_URL alloydbomni_node_manager: repo_url: $ALLOYDB_OMNI_ORCHESTRATOR_REPOSITORY_URL pgbouncer: repo_url: $ALLOYDB_OMNI_COMMON_REPOSITORY_URL pgbackrest: repo_url: $ALLOYDB_OMNI_COMMON_REPOSITORY_URL children: primary_instance_nodes: hosts: $CLUSTER-db1: $CLUSTER-db2: $CLUSTER-db3: load_balancer_nodes: hosts: $CLUSTER-haproxy1: $CLUSTER-haproxy2: EOF - 오케스트레이터 컬렉션의 설치 역할을 참조하는 install.yaml이라는 플레이북을 만듭니다.
참고: 생성된 파일을 검토하여 유효한 값을 참조하는지 확인합니다.cat > install.yaml <<EOF - name: Install AlloyDB Omni cluster components hosts: all vars: ansible_become: true ansible_user: $SSH_USER ansible_ssh_private_key_file: $HOME/ssh-key-cluster-sa roles: - role: google.alloydbomni_orchestrator.install EOF - 인벤토리 파일을 사용하여 플레이북을 실행하여 지정된 모든 노드에 RPM을 다운로드하고 설치합니다.
ansible-playbook -i deployment_spec.yaml install.yaml
6. AlloyDB Omni 클러스터 부트스트랩
이 단계에서는 모든 노드에 필요한 구성요소를 모두 설치했습니다. AlloyDB Omni 클러스터를 부트스트랩할 준비가 되었습니다.
- 아직 제어 노드에 있지 않은 경우 SSH를 통해 제어 VM에 연결합니다.
제어 VM ssh 프롬프트에 있으면 소스 환경 파일을 가져옵니다.gcloud compute ssh "$CLUSTER-control" --zone=$ZONE --project=$PROJECTsource ~/.codelab.env - 비밀번호의 해시를 생성하고 이를 기록합니다.
encoded_password=$(echo -n "your unique password" | base64) - 클러스터를 만들려면 AlloyDB Omni가 클러스터를 구성하는 방법을 알아야 합니다. DB 클러스터 사양의 파일 이름 dbcluster.yaml을 만듭니다.
cat > dbcluster.yaml <<EOF Secret: metadata: name: db-pw-$CLUSTER spec: type: Opaque data: $CLUSTER: $encoded_password --- DBCluster: metadata: name: $CLUSTER spec: databaseVersion: 18.1.0 mode: "" availability: numberOfStandbys: 2 enableAutoFailover: true enableAutoHeal: true autoFailoverTriggerThreshold: 2 autoHealTriggerThreshold: 2 healthcheckPeriodSeconds: 5 replayReplicationSlotsOnStandbys: false primarySpec: adminUser: passwordRef: name: db-pw-$CLUSTER resources: cpu: 4 memory: 32Gi disks: - name: DataDisk path: $PGDATA dbLoadBalancerOptions: gcp: loadBalancerIP: "$VIRTUAL_IP" loadBalancerType: "internal" loadBalancerInterface: "eth0" EOF - AlloyDB Omni 클러스터를 만들기 위한 부트스트랩 Ansible 역할을 참조하는 bootstrap.yaml이라는 플레이북을 만듭니다.
cat > bootstrap.yaml <<EOF - name: Create DBCluster hosts: localhost vars: ansible_become: true ansible_user: $SSH_USER ansible_ssh_private_key_file: $HOME/ssh-key-cluster-sa roles: - role: google.alloydbomni_orchestrator.bootstrap EOF - 플레이북을 실행하여 클러스터 만들기
ansible-playbook bootstrap.yaml -i deployment_spec.yaml -e resource_spec=dbcluster.yaml
7. (선택사항) PgBouncer 연결 풀러 구성
AlloyDB Omni는 PgBouncer를 사용한 경량 연결 풀링을 지원합니다. 클러스터가 프로비저닝된 직후 PgBouncer를 구성하고 부트스트랩할 수 있습니다.
- 연결 풀러를 데이터베이스 클러스터와 연결하는 pgbouncer.yaml이라는 리소스 사양 파일을 만듭니다.
cat > pgbouncer.yaml <<EOF PgBouncer: metadata: name: pgbouncer-pooler spec: dbclusterRef: $CLUSTER allowSuperUserAccess: true accessMode: "rw" port: 6432 EOF - 앞서 만든 동일한 bootstrap.yaml 플레이북을 사용하여 PgBouncer 풀러를 부트스트랩하고 새 사양 파일을 전달합니다.
ansible-playbook bootstrap.yaml -i deployment_spec.yaml -e resource_spec=pgbouncer.yaml
8. AlloyDB Omni 클러스터 확인
클러스터가 올바르게 작동하고 부하 분산기를 사용하여 액세스할 수 있는지 확인하려면 제어 노드에서 표준 PostgreSQL 클라이언트를 사용하여 클러스터에 연결하면 됩니다.
- 제어 노드에 PostgreSQL 18 클라이언트 저장소 및 패키지를 설치합니다.
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo dnf install -y postgresql18 - 이전에 예약한 가상 IP를 사용하여 클러스터에 연결합니다. dbcluster.yaml에 인코딩한 비밀번호를 입력하라는 메시지가 표시됩니다.
/usr/pgsql-18/bin/psql -h $VIRTUAL_IP -U postgres -W - 연결되면 기본 SQL 쿼리를 실행하여 클러스터 상태를 확인할 수 있습니다(예: 데이터베이스 버전 확인).
AlloyDB Omni로 실행되는 PostgreSQL 18을 나타내는 출력이 표시됩니다.postgres=# SELECT version();\q를 입력하여 프롬프트를 종료합니다.
9. (선택사항) pgBackRest를 사용하여 데이터 백업
AlloyDB Omni는 pgBackRest와 통합되어 Cloud Storage에 직접 백업을 관리합니다. 백업 계획을 구성하고 Terraform 설정으로 만든 GCS 버킷에 주문형 백업을 트리거할 수 있습니다.
- 프로비저닝된 GCS 버킷을 가리키는 backup_plan.yaml이라는 백업 계획 사양 파일을 만듭니다.
cat > backup_plan.yaml <<EOF BackupPlan: metadata: name: pgb-plan spec: dbclusterRef: $CLUSTER backupLocation: type: GCS gcsOptions: bucket: $CLUSTER-gcs-backups key: /backups EOF - 백업 관리 역할을 참조하는 backup.yaml이라는 Ansible 플레이북을 만듭니다.
cat > backup.yaml <<EOF - name: Manage AlloyDB Omni Backups hosts: localhost vars: ansible_become: true ansible_user: $SSH_USER ansible_ssh_private_key_file: $HOME/ssh-key-cluster-sa roles: - role: google.alloydbomni_orchestrator.backup EOF - backup.yaml 플레이북을 사용하여 백업 계획을 적용합니다.
ansible-playbook backup.yaml -i deployment_spec.yaml -e resource_spec=backup_plan.yaml - 계획이 성공적으로 설정되면 create_backup.yaml이라는 주문형 백업 리소스 파일을 만듭니다.
cat > create_backup.yaml <<EOF Backup: metadata: name: on-demand-backup spec: backupPlanRef: pgb-plan dbclusterRef: $CLUSTER EOF - 플레이북을 실행하여 백업을 시작합니다.
ansible-playbook backup.yaml -i deployment_spec.yaml -e resource_spec=create_backup.yaml - 백업 상태를 확인하려면 status.yaml 플레이북을 만드세요.
- name: Fetch AlloyDB Omni Resource Status
hosts: localhost
vars:
ansible_become: true
ansible_user: $SSH_USER
ansible_ssh_private_key_file: $HOME/ssh-key-cluster-sa
roles:
- role: google.alloydbomni_orchestrator.status
EOF
- 플레이북을 실행하여 모든 백업을 나열합니다.
ansible-playbook status.yaml -i deployment_spec.yaml -e resource_type=Backup
- 또는 이전에 생성된 특정 백업에 관한 자세한 정보를 가져오려면
-e resource_name=on-demand-backup를 전달하세요.
ansible-playbook status.yaml -i deployment_spec.yaml \
-e resource_type=Backup \
-e resource_name=on-demand-backup
10. 리소스 정리
배포가 완료되면 프로비저닝된 리소스를 삭제하여 요금이 청구되지 않도록 할 수 있습니다.
- teardown.yaml이라는 플레이북을 만듭니다.
cat > teardown.yaml <<EOF - name: Tear down AlloyDB Omni cluster hosts: localhost vars: ansible_become: true ansible_user: $SSH_USER ansible_ssh_private_key_file: $HOME/ssh-key-cluster-sa roles: - role: google.alloydbomni_orchestrator.delete EOF - ansible-playbook을 사용하여 플레이북을 실행합니다. 백업을 구성한 경우 먼저 Backup 및 BackupPlan 리소스를 삭제합니다.
PgBouncer를 구성한 경우 다음으로 연결 풀러 리소스를 삭제합니다.ansible-playbook teardown.yaml -i deployment_spec.yaml -e "resource_type=Backup" -e "resource_name=on-demand-backup" ansible-playbook teardown.yaml -i deployment_spec.yaml -e "resource_type=BackupPlan" -e "resource_name=pgb-plan" 그런 다음 resource_type을 DBCluster로 지정하고 데이터베이스 클러스터 자체를 삭제합니다.ansible-playbook teardown.yaml -i deployment_spec.yaml -e "resource_type=PgBouncer" -e "resource_name=pgbouncer-pooler"ansible-playbook teardown.yaml -i deployment_spec.yaml -e "resource_type=DBCluster" -e "resource_name=$CLUSTER" - 클러스터가 삭제되면 컨트롤 노드에서 로그아웃하고 터미널로 다시 전환하여 Terraform 작업 디렉터리로 이동합니다.
참고: Cloud Shell에 새로 로그인한 경우 다음을 설정해야 합니다.export PROJECT="your-project-id" export CLUSTER="your-cluster-name" - VRRP 방화벽 규칙을 삭제하고 Terraform에서 관리하는 리소스를 폐기합니다.
gcloud compute firewall-rules delete -q "$CLUSTER-allow-vrrp" --project="$PROJECT" gcloud compute firewall-rules delete -q "$CLUSTER-allow-ssh" --project="$PROJECT" terraform destroy - 메시지가 표시되면 폐기를 확인합니다. 지속되는 네트워크 리소스 또는 경로로 인해 완전히 해체되지 않는 경우가 있으므로 다음 안전한 정리 명령어를 실행하여 연결된 모든 방화벽 규칙, NAT 게이트웨이, 라우터, 경로, 서브넷, 네트워크가 완전히 삭제되도록 합니다.
REGION을 특정 배포 리전(예: 'us-central1')으로 바꿉니다.# Delete any remaining firewall rules associated with the cluster gcloud compute firewall-rules list --project=$PROJECT 2> /dev/null | grep ^$CLUSTER- | cut -f1 -d' ' | \ while read rule; do gcloud compute firewall-rules delete --project=$PROJECT --quiet $rule; done # Delete the Cloud NAT gateway and router if they still exist gcloud compute routers nats describe $CLUSTER-nat-gw --router=$CLUSTER-router --region=REGION --project=$PROJECT 2>/dev/null \ && gcloud compute routers nats delete $CLUSTER-nat-gw --router=$CLUSTER-router --region=REGION --project=$PROJECT --quiet gcloud compute routers describe $CLUSTER-router --region=REGION --project=$PROJECT 2>/dev/null \ && gcloud compute routers delete $CLUSTER-router --region=REGION --project=$PROJECT --quiet # Delete any remaining custom routes gcloud compute routes list --project=$PROJECT --filter="network:$CLUSTER" --format="value(name)" 2>/dev/null | \ while read route; do gcloud compute routes delete --project=$PROJECT --quiet $route 2>/dev/null || true; done # Delete the subnet and network if they still exist gcloud compute networks subnets describe $CLUSTER --region=REGION --project=$PROJECT 2>/dev/null \ && gcloud compute networks subnets delete $CLUSTER --region=REGION --project=$PROJECT --quiet gcloud compute networks describe $CLUSTER --project $PROJECT 2> /dev/null \ && gcloud compute networks delete $CLUSTER --project $PROJECT --quiet
11. 축하합니다
축하합니다. Codelab을 완료했습니다.
학습한 내용
- AlloyDB Omni용 GCE VM을 만들고 준비하는 방법
- AlloyDB Omni RPM Orchestrator를 설치하고 실행하는 방법
- HA 참조 아키텍처용 AlloyDB Omni RPM을 설치하고 구성하는 방법
AlloyDB Omni에 관한 자세한 내용은 문서를 참고하세요.