커뮤니티 여러분 안녕하세요,
저희는 셀프호스트 설치 환경에서 Discourse API를 사용하고 있습니다. 동시성 측면에서 상당히 집중적인 사용 사례로, 평균 초당 약 100개의 API 요청을 처리하고 있습니다. 또한 PostgreSQL+Patroni+HAProxy를 사용하여 고가용성 데이터베이스 환경을 구성하고 있습니다. 간헐적으로 PostgreSQL이 잠금(lock) 상태에 빠지고 Patroni가 마스터 노드를 재시작하는 문제가 발생합니다.
차단된 트랜잭션을 확인하기 위한 cron 작업을 구현했으며, 이 문제가 발생할 때마다 동일한 유형의 작업들을 발견합니다:
blocked_pid | blocked_user | blocking_pid | blocking_user | blocked_statement | current_statement_in_blocking_process
-------------+--------------+--------------+---------------+------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------
297904 | discourse | 293083 | discourse | UPDATE "api_keys" SET "last_used_at" = '2024-07-16 16:38:16.822352' WHERE "api_keys"."id" = 21 | UPDATE "api_keys" SET "last_used_at" = '2024-07-16 16:34:48.163449' WHERE "api_keys"."id" = 21
296718 | discourse | 293083 | discourse | UPDATE "api_keys" SET "last_used_at" = '2024-07-16 16:34:50.900480' WHERE "api_keys"."id" = 21 | UPDATE "api_keys" SET "last_used_at" = '2024-07-16 16:34:48.163449' WHERE "api_keys"."id" = 21
293101 | discourse | 293083 | discourse | UPDATE "api_keys" SET "last_used_at" = '2024-07-16 16:34:49.485074' WHERE "api_keys"."id" = 21 | UPDATE "api_keys" SET "last_used_at" = '2024-07-16 16:34:48.163449' WHERE "api_keys"."id" = 21
보시는 바와 같이, 많은 요청들이 동일한 API 키의 마지막 사용 시간을 업데이트하려고 시도하고 있습니다.
현재로서는 충돌 확률을 줄이기 위해 애플리케이션이 사용하는 API 키의 수를 늘렸습니다. API 키가 지난 1분 내에 수정되었는지 확인하여 업데이트를 피하는 코드가 존재하는 것을 확인했습니다. 그러나 요청을 처리하는 포드(pod)가 하나 이상이기 때문에 이 보호 기능이 효과적이지 않다고 추정합니다.
이것을 버그로 보고해야 하는지, 아니면 이러한 유형의 충돌을 피하기 위한 매개변수(Discourse 또는 PostgreSQL에서)가 있는지 불분명합니다. 참고로 저희에게 마지막 사용 시간 관련 정보는 중요하지만, 1일 단위의 해상도(resolution)면 충분합니다.
자동 복구(auto recovery)를 통한 PostgreSQL HA 관리를 위한 권장 접근 방식이 무엇인지도 알고 싶습니다.
감사합니다