ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PostgreSQL 아카이브 모드
    Database/PostgreSQL 2019.01.01 15:27



    PostgreSQL 아카이브 모드 (Archive Mode)



    - PostgreSQL에서 아카이브 모드를 이해하기전에 WAL을 자세히 알고 넘어가야 할 필요가 있습니다. 

    - WAL (Write-Ahead Logging)은 데이터 무결성을 보장하는 표준 방법입니다.

    - WAL의 중심개념은 변경 내용을 설명하는 로그 레코드를 영구적 저장소에 먼저 기록한 후에 데이터 파일의 변경 내용을 작성한 다는 것입니다. (오라클의 redo-archive와 비슷한 역할)

    - 충돌 발생시 로그를 사용하여 데이터베이스를 복구 할 수 있으므로 트랜잭션 커밋마다 데이터 페이지를 디스크에 쓸 필요가 없습니다. 데이터 페이지에 적용되지 않은 변경 내용은 로그 레코드에서 실행 취소가 가능합니다. (이것은 roll-forward 복구 이며, REDO라고도 합니다.)

    - 로그 파일은 순차적으로 작성되며, 로그 파일 동기화 비용은 데이터 페이지 쓰기 비용보다 훨씩 적습니다. 

    - 서버가 소규모 도시 트랜잭션을 다수 처리하는 경우 로그 파일의 fsync 하나로 여러가지 트랜잭션을 충분히 커밋할 수 있습니다.

    - 온라인 백업 및 PIT(point-in-time) 복구를 지원 가능하게 합니다.




     ※ $PGDATA 밑에 있는 postgresql.conf 파일안의 파라미터 값 수정하여 설정 가능합니다.


     ◆ wal_level (enum)

     - wal_level은 WAL에 기록되는 정보의 양을 결정합니다. 기본값은 충돌 또는 즉시 셧다운으로부터 복구하기 위해 필요한 정보만 기록하는 minimal 입니다.

      

      minimal : 기본값

      archive : WAL 아카이브에 필요한 로깅만 추가. 

      hot_standby : 대기 서버에서 읽기전용 쿼리에 필요한 정보를 추가.


     ◆ archive_mode (boolean)

      -archive_mode를 사용하는것으로 설정하면 완료된 WAL 세그먼트가 archive_command 설정에 의하 아카이브 저장소로 전달 됩니다. archive_mode 및 archive_command는 별개의 변수이므로 아카이빙 모드를 해지하지 않고도 archive_command를 변경할 수 있습니다. 이 매개변수는 서버 시작 시 설정됩니다. wal_level이 minimal로 설정된 경우 archive_mode를 사용 할 수 없습니다.

     

     ◆ archive_command (string)

      - 완료된 WAL 파일 세그먼트를 아카이브하기 위해 실행하는 로컬 쉘 명령입니다.

      - String : %p 아카이브할 파일의 경로명으로 대체

                 %f 파일명으로만 대체


     ◆ archive_timeout (integer)

      - archive_command는 완료된 WAL 세그먼트를 호출합니다. 그러므로 서버에는 WAL 트래픽이 발생되지 않아서 트랜잭션이 완료되는 시간과 아카이브 저장소에서 안전하게 기록 되는 사이에 긴 지연시간이 발생 할 수 있습니다. 데이터가 아카이브되지 않은 채로 방치되지 않게 하기 위해 서버가 새 WAL 세그먼트 파일로 주기적으로 전환되도록 archive_timeout을 설정할 수 있습니다. 

     - archive_timeout을 매우 짧게 설정하는 것은 저장소를 부풀게 함므로 현명하지 못하며, 1~2분정도로 설정하는 것이 좋습니다.




    ※ 실제로 설정 해보기


    $ vi postgresql.conf


    wal_level = archive

    archive_mode = on

    archive_command = 'cp %p /data/pgsql/archive/arch_%f.arc'

    archvie_timeout = 120


    :wq!


    postgres@psql-db01:/usr/local/pgsql/data]$ pg_ctl stop

    waiting for server to shut down.... done

    server stopped

    [1]+  Done                    postgres -D /usr/local/pgsql/data > /var/postgresql/log/postgresql.log 2>&1  (wd: /var/postgresql/log)

    (wd now: /usr/local/pgsql/data)

    postgres@psql-db01:/usr/local/pgsql/data]$ postgres -D /usr/local/pgsql/data >/var/postgresql/log/postgresql.log 2>&1 &

    [1] 52044

    $



    ※ 아카이브 모드 확인하기


    postgres=# select * from pg_settings

               where name in ('archive_mode', 'archive_command', 'archive_timeout', 'wal_level');

    postgres=# show wal_level;

    postgres=# show archive_mode;

    postgres=# show archive_command;



    로그 스위치


    pg_switch_xlog() / pg_xlogfile_name / pg_xlogfile_name_offset



    pg_switch_xlog() - 현재 사용중인 로그 파일을 아카이빙하고 새로운 파일로 스위칭 함.


    postgres=# select pg_switch_xlog();

     pg_switch_xlog 

    ----------------

     0/70000B0

    (1 row)


    pg_xlogfile_name / pg_xlogfile_name_offset - 아카이빙 된 파일명 출력


    postgres=# select pg_xlogfile_name('0/3000078'), pg_xlogfile_name_offset('0/3000078');

         pg_xlogfile_name     |    pg_xlogfile_name_offset     

    --------------------------+--------------------------------

     000000010000000000000003 | (000000010000000000000003,120)

    (1 row)



    현재 사용중인 로그 확인


    pg_current_xlog_locatioin() : 현재 사용중인 로그 출력


    postgres=# select pg_current_xlog_location();

     pg_current_xlog_location 

    --------------------------

     0/41000060

    (1 row)




    'Database > PostgreSQL' 카테고리의 다른 글

    PostgreSQL 로컬라이제이션  (0) 2019.01.01
    PostgreSQL 데이터베이스 Role  (0) 2019.01.01
    PostgreSQL 아카이브 모드  (0) 2019.01.01
    PostgreSQL 커널 리소스 관리  (0) 2019.01.01
    PostgreSQL 모니터링  (0) 2018.12.31
    PostgreSQL 점검  (0) 2018.12.31

    댓글 0

Designed by black7375.

티스토리 툴바