postgres--wal

3834 단어
WAL 메커니즘
지속성이란 업무가 제출된 후 시스템에 미치는 영향이 영구적이어야 하며, 설령 시스템이 의외로 다운되더라도, 업무 수정된 데이터가 영구 저장소에 영구적으로 기록되었는지 확인해야 한다.
가장 간단한 실현 방법은 사무를 제출한 후 수정된 데이터를 디스크에 바로 쓰는 것이다.그러나 디스크와 메모리 사이의 IO 작업은 데이터베이스 성능에 가장 영향을 미친다.
WAL (Write Ahead Logging) 은 데이터가 수정된 후 디스크에 쓰기 전에 로그를 디스크에 미리 씁니다.로그를 다시 만들 때 업무의 일치성 상태를 회복할 수 있고 일부 실행된 업무 상태가 없도록 합니다.
WAL 메커니즘의 도입은 업무의 지속성과 데이터의 완전성을 확보하고 빈번한 IO가 성능에 미치는 영향을 최대한 피한다.
WAL을 사용하면 로그 파일을 디스크에 새로 고치기만 하면 업무가 제출되고 수정된 데이터를 디스크에 바로 쓸 필요가 없기 때문에 디스크를 쓰는 횟수를 현저히 줄일 수 있다.
로그 파일은 연속적으로 쓰기 때문에 동기화 로그의 비용은 데이터 페이지를 새로 고치는 비용보다 훨씬 적다.
서버가 대량의 병렬 사무를 처리할 때, 로그 파일은 fsync를 한 번에 여러 사무를 제출할 수 있다.
postgresql 데이터베이스는 WAL 매개 변수를 조정하여 로그가 디스크에 기록되는 선후 순서를 제어할 수 있습니다.먼저 로그를 디스크에 쓰면 데이터의 완전성을 완전히 보장하고 붕괴될 때 최근의 업무를 복구할 수 있다.디스크에 기록하면 충돌할 때 업무가 회복될 수 있고 데이터의 결과도 진실하고 정확하다는 것을 보장하기 어렵다.
WAL은 다운된 후에 데이터베이스 파일의 내용을 복원할 수 있기 때문에 JFS(journaled file systems)는 데이터 파일이나 WAL 파일의 신뢰할 수 있는 저장에 필요하지 않다.JFS는 특히 파일 시스템 데이터를 디스크로 새로 고칠 때 시스템 성능에도 영향을 미칠 수 있다.
WAL 로그 파일
http://www.postgres.cn/news/viewone/1/96
WAL 로그 파일 pgwal(PG10, 기본값은/var/lib/pgsql/10/data/pg wal/) 디렉토리이며 일반적으로 각 파일은 16M 크기입니다.
파일 이름은 8글자씩 24자씩, timeline+logId+logSeg 형식으로 구성되며 각 그룹의 의미는 다음과 같습니다.
    00000001 00000000 000000BC
    -------- -------- --------
            LogId    LogSeg

   :   timeline,  1       , 1,2,3...
LogId:32bit      ,  0       , 0,1,2,3...
LogSeg:32bit      ,  0       , 0,1,2,3...

PostgreSQL에서는 WAL 로그 위치를 16진수 두 개의 숫자 가운데 슬래시 "/"로 구분하여 LSN(WAL 로그 위치, 즉 Log Sequence Number)을 나타냅니다.
WAL 쓰기 확대
PostgreSQL은 빈번한 장면에 쓰기 때문에 대량의 WAL 로그가 발생할 수 있고 WAL 로그의 양이 실제 업데이트된 데이터량을 훨씬 초과할 수 있다. 이런 현상을'WAL 쓰기 확대'라고 한다.
WAL 쓰기 확대의 주요 원인은 2가지입니다.
 checkpoint         ,   WAL     page,    (full page writes)。                                 。
            (ctid)    ,          ,        WAL。                         ,      WAL   。

과도한 WAL 출력은 시스템 리소스의 소모를 초래하므로 적절한 최적화가 필요합니다.
  IO:WAL      ,         WAL           。        。
  IO:               ,        。
    :   WAL  ,            。

WAL 레코드의 구성
공간을 주로 차지하는 것은 "Block data"입니다.하나의 WAL 레코드는 블록과 관련되지 않을 수도 있고 여러 블록과 관련될 수도 있습니다.
"Block data"의 내용은 아마도 아래의 몇 가지 상황 중의 하나일 것이다
full page image
   checkpoint         ,     page   ( full page image,  FPI)。  page      hole      ,     wal_compression = on    page        。

buffer data
     FPI ,    page      。

full page image + buffer data
     ,     FPI,         

WAL 로그 해결
로그 보기 명령
/usr/pgsql-10/bin/pg_waldump /var/lib/pgsql/10/data/pg_wal/00000001000000280000005F -b
......
rmgr: Heap        len (rec/tot):     68/    68, tx:  103824377, lsn: 28/5F4CBB38, prev 28/5F4CBAF0, desc: HOT_UPDATE off 24 xmax 103824377 ; new off 43 xmax 0
blkref #0: rel 1663/26173/27777 fork main blk 968682
......

설명은 다음과 같습니다.
rmgr: Heap
PostgreSQL   WAL     20          。  WAL          Heap,   。  Heap  Btree,Transaction 。 

len (rec/tot):     68/    68
WAL       68  ,  main data   68  (   main data      ,         )。

tx: 103824377,   

lsn: 28/5F4CBB38, WAL   LSN

prev 28/5F4CBAF0,  WAL   LSN

desc: HOT_UPDATE off 24 xmax 103824377 ; new off 43 xmax 0
    UPDATE     (           16    WAL    ), tuple page     24( ctid     ), tuple page     43。

blkref #0: rel 1663/26173/27777 fork main blk 968682
      page( tuple  page)        1663/26173/27777,968682( ctid     )。  oid2name         (    postgresql10-contrib postgresql10-docs)。

 -bash-4.1$ /usr/pgsql-10/bin/oid2name -f 968682
  From database "postgres":
    Filenode        Table Name
  ----------------------------
    968682  pgbench_accounts 

관련 매개 변수는 클릭하세요
전재 대상:https://www.cnblogs.com/lykops/p/8263089.html

좋은 웹페이지 즐겨찾기