논리적 복제를 위해 구독자 클러스터 구성

문서 버전을 선택하세요.

이 문서에서는 구독자 클러스터를 수동으로 만들고 구성하는 방법을 보여주는 예를 제공합니다. 구독자 클러스터는 게시자 클러스터에서 복제된 데이터를 수신하는 데이터베이스 클러스터입니다.

이 페이지의 코드 스니펫은 모델로 사용할 수 있는 예시이며, 값을 AlloyDB Omni 리소스의 값으로 대체합니다.

시작하기 전에

구독자 클러스터 만들기 및 구성

  1. 구독자 클러스터를 만듭니다.

    $ 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로 설정하는 것이 좋습니다. 예를 들어 이 매니페스트에서 이전에 cpu2로 설정한 경우 memory16Gi로 설정하는 것이 좋습니다.

    • DISK_SIZE: 데이터베이스 인스턴스당 디스크 크기입니다(예: 10Gi).

  2. 필요한 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"
    
  3. 구독자 클러스터 데이터베이스 포드에 로그인합니다.

    $ 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을 구독자 포드의 이름으로 바꿉니다.

  4. 게시자 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
    
  5. 게시자 데이터베이스에 게시된 데이터의 초기 복사본으로 게시자에서 스키마 백업을 가져옵니다. 논리 복제는 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 주소로 바꿉니다.

  6. 구독자 데이터베이스에 백업을 적용합니다.

    postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres < /tmp/customer.schema-only.sql
    
  7. 선택사항: 테이블에 데이터가 없는지 확인합니다.

    # There is no data in table company
    customer=# select * from company;
    id | name | age | salary
    ----+------+-----+--------
    (0 rows)
    
  8. 데이터베이스의 구독을 만듭니다. 게시가 게시자 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에 생성된 복제 슬롯의 이름입니다.
  9. 선택사항: 게시자 클러스터에서 복제를 확인합니다.

    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)
    
  10. 게시자 클러스터에서 표에 행을 추가합니다.

    # 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의 테이블 이름으로 바꿉니다.

  11. 게시자 클러스터에서 테이블에 추가된 행이 구독자 클러스터의 테이블에 복제되었는지 구독자 클러스터에서 확인합니다.

    # 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)
    

추가 테이블 수동으로 만들기

논리적 복제는 pglogicalreplicate_ddl_command와 달리 DDL 변경사항을 자동으로 동기화하지 않습니다. 오픈소스 도구 pgl_ddl_deploy에서 솔루션을 제공하지만 게시자에서 DDL 명령어를 수동으로 실행할 수도 있습니다.

  1. 이를 설명하기 위해 게시자 클러스터의 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
    
  2. 게시자 클러스터에 새 테이블이 추가되면 구독자에서 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)
    

다음 단계