1. 소개
이 Codelab에서는 독립적인 AlloyDB Omni 인스턴스 간에 논리 복제를 구성하는 방법을 보여줍니다. 단일 Compute Engine VM에 여러 AlloyDB Omni 인스턴스를 배포하고 pglogical 확장 프로그램을 사용하여 인스턴스 간에 복제를 설정합니다.
단일 노드에서 여러 인스턴스를 실행하는 것은 개발, 테스트 또는 복제 환경 시뮬레이션에 유용합니다. 이 Codelab을 마치면 하나의 인스턴스가 제공자 역할을 하고 다른 인스턴스가 구독자 역할을 하는 작동하는 복제 설정이 완료됩니다.
기본 요건
- Google Cloud 콘솔에서 Google Cloud 프로젝트 및 Cloud Shell에 액세스할 수 있습니다.
- Google Cloud SDK (
gcloud)가 설치되고 구성되어 있어야 합니다. gcloud 설치에 대한 자세한 내용은 gcloud-install을 참고하세요.
학습할 내용
gcloud를 사용하여 여러 AlloyDB Omni 인스턴스용 Compute Engine VM을 만들고 준비하는 방법- AlloyDB Omni RPM을 설치하는 방법
systemd템플릿을 사용하여 여러 AlloyDB Omni 인스턴스를 구성하고 초기화하는 방법pglogical을 사용하여 AlloyDB Omni 인스턴스 간에 논리 복제를 구성하는 방법- 제공자에서 구독자로 데이터를 복제하여 복제를 확인하는 방법
필요한 항목
- AlloyDB Omni RPM의 URL 링크를 가져옵니다. 저장소 URL 서버 링크를 포함한 링크가 이메일로 전송됩니다. Codelab 중에 사용할 수 있도록 다음 환경 변수를 초기화하여 URL을 준비합니다.
export ALLOYDB_OMNI_REPOSITORY_URL="..." - Google Cloud에 액세스할 수 있는 작동 중인 터미널 이 용도로 Cloud Shell을 사용할 수 있습니다.
2. 설정 및 요구사항
프로젝트 설정
Google Cloud 프로젝트 만들기
- Google Cloud 콘솔의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.
- Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.
Cloud Shell 시작
노트북에서 Google Cloud를 원격으로 운영할 수 있지만, 이 Codelab에서는 클라우드에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.

- Google Cloud 콘솔을 열고 오른쪽 상단 툴바에 있는 Cloud Shell 아이콘을 클릭합니다. 다음 방법 중 하나로 Cloud Shell을 열 수도 있습니다.
- Google Cloud 콘솔을 사용하는 경우 G 키를 누른 다음 S 키를 누릅니다.
- 이 링크를 클릭합니다.
Cloud Shell이 환경을 프로비저닝하고 연결하는 데는 일반적으로 몇 분 정도 걸립니다. 이 작업이 완료되면 다음과 비슷한 출력이 표시됩니다.

3. Compute Engine VM 만들기
이 섹션에서는 gcloud 명령줄 도구를 사용하여 단일 Compute Engine 가상 머신 (VM)을 만듭니다. AlloyDB Omni RPM와 완전히 호환되는 Rocky Linux 9 이미지를 사용합니다.
- 프로젝트 ID, VM 이름, 영역, 리전의 환경 변수를 정의합니다.
export PROJECT="your-project-id" export INSTANCE_NAME="alloydb-omni-multi-vm" export ZONE="us-central1-c" export REGION="us-central1" - Google Cloud 계정을 사용하여 로그인하고 기본 프로젝트를 구성합니다.
gcloud auth login gcloud config set project $PROJECT - IAP (Identity-Aware Proxy)를 사용하여 VM에 대한 SSH 연결을 허용하려면 방화벽 규칙을 만듭니다.
gcloud compute firewall-rules create allow-ssh-alloydb-omni \ --project=$PROJECT \ --direction=INGRESS \ --action=allow \ --rules=tcp:22 \ --source-ranges="0.0.0.0/0" - VM이 공개 IP 주소 없이 생성되므로 VM이 외부 패키지 저장소에 액세스하고 필요한 소프트웨어를 다운로드할 수 있도록 Cloud Router 및 Cloud NAT 게이트웨이를 구성합니다.
gcloud compute routers create alloydb-omni-router \ --project=$PROJECT \ --network=default \ --region=$REGION gcloud compute routers nats create alloydb-omni-nat \ --project=$PROJECT \ --router=alloydb-omni-router \ --region=$REGION \ --nat-all-subnet-ip-ranges \ --auto-allocate-nat-external-ips - 가상 프라이빗 클라우드 (VPC) 네트워크에 유효한 기본 인터넷 게이트웨이 경로가 있는지 확인합니다. 이 경로는 Cloud NAT가 아웃바운드 트래픽을 인터넷으로 전달하는 데 필요합니다.
gcloud compute routes create default-internet-route \ --project=$PROJECT \ --network=default \ --destination-range=0.0.0.0/0 \ --next-hop-gateway=default-internet-gateway - 필요한 사양 (vCPU 16개, 20GB 균형 있는 영구 디스크, Rocky Linux 9)으로 Compute Engine VM 인스턴스를 만듭니다. 보안을 강화하려면
--no-address플래그를 사용하여 VM에 공개 IP 주소가 할당되지 않도록 합니다.gcloud compute instances create $INSTANCE_NAME \ --project=$PROJECT \ --zone=$ZONE \ --machine-type=n2-highmem-16 \ --image-family=rocky-linux-9 \ --image-project=rocky-linux-cloud \ --boot-disk-size=20GB \ --boot-disk-type=pd-balanced \ --no-address - VM이 생성된 후 VM의 상태를 확인합니다.
gcloud compute instances list --filter="name=$INSTANCE_NAME" --project=$PROJECT
4. VM 준비
이 섹션에서는 새로 만든 VM에 연결하고 운영체제 환경을 준비합니다.
- IAP를 사용하여 SSH를 통해 VM에 연결합니다. VM에 공개 IP 주소가 없으므로
gcloud는 IAP를 통해 SSH 연결을 자동으로 터널링합니다.gcloud compute ssh $INSTANCE_NAME --zone=$ZONE --project=$PROJECT --tunnel-through-iap - 기본 데이터 디렉터리의 환경 변수를 정의합니다.
export BASE_PGDATA="/var/lib/alloydbomni" - 기본 데이터 디렉터리를 만듭니다.
sudo mkdir -p $BASE_PGDATA - SELinux 정책을 구성할 수 있도록
policycoreutils-python-utils패키지를 설치합니다.sudo dnf install -y policycoreutils-python-utils
5. AlloyDB Omni 설치
VM이 준비되면 이제 패키지 저장소를 구성하고 AlloyDB Omni RPM 패키지를 설치할 수 있습니다.
- 저장소 구성 파일을 만들어 VM에서 YUM 저장소를 구성합니다.
$ALLOYDB_OMNI_REPOSITORY_URL을 수신한 URL로 바꿉니다.export ALLOYDB_OMNI_REPOSITORY_URL="..." sudo tee /etc/yum.repos.d/alloydbomni.repo << EOF [alloydbomni] name=alloydbomni baseurl=$ALLOYDB_OMNI_REPOSITORY_URL enabled=1 repo_gpgcheck=0 gpgcheck=1 gpgkey=https://dl.google.com/linux/linux_signing_key.pub EOF - YUM 캐시를 업데이트합니다.
sudo yum makecache - AlloyDB Omni RPM 패키지 버전 18을 설치합니다.
sudo dnf install -y alloydbomni18
6. 여러 인스턴스 구성
이 섹션에서는 inst1 및 inst2의 두 인스턴스를 구성합니다.
- 여러 인스턴스를 지원하려면
systemd템플릿 서비스 파일alloydbomni18@.service을 만드세요.sudo tee /etc/systemd/system/alloydbomni18@.service << EOF [Unit] Description=AlloyDB Omni Database server instance %I After=syslog.target After=network-online.target [Service] SyslogIdentifier=alloydbomni-%I Type=notify User=postgres Group=postgres # Load configuration for the instance EnvironmentFile=/etc/alloydbomni/%I.conf OOMScoreAdjust=-1000 Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj Environment=PG_OOM_ADJUST_VALUE=0 ExecStartPre=/usr/lib/postgresql/18/bin/alloydbomni18-check-db-dir \${PGDATA} ExecStart=/usr/lib/postgresql/18/bin/postgres -D \${PGDATA} ExecReload=/bin/kill -HUP \$MAINPID KillMode=mixed KillSignal=SIGINT TimeoutSec=0 TimeoutStartSec=0 TimeoutStopSec=1h [Install] WantedBy=multi-user.target EOF - 새 템플릿 서비스를 인식하도록
systemd관리자 구성을 다시 로드합니다.sudo systemctl daemon-reload - AlloyDB Omni 인스턴스의 구성 디렉터리를 만듭니다.
sudo mkdir -p /etc/alloydbomni inst1의 데이터 디렉터리를 구성합니다.sudo tee /etc/alloydbomni/inst1.conf << EOF PGDATA=/var/lib/alloydbomni/inst1 EOFinst2의 데이터 디렉터리를 구성합니다.sudo tee /etc/alloydbomni/inst2.conf << EOF PGDATA=/var/lib/alloydbomni/inst2 EOF- 구성 파일에 적절한 권한을 설정합니다.
sudo chmod 640 /etc/alloydbomni/*.conf sudo chown postgres:postgres /etc/alloydbomni/*.conf - 두 인스턴스 모두에 대한 데이터 디렉터리를 만들고 올바른 소유권을 설정합니다.
sudo mkdir -p /var/lib/alloydbomni/inst1 sudo mkdir -p /var/lib/alloydbomni/inst2 sudo chown -R postgres:postgres /var/lib/alloydbomni sudo chmod 750 /var/lib/alloydbomni/inst1 /var/lib/alloydbomni/inst2 - 선택사항: 각 인스턴스의 리소스 한도를 설정합니다. 이렇게 하면 하나의 인스턴스가 모든 VM 리소스를 소비하는 것을 방지할 수 있습니다. 두 인스턴스 모두에
systemd재정의 디렉터리와 파일을 만듭니다.참고: 다음 구성에 사용된 리소스 한도 (40%)는 예시 값입니다. 특정 워크로드 및 VM 용량에 따라 한도를 조정합니다.inst1의 경우:sudo mkdir -p /etc/systemd/system/alloydbomni18@inst1.service.d sudo tee /etc/systemd/system/alloydbomni18@inst1.service.d/override.conf << EOF [Service] CPUQuota=40% MemoryMax=40% EOFinst2의 경우:sudo mkdir -p /etc/systemd/system/alloydbomni18@inst2.service.d sudo tee /etc/systemd/system/alloydbomni18@inst2.service.d/override.conf << EOF [Service] CPUQuota=40% MemoryMax=40% EOF
7. 데이터베이스 초기화 및 준비
각 데이터베이스 인스턴스를 별도로 초기화하고 준비합니다.
- 설정을 위해 SELinux를 허용 모드로 구성합니다.
주의: SELinux를 허용 모드로 설정하면 시행이 사용 중지되므로 신중하게 사용해야 합니다. 이 Codelab에서는 설치를 간소화하기 위해 사용됩니다. 프로덕션에서는 AlloyDB Omni가 시행 모드로 실행되도록 적절한 SELinux 정책을 구성합니다. 설정 후sudo setenforce 0sudo setenforce 1을 실행하여 시행을 다시 사용 설정할 수 있습니다. - PostgreSQL
postgres관리자 사용자의 안전한 비밀번호를 정의합니다. 이 비밀번호는 이 Codelab의 두 인스턴스 모두에 사용됩니다. 참고: Codelab의 단순성을 위해 명령줄 (예:export PGPASSWORD="YourStrongPassword123!"PGPASSWORD=$PGPASSWORD)에서 환경 변수를 사용하여 비밀번호를 전달하지만 프로세스 목록에 비밀번호가 노출될 수 있습니다. 프로덕션에서는.pgpass파일이나 보안 비밀 관리자와 같은 더 안전한 방법을 사용하세요.
inst1 설정
inst1의 데이터베이스 디렉터리를 초기화합니다.sudo PGPASSWORD=$PGPASSWORD \ PGDATA=/var/lib/alloydbomni/inst1 \ /usr/lib/postgresql/18/bin/alloydbomni18-setup initdbpostgresql.conf파일을 업데이트하여 포트5433에서 리슨하도록 인스턴스를 구성합니다.sudo sed -i \ "s/^#*[[:space:]]*port[[:space:]]*=[[:space:]]*[0-9]*/port = 5433/" \ /var/lib/alloydbomni/inst1/postgresql.conf- AlloyDB Omni용 데이터베이스 인스턴스를 준비합니다.
sudo PGPASSWORD=$PGPASSWORD \ PGDATA=/var/lib/alloydbomni/inst1 \ PGPORT=5433 \ /usr/lib/postgresql/18/bin/alloydbomni18-setup preparedb
inst2 설정
inst2의 데이터베이스 디렉터리를 초기화합니다.sudo PGPASSWORD=$PGPASSWORD \ PGDATA=/var/lib/alloydbomni/inst2 \ /usr/lib/postgresql/18/bin/alloydbomni18-setup initdb- 포트
5434에서 리슨하도록 인스턴스를 구성합니다.sudo sed -i \ "s/^#*[[:space:]]*port[[:space:]]*=[[:space:]]*[0-9]*/port = 5434/" \ /var/lib/alloydbomni/inst2/postgresql.conf - 데이터베이스 인스턴스를 준비합니다.
sudo PGPASSWORD=$PGPASSWORD \ PGDATA=/var/lib/alloydbomni/inst2 \ PGPORT=5434 \ /usr/lib/postgresql/18/bin/alloydbomni18-setup preparedb
8. AlloyDB Omni 서비스 시작
이제 두 인스턴스 모두에 대해 systemd 서비스를 시작할 수 있습니다.
- 새 구성과 재정의를 인식하려면
systemd관리자 구성을 새로고침합니다.sudo systemctl daemon-reload inst1의 서비스를 사용 설정하고 시작합니다.sudo systemctl enable alloydbomni18@inst1 sudo systemctl start alloydbomni18@inst1inst2의 서비스를 사용 설정하고 시작합니다.sudo systemctl enable alloydbomni18@inst2 sudo systemctl start alloydbomni18@inst2- 두 서비스가 모두 활성 상태이고 실행 중인지 확인합니다.
두 출력 모두에sudo systemctl status alloydbomni18@inst1 sudo systemctl status alloydbomni18@inst2Active: active (running)이 표시되는지 확인합니다.
9. AlloyDB Omni 인스턴스 확인
두 인스턴스가 모두 올바르게 작동하고 독립적인지 확인합니다.
inst1(포트 5433)에 연결합니다. 데이터베이스 초기화 및 준비에서 구성한 비밀번호를 입력하라는 메시지가 표시됩니다./usr/lib/postgresql/18/bin/psql -h localhost -p 5433 -U postgres -W- 쿼리를 실행하여 연결을 확인합니다.
postgres=# SELECT version(); - 인스턴스의 연결을 해제합니다.
postgres=# \q inst2(포트 5434)에 연결합니다./usr/lib/postgresql/18/bin/psql -h localhost -p 5434 -U postgres -W- 쿼리를 실행하여 연결을 확인합니다.
postgres=# SELECT version(); - 인스턴스의 연결을 해제합니다.
postgres=# \q
10. pglogical 복제용으로 구성
pglogical 확장 프로그램을 사용하여 두 인스턴스 간에 논리적 복제를 구성합니다. 이 시나리오에서 inst1는 제공업체 역할을 하고 inst2는 구독자 역할을 합니다.
참고: 이 Codelab에서는 복제 연결에 postgres 슈퍼 사용자를 사용합니다. 프로덕션 환경에서는 REPLICATION 권한이 있는 전용 복제 사용자를 만들고 복제되는 테이블에만 액세스 권한을 부여합니다.
pglogical 인스턴스 구성
shared_preload_libraries에서pglogical를 사용 설정하고postgresql.conf에서inst1의 다른 복제 매개변수를 구성합니다.# Append pglogical to shared_preload_libraries sudo sed -i \ "s/\(shared_preload_libraries\s*=\s*'\)\([^']*\)'/\1\2,pglogical'/" \ /var/lib/alloydbomni/inst1/postgresql.conf # Append replication settings sudo tee -a /var/lib/alloydbomni/inst1/postgresql.conf << EOF wal_level = logical max_replication_slots = 10 max_wal_senders = 10 max_worker_processes = 20 track_commit_timestamp = on alloydb.enable_pglogical = on alloydb.logical_decoding = on EOFinst1에 대해 구성한inst2의 설정을 구성합니다.# Append pglogical to shared_preload_libraries sudo sed -i \ "s/\(shared_preload_libraries\s*=\s*'\)\([^']*\)'/\1\2,pglogical'/" \ /var/lib/alloydbomni/inst2/postgresql.conf # Append replication settings sudo tee -a /var/lib/alloydbomni/inst2/postgresql.conf << EOF wal_level = logical max_replication_slots = 10 max_wal_senders = 10 max_worker_processes = 20 track_commit_timestamp = on alloydb.enable_pglogical = on alloydb.logical_decoding = on EOF- 구성 변경사항을 적용하려면 두 인스턴스를 모두 다시 시작합니다.
sudo systemctl restart alloydbomni18@inst1 sudo systemctl restart alloydbomni18@inst2
복제 역할 및 테이블 설정
inst1(제공자, 포트 5433)에서 복제 역할과 복제할 테이블을 만듭니다./usr/lib/postgresql/18/bin/psql -h localhost -p 5433 \ -U postgres -d postgres -c " DO \$\$ BEGIN IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'app_owner') THEN CREATE ROLE app_owner WITH LOGIN PASSWORD 'Password123'; END IF; END \$\$; GRANT ALL ON SCHEMA public TO app_owner; CREATE TABLE IF NOT EXISTS replication_test ( id SERIAL PRIMARY KEY, data TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ALTER TABLE replication_test OWNER TO app_owner; "inst2(구독자, 포트 5434)에서 동일한 역할과 테이블 구조를 만듭니다./usr/lib/postgresql/18/bin/psql -h localhost -p 5434 \ -U postgres -d postgres -c " DO \$\$ BEGIN IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'app_owner') THEN CREATE ROLE app_owner WITH LOGIN PASSWORD 'Password123'; END IF; END \$\$; GRANT ALL ON SCHEMA public TO app_owner; CREATE TABLE IF NOT EXISTS replication_test ( id SERIAL PRIMARY KEY, data TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ALTER TABLE replication_test OWNER TO app_owner; "
pglogical 노드 및 구독 구성
inst1에서 pglogical 제공자 노드를 초기화합니다./usr/lib/postgresql/18/bin/psql -h localhost -p 5433 \ -U postgres -d postgres -c " CREATE EXTENSION IF NOT EXISTS pglogical; SELECT pglogical.create_node( node_name := 'provider', dsn := 'host=127.0.0.1 port=5433 dbname=postgres user=postgres password=YourStrongPassword123!' ); SELECT pglogical.replication_set_add_table('default', 'replication_test'); "- pglogical 구독자 노드를 초기화하고
inst2에서 구독을 만듭니다. 참고: 구독을 만든 후 초기 동기화가 완료되는 데 시간이 걸릴 수 있습니다./usr/lib/postgresql/18/bin/psql -h localhost -p 5434 \ -U postgres -d postgres -c " CREATE EXTENSION IF NOT EXISTS pglogical; SELECT pglogical.create_node( node_name := 'subscriber', dsn := 'host=127.0.0.1 port=5434 dbname=postgres user=postgres password=YourStrongPassword123!' ); SELECT pglogical.create_subscription( subscription_name := 'test_subscription', provider_dsn := 'host=127.0.0.1 port=5433 dbname=postgres user=postgres password=YourStrongPassword123!' ); "
11. pglogical 복제 확인
제공자에서 데이터를 삽입하고 구독자에서 데이터를 쿼리하여 복제가 예상대로 작동하는지 확인합니다.
- 구독이 활성 상태인지 확인합니다.
replicating로 전환하는 데 몇 초 정도 걸릴 수 있습니다./usr/lib/postgresql/18/bin/psql -t -A -h localhost -p 5434 \ -U postgres -d postgres -c " SELECT status FROM pglogical.show_subscription_status() WHERE subscription_name = 'test_subscription'; " - 계속하기 전에 출력에
replicating가 표시되는지 확인합니다. - 제공자 (
inst1)에 테스트 행을 삽입합니다./usr/lib/postgresql/18/bin/psql -h localhost -p 5433 \ -U postgres -d postgres -c " INSERT INTO replication_test (data) VALUES ('Hello from replication provider!'); " - 데이터가 복제되었는지 확인하려면
inst2에서 테이블을 쿼리합니다./usr/lib/postgresql/18/bin/psql -h localhost -p 5434 \ -U postgres -d postgres -c "SELECT * FROM replication_test;"inst1에 삽입된 행이 표시되는지 확인합니다.
12. 삭제
리소스를 삭제합니다. 먼저 VM에서 AlloyDB Omni 인스턴스를 소멸한 다음 Google Cloud 리소스를 삭제합니다.
AlloyDB Omni 인스턴스 삭제
VM을 삭제하기 전에 서비스를 중지하고 사용 중지하고 구성과 데이터를 삭제하여 AlloyDB Omni 인스턴스를 정리할 수 있습니다.
inst1의 서비스를 중지하고 사용 중지하고 데이터와 구성을 삭제합니다.sudo systemctl stop alloydbomni18@inst1 sudo systemctl disable alloydbomni18@inst1 sudo rm -rf /var/lib/alloydbomni/inst1 sudo rm -f /etc/alloydbomni/inst1.confinst2의 서비스를 중지하고 사용 중지하고 데이터와 구성을 삭제합니다.sudo systemctl stop alloydbomni18@inst2 sudo systemctl disable alloydbomni18@inst2 sudo rm -rf /var/lib/alloydbomni/inst2 sudo rm -f /etc/alloydbomni/inst2.conf- systemd 관리자 구성을 새로고침하고 실패한 단위를 재설정합니다.
sudo systemctl daemon-reload sudo systemctl reset-failed
Google Cloud 리소스 정리
인스턴스를 정리한 후 Compute Engine VM과 기타 리소스를 삭제합니다.
- SSH 세션과의 연결을 끊습니다.
exit - Compute Engine VM 인스턴스를 삭제합니다.
gcloud compute instances delete $INSTANCE_NAME --zone=$ZONE --project=$PROJECT --quiet -
방화벽 규칙을 삭제합니다.
gcloud compute firewall-rules delete allow-ssh-alloydb-omni --project=$PROJECT --quiet - Cloud NAT 및 라우터를 삭제합니다.
gcloud compute routers nats delete alloydb-omni-nat --router=alloydb-omni-router --region=$REGION --project=$PROJECT --quiet gcloud compute routers delete alloydb-omni-router --region=$REGION --project=$PROJECT --quiet - 기본 인터넷 경로를 삭제합니다.
gcloud compute routes delete default-internet-route --project=$PROJECT --quiet
13. 축하합니다
단일 Compute Engine VM에 여러 AlloyDB Omni 인스턴스를 성공적으로 배포하고 구성했습니다.
학습한 내용
- Compute Engine VM을 프로비저닝하고 준비하는 방법
- AlloyDB Omni RPM을 설치하는 방법
- 여러 인스턴스에 대해
systemd템플릿을 구성하는 방법 - 서로 다른 포트에서 여러 독립 서비스를 초기화, 구성, 시작하는 방법
- 각 인스턴스의 독립성을 확인하는 방법
자세히 알아보기
- 설치 및 구성에 관한 자세한 내용은 AlloyDB Omni 문서를 참고하세요.
- 이 Codelab에서 사용된 복제 확장 프로그램에 대한 자세한 내용은 pglogical 문서를 참고하세요.