이 페이지의 코드 스니펫은 값을 자체 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).
필요한 포드를 찾습니다.
$ 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.sqlPUBLISHER_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)