PostgreSQL 설정 중 wal_level 이라는 설정이 있습니다.
WAL 에 저장되는 데이터의 양이나 수준을 지정하는 설정으로
streaming replication 을 위해서는 최소 wal_level = replica
logical replication을 위해서는 최소 wal_level = logical 설정이 필요한데
정확히 이 두 설정값에 따라 데이터가 어떻게 저장되는지에 대한 설명이 부족해서 찾아본 내용을 공유합니다.

logical replicaion 원리

  • WAL record가 생성되면 logical decoding 을 거쳐 변경된 데이터를 RecorderBufferChange (HeapTupleData)로 재구성합니다.
  • pgoutput plugin이 이 tuple을 subscriber, 즉 슬레이브에게 보냅니다
  • HeapTupleData를 받은 slave는 변경 전 데이터 (tuple-old)를 찾아 tuple-new 로 바꿔주는 DML 구문을 재 수행합니다.

wal_level = replica

  • update

t1 테이블에 (1,2,3,4) record 를 (1,20,3,4) 로 update 할 때 tuple_new 엔 변경된 데이터만 기록합니다.
4(20)8 의 의미는 (20) 값만 변경되었고 (20) 앞의 4바이트 (20) 뒤의 8바이트는 변하지 않았다는 의미입니다.

  • delete
    delete 할 땐 tuple_old의 정확한 데이터는 상관 없이 tuple_old의 위치 즉 ctid 값만 기록합니다.

wal_level = logical

  • update
    변경된 값만 저장한 wal_level=replica 와는 달리 변경되지 않은 데이터 전체도 새로운 tuple_new 로 저장합니다.

  • delete
    primary key, 전체 tuple 데이터, index 등 tuple_old의 정확한 데이터를 기록합니다.