PostgreSQL :로드 상태에서 실행중인 db에서 pg_start_backup ()을 수행 할 수 있습니까?


19

다운 타임 동안 확립 된 복제가 중단되었습니다 ( "요청 된 WAL 세그먼트가 이미 제거되었습니다") 마스터를 쉽게 다시 중지 할 수 없습니다.

우리가 할 수 있을까

  1. pg_start_backup(),
  2. rsync ${PGDATA}/ 마스터부터 노예까지
  3. pg_stop_backup()

... 마스터 postgresql이 여전히 전체로드 상태입니까? (또는 것 pg_start_backup()으로 이어질

  • 테이블 잠금 장치,
  • I / O 블록
  • 불일치,
  • 화재 경보,
  • 느린 DB 응답

다른 말로, pg_start_backup()우리의 응용 프로그램에 영향을 미칩니 까?


문서 를 확인 했습니까 ? 그것은 말한다 기본적으로 pg_start_backup는 완료하는 데 시간이 오래 걸릴 수 있습니다. "기본 절반 간 체크 포인트함으로써, 체크 포인트를 수행하고 검사 점은 상당한 기간에 걸쳐 확산 될 것입니다에 대한 I / O가 필요하기 때문입니다 interval (구성 매개 변수 checkpoint_completion_target 참조). 이는 쿼리 처리에 대한 영향을 최소화하기 때문에 일반적으로 원하는 것입니다. " 그러나 이것이 실제로 (그리고 귀하의 경우) 의미하는 것은 분명하지 않습니다.
dezso

답변:


11

pg_start_backupdezso 메모로 체크 포인트를 수행합니다. 이것은 영향을 미치지 만 데이터베이스는 어쨌든 검사 점을 정기적으로 수행하며 작동하려면 기능을 수행해야하므로 분명히 문제가되지 않습니다. 초기 검사 점은 적은 데이터가 누적되었음을 의미합니다. 즉, 검사 점의 항목 pg_start_backup이 정상보다 영향이 적습니다.

rsync 또는 이와 동등한 pg_basebackup단계 가 걱정되어야합니다 . 이것으로부터의 읽기 I / O는 순차적이기 때문에 그리 나쁘지는 않지만 여전히 데이터베이스의 I / O 성능을 크게 손상시킬 것입니다. 또한 핫 캐시 된 데이터를 RAM 캐시 밖으로 밀어내는 경향이 있습니다. -필요한 데이터를 다시 읽을 때 캐시 스 래싱을 일으키는 데이터를 사용합니다.

캐시 영향이 아닌 I / O 영향을 사용 nice하고 ionice제한 할 수 있습니다 . 그러나 비용이 든다. 백업 시간이 오래 걸리며 백업을 완료하고 실행할 때까지 pg_stop_backup시스템을 이해합니다. WAL을 누적하여 삭제할 수 없으며 백업 실행이 끝날 때 BIG 체크 포인트에 대한 검사 점 부채가 누적되며 테이블과 인덱스가 누적됩니다. 죽은 행을 정리할 수 없기 때문에 부풀어 오른다. 따라서 특히 이탈 테이블이 매우 높은 경우 백업을 영원히 수행 할 여유가 없습니다.

결국, 당신이 안전하게 사용할 수 있는지 여부를 말하기 어렵다 pg_start_backuppg_stop_backup사용자 환경에서 핫 백업을 위해. 대부분의 사람들은 할 수 있지만 하드웨어가 할 수있는 것의 가장자리에 가까워지고 타이밍 요구 사항이 빡빡하고 실속의 위험을 감수 할 수 없으며 매우 큰 테이블뿐만 아니라 매우 높은 이탈 테이블이 있으면 문제가 될 수 있습니다 .

불행히도, 당신은 그것을 테스트하고 볼 필요가 거의 있습니다.

가능하면 CHECKPOINTLVM, SAN 도구, EBS 또는 현재 사용중인 모든 것을 사용하여 데이터베이스가있는 볼륨의 원자 스냅 샷을 작성하는 것이 좋습니다. 이 작업을 수행 할 수 있으면 여가 시간에 스냅 샷을 복사 할 수 있습니다. 이 방법은 PITR / warm standby / hot standby의 기본 백업을 수행하는 데 적합하지 않지만 정적 백업 복사본에는 완벽하게 적합하며 시스템에 미치는 영향이 훨씬 적습니다. 그러나 스냅 샷이 원 자성이고 WAL을 포함한 전체 데이터베이스가 단일 볼륨에있는 경우에만이를 수행 할 수 있습니다.

내가 아직 조사하지 않은 한 가지 가능성은 두 가지 접근법을 결합하는 것입니다. 하나는 가능할 수도 있습니다 ( 테스트되지 않았고 잘못되었을 수도 안전 하지 않습니다. 아직 모르겠습니다).

  • pg_start_backup
  • 모든 테이블 스페이스, 기본 데이터 디렉토리 및 xlog 볼륨의 스냅 샷 트리거
  • pg_stop_backup
  • 에서 최종 아카이브까지 WAL 복사 pg_stop_backup
  • 스냅 샷 된 볼륨에서 데이터 복사

기본적으로, 사용자가 여가 시간에 복사 할 수있는 각 볼륨의 특정 시점을 가져 와서 DB가 체크 포인트를 지연시켜야하는 시간을 줄이려고합니다.


pg_start_backup ()이 대부분 "제어 된 체크 포인트"라는 것을 이해 한 후에, 우리는 단순히 시도하고 보겠다는 확신을 얻었습니다. 실행중인 응용 프로그램에 미치는 영향은 무시할만한 것으로 보입니다. (SSD의 마스터 데이터 디렉토리) :-) 당신이 제안한 "가장 안전하지 않은"아이디어는 우리의 역량 수준을 약간 상회하며 모험에 대한 정욕입니다.
Daniel

아, 그리고 우리는 첫 번째 시도에서 rsync를 이온화하지 않았습니다. 실제로 마스터에서 추가로드를보고 싶었 기 때문입니다. 우리는 두 번째 rsync 실행이 필요하지 않았으므로 모두 좋습니다. 우리는 그로부터 무언가를 배웠습니다.
Daniel

7

이것은 중대한 파기이지만 여기서 수정해야합니다.

이전 답변은 다음과 같습니다.

nice 및 ionice를 사용하여 I / O 영향을 제한 할 수 있습니다 (캐시 영향은 아님). 그러나 비용이 든다. 백업 시간이 오래 걸리며 백업을 완료하고 pg_stop_backup을 실행할 때까지 시스템은 WAL을 누적하여 삭제할 수 없으며 백업 실행이 끝날 때 BIG 검사 점에 대한 검사 점 부채를 누적하고 테이블을 누적합니다. 죽은 행을 정리할 수 없기 때문에 인덱스 팽창. 따라서 특히 이탈 테이블이 매우 높은 경우 백업을 영원히 수행 할 여유가 없습니다.

그건 사실이 아니야. 시스템은 구성에 명시된 WAL 수를 유지합니다 ( 온라인 설명서 참조 ). 따라서 기본적으로 다음 사이의 높은 값입니다.

  • (2 + checkpoint_completion_ratio) * checkpoint_segments + 1
  • wal_keep_segments

이 경우를 상상해 봅시다.

  • 복사 할 수백 개의 공연이 있기 때문에 백업 시간이 오래 걸림
  • 소규모 WAL 보유 (예 : checkpoint_segments to 3)
  • WAL 보관을 설정하지 않았습니다

그런 다음 "pg_start_backup ()"을 시작하면 백업 중에 WAL 파일이 회전합니다. 백업이 완료되면 다른 데이터베이스 엔진에 복원을 시도합니다. 발사 엔진은 요청합니다 적어도 당신이 발행 할 때 "pg_start_backup를) ("생성 된 WAL 파일.

pg_start_backup 
-----------------
B/D0020F18
(1 row)

WAL 파일 "0000000x0000000B000000D0"(여기서 x는 TimelineID ) 을 제공 할 때까지 데이터베이스 부팅을 허용하지 않습니다 . 이 WAL 파일은 시스템 부팅에 필요한 최소값입니다. 물론이 파일 만 있으면 나머지 데이터가없는 WAL 파일에 있지만 최소한 데이터베이스 엔진이 작동하므로 데이터가 손실됩니다.

따라서 WAL 보관을 수행하거나 필요한 WAL 파일을 직접 저장해야하지만 Postgresql은이를 수행하지 않습니다.


3
아주 좋은 관찰. 이것은 피할 수 있습니다pg_basebackup --xlog-method=stream내가 틀리지 않으면 .
내일

2
예. PG 9.2 이후 기본 백업으로 WAL을 스트리밍 할 수 있습니다. 두 번째 스트림이 열리므로 max_wal_senders최소값을 2 로 설정 해야합니다 . 이는 백업이 끝날 때 "WAL 누락"문제를 피하는 좋은 방법입니다.
sterfield

4

PostgreSQL에 대한 나의 경험에 관해서는 그 순간에 실제로 큰 성능 영향을 미치지 않는 한 비교적 안전한 작업입니다. 당신이 그것을 가지고 있다면 모든 클라이언트에서 일시적으로 쓰기를 일시 중지하는 것이 좋습니다.

로드시 마스터를 슬레이브에 동기화하는 동안 하나의 중요한 사례가 있었으며 OOM 킬러로 인해 발생했습니다 (예, 실제로 데이터베이스 노드에서 OOM 킬러를 완전히 비활성화해야합니다. 당일은 몰랐습니다).

그래서 야간 백업에서 데이터베이스를 복원하고 재생을 위해 pg_archive 디렉토리의 모든 WAL 세그먼트를 postgres에 제공했습니다 (그냥 pg_xlog 폴더에 복사했습니다). 물론 모든 것이 잘되었지만 가동 중지 시간은 불가피했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.