database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 10520 게시물 읽기
No. 10520
HA 쿼리 취소 에러
작성자
coco
작성일
2025-04-22 15:47ⓒ
2025-04-23 10:10ⓜ
조회수
122

 

Postgresql 14버 이 Primary Standby 로 두대 설치 되어있습니다.

대략적인 설정은 streaming replication 중이고 hot standby 로 사용중입니다.

max_standby_streaming_delay : 30s

hot_standby_feedback : false

로그를 보면 쿼리 시작 1초 미만의 시간내 아래 에러가 발생 했습니다.

 

 

ERROR: canceling statement due to conflict with recovery

DETAIL: User query might have needed to see row versions that must be removed.

 

 

이 에러 로그가 왜 발생 하게 되었는지 알아보고 있지만 쉽지 않아 질문 드립니다.

 

1. 공식 문서(링크)에 max_standby_streaming_delay 설명을 보면 충돌시 Standby에 WAL 적용 전 까지 대기 시간 인것 처럼 쓰여있습니다.

그러면서도 두번째 문단에서는 취소 전 쿼리를 실행할 수 있는 길이는 아니다 라고 되어있습니다.

 

 

 

When hot standby is active, this parameter determines how long the standby server should wait before canceling standby queries that conflict with about-to-be-applied WAL entries, as described in Section 26.4.2max_standby_streaming_delay applies when WAL data is being received via streaming replication. If this value is specified without units, it is taken as milliseconds. The default is 30 seconds. A value of -1 allows the standby to wait forever for conflicting queries to complete. This parameter can only be set in the postgresql.conf file or on the server command line.

 

Note that max_standby_streaming_delay is not the same as the maximum length of time a query can run before cancellation; rather it is the maximum total time allowed to apply WAL data once it has been received from the primary server. Thus, if one query has resulted in significant delay, subsequent conflicting queries will have much less grace time until the standby server has caught up again.

 

 

그렇다면 제가 받은 에러의 경우, WAL은 max_standby_streaming_delay시간만큼 거의 다 될때 까지 기다렸다가 다음 쿼리가 실행 될때 걸려들었다고 생각해도 되는것인가요? 맞다면 그 근거는 무엇일까요?

공식 문서상 문구가 애매해 이해가 잘 되지 않습니다.

 

2. 처음에 들었던 추측은 Vaccum에 의해 정리당한 경우 max_standby_streaming_delay만큼 기다려도 의미가 없어 즉시 취소 기능이 있는건 아닌지 의심했습니다. 혹시 이런 기능이 있을가요?

있다면 어디에서 이 내용을 찾아 볼 수 있을까요?

 

혹시 질문과 상황을 이해하는데 더 필요한 내용이 있다면 알려주시면 감사하겠습니다.

이 글에 대한 댓글이 총 1건 있습니다.

쿼리 하는 시점에 이미 그 자료가 primary 에서 지워졌는 경우에 발생하는 오류입니다. 

일반적으로 read only secondary 쪽에서 아주 많은 자료를 select 할 때, 

그 자료가 primary 에서 지워지고, vacuum 까지 진행되고, 그게 secondary 쪽에 반영되어버릴 때 발생합니다. 


secondary 쪽에서 max_streaming_delay 는 wal 반영을 최대 30초까지는 지연해서 반영하겠다는 설정입니다. 

오래걸리는 쿼리의 실행시간이 최대 30초 안에는 끝날 것이다는 가정인거죠. 

그 안에 끝나는 쿼리에 대해서는 secondary에 있는 자료를 보여줄건데, 

그 이상 걸리면, 쿼리가 충돌했다고 쿼리 실패로 처리하고, wal 내용을 반영합니다. 


통상 비동기식 복제 노드를 구축하는 경우는 

hot_standby_feedback 은 true, max_streaming_delay 를 0으로 설정해서 

최대한 primary 상태를 즉각 반영하겠다고 설정해서 운영하거나, 

(이렇게 되면, primary 쪽 대량 변경 작업 때는 secondary 쪽에서 이런 오류가 자주 발생합니다.)

반대로 hot_standby_feedback 은 false, max_streaming_delay 아주 큰값(사용하는 최대 쿼리 허용 시간)을 지정해서 wal 반영을 최대한 미뤄 쿼리 실패는 하지 않으나, 자료가 최신 primary 자료가 아닌 상태로 운영하거나 합니다. 

서비스 성격에 따라서 적당히 조절해야겠죠. 

 

김상기(ioseph)님이 2025-05-13 15:28에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
105249.x에서 17버전으로 바꾸니 프로그램에서 처리가 안되는 부분이 있네요 ㅜ.ㅜ [3]
이기자
2025-05-13
39
10522버전을 업시키니 odbc 연결이 안됩니다. [2]
이기자
2025-05-09
60
10520HA 쿼리 취소 에러 [1]
coco
2025-04-22
122
10519auto vacuum 로그 질문 드려요 [1]
궁금해요
2025-04-04
189
10518오라클의 통계정보관련 기능이 PostgreSQL에서 구현이 가능할까요? [1]
dba
2025-03-14
297
10517WAL 공부중인데 이게 정상인 상황인지 궁금합니다 [1]
박선웅
2025-02-26
346
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2025 DSN, All rights reserved.
작업시간: 0.010초, 이곳 서비스는
	PostgreSQL v17.5로 자료를 관리합니다