이 페이지의 코드 스니펫은 모델로 사용할 수 있는 예시이며, 값을 AlloyDB Omni 리소스의 값으로 대체합니다.
시작하기 전에
- Kubernetes에 Omni Operator 설치
- 복제 슬롯, 게시자 클러스터, 게시를 만들어야 합니다. 자세한 내용은 복제 슬롯 및 게시 만들기를 참고하세요.
구독자 클러스터 만들기 및 구성
구독자 클러스터를 만듭니다.
$ cat << EOF | kubectl apply -f - apiVersion: v1 kind: Secret metadata: name: db-pw-DB_CLUSTER_NAME type: Opaque data: DB_CLUSTER_NAME: "ENCODED_PASSWORD" # Password is odspassword --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: subscriber spec: databaseVersion: "16.8.0" primarySpec: adminUser: passwordRef: name: db-pw-DB_CLUSTER_NAME resources: memory: MEMORY_SIZE cpu: CPU_COUNT disks: - name: DataDisk size: DISK_SIZE EOF
다음을 바꿉니다.
DB_CLUSTER_NAME
: 이 데이터베이스 클러스터의 이름입니다(예:subscriber-cluster
).ENCODED_PASSWORD
: 기본postgres
사용자 역할의 데이터베이스 로그인 비밀번호로, base64 문자열로 인코딩됩니다(예:ChangeMe123
의 경우Q2hhbmdlTWUxMjM=
).CPU_COUNT
: 이 데이터베이스 클러스터의 각 데이터베이스 인스턴스에서 사용할 수 있는 CPU 수입니다.MEMORY_SIZE
: 이 데이터베이스 클러스터의 데이터베이스 인스턴스당 메모리 양입니다. CPU당 8GB로 설정하는 것이 좋습니다. 예를 들어 이 매니페스트에서 이전에cpu
를2
로 설정한 경우memory
를16Gi
로 설정하는 것이 좋습니다.DISK_SIZE
: 데이터베이스 인스턴스당 디스크 크기입니다(예:10Gi
).
필요한 pod을 찾습니다.
$ kubectl get pod -l "alloydbomni.internal.dbadmin.goog/dbcluster=DB_CLUSTER_NAME, alloydbomni.internal.dbadmin.goog/task-type=database, dbs.internal.dbadmin.goog/ha-role=Primary"
구독자 클러스터 데이터베이스 포드에 로그인합니다.
$ kubectl get pod NAME READY STATUS RESTARTS AGE al-2bce-publisher-0 3/3 Running 0 20h $ kubectl exec -ti SUBSCRIBER_POD_NAME -- /bin/bash Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init) postgres@al-3513-subscriber-0:/$
SUBSCRIBER_POD_NAME
을 구독자 포드의 이름으로 바꿉니다.게시자 DBcluster에서 부하 분산기의 IP 주소를 찾습니다(예:
10.116.14.190
).$ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE al-publisher-rw-ilb ClusterIP 10.116.14.190 <none> 5432/TCP 21h
게시자 데이터베이스에 게시된 데이터의 초기 복사본으로 게시자에서 스키마 백업을 가져옵니다. 논리 복제는 DDL 복제를 지원하지 않습니다. 복제하려는 스키마 또는 테이블은 논리적 복제가 시작되기 전에 대상 (구독자 클러스터)에 있어야 합니다.
postgres@al-3513-subscriber-0:/$ pg_dump -h PUBLISHER_IP_ADDRESS -U postgres --create --schema-only customer > /tmp/customer.schema-only.sql
PUBLISHER_IP_ADDRESS
를 게시자 DBcluster의 부하 분산기 IP 주소로 바꿉니다.구독자 데이터베이스에 백업을 적용합니다.
postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres < /tmp/customer.schema-only.sql
선택사항: 테이블에 데이터가 없는지 확인합니다.
# There is no data in table company customer=# select * from company; id | name | age | salary ----+------+-----+-------- (0 rows)
데이터베이스의 구독을 만듭니다. 게시가 게시자 DBCluster에 이미 생성되었는지 확인합니다.
postgres@al-3513-subscriber-0:/$ CREATE SUBSCRIPTION sub_customer CONNECTION 'host=PUBLISHER_IP_ADDRESS port=5432 user=REPLICATION_USER dbname=DATABASE_NAME password=PUBLISHER_CLUSTER_PASSWORD sslmode=require' PUBLICATION PUBLICATION_NAME WITH (slot_name='REPLICATION_SLOT_NAME');
다음을 바꿉니다.
- REPLICATION_USER: 복제 슬롯에 연결하는 사용자의 이름입니다.
- DATABASE_NAME: 복제 슬롯에서 스트리밍하려는 변경사항이 있는 데이터베이스의 이름으로 설정됩니다.
- PUBLISHER_CLUSTER_PASSWORD: 게시자 DBCluster의
postgres
사용자의 데이터베이스 로그인 비밀번호입니다. - PUBLICATION_NAME: 구독자가 구독하는 게시 이름입니다.
- REPLICATION_SLOT_NAME: 게시자 DBCluster에 생성된 복제 슬롯의 이름입니다.
선택사항: 게시자 클러스터에서 복제를 확인합니다.
postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres DATABASE_NAME customer=# select * from public.company; id | name | age | salary ----+-------+-----+-------- 1 | Quinn | 25 | 65000 2 | Kim | 22 | 72250 3 | Bola | 31 | 53000 4 | Sasha | 33 | 105000 5 | Yuri | 27 | 85000 (5 rows)
게시자 클러스터에서 표에 행을 추가합니다.
# On the publisher database $ kubectl exec -ti al-2bce-publisher-0 -- /bin/bash Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init) postgres@al-2bce-publisher-0:/$ psql -h localhost -U postgres DATABASE_NAME customer=# insert into TABLE_NAME (id, name, age, salary) values (6, 'Alex', 39, 100000);
TABLE_NAME을 구독자가 구독한 게시자 DBCluster의 테이블 이름으로 바꿉니다.
게시자 클러스터에서 테이블에 추가된 행이 구독자 클러스터의 테이블에 복제되었는지 구독자 클러스터에서 확인합니다.
# On the subscriber database, data is synced. postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres DATABASE_NAME customer=# select * from TABLE_NAME; id | name | age | salary ----+-------+-----+-------- 1 | Quinn | 25 | 65000 2 | Kim | 22 | 72250 3 | Bola | 31 | 53000 4 | Sasha | 33 | 105000 5 | Yuri | 27 | 85000 6 | Alex | 39 | 100000 (6 rows)
추가 테이블 수동으로 만들기
논리적 복제는 pglogical
의 replicate_ddl_command
와 달리 DDL 변경사항을 자동으로 동기화하지 않습니다. 오픈소스 도구 pgl_ddl_deploy
에서 솔루션을 제공하지만 게시자에서 DDL 명령어를 수동으로 실행할 수도 있습니다.
이를 설명하기 위해 게시자 클러스터의
customer
데이터베이스에finance
라는 새 테이블을 만듭니다.# On the publisher database $ kubectl exec -ti al-2bce-publisher-0 -- /bin/bash Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init) postgres@al-2bce-publisher-0:/$ psql -h localhost -U postgres customer customer=# create table finance (row text); CREATE TABLE customer=# insert into finance values ('critical data'); INSERT 0 1 customer=# ALTER PUBLICATION pub_customer ADD TABLE finance; ALTER PUBLICATION
게시자 클러스터에 새 테이블이 추가되면 구독자에서 DDL(테이블 생성)을 수동으로 적용한 다음 구독자 클러스터에서 다음을 실행하여 복제를 확인합니다.
postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres customer customer=# create table finance (row text); CREATE TABLE customer=# ALTER SUBSCRIPTION sub_customer REFRESH PUBLICATION; ALTER SUBSCRIPTION customer=# select * from finance; row --------------- critical data (1 row)