PG::ConnectionBad 오류로 사이트가 일시적으로 충돌

에러 로그에서 간헐적으로 다음 오류가 발생하고 있습니다. 이로 인해 사이트가 15~30초 동안 접속이 불가능한 상태가 됩니다.

정보 오류 메시지:

PG::ConnectionBad (FATAL: the database system is in recovery mode) /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/pg-1.2.3/lib/pg.rb:58:in `initialize’

환경 오류 메시지:


이 로그들을 살펴보니 정말 이상한 점이 하나 있습니다. /var/www/… 폴더를 찾는 것처럼 보이는데, 해당 폴더는 서버에 존재하지 않습니다. 이 폴더가 존재해야 하는 건가요? 도움이 필요합니다.

데이터베이스가 손상되면 사이트도 반드시 손상됩니다. 원인을 파악해야 합니다. 가장 흔한 원인은 RAM과 디스크 공간 부족입니다. 제 추측은 RAM입니다. RAM 용량은 얼마인가요? free -h 명령의 출력은 무엇인가요?

그것은 컨테이너 내부의 경로입니다. ./launcher enter app을 실행하면 해당 폴더를 볼 수 있습니다.

맞는 말씀인 것 같습니다. free -h 명령의 출력 결과는 다음과 같습니다.

image

131M의 여유 공간은 나에게겐 꽤 적은 것 같습니다.

음, 현재 사용 가능한 메모리가 646MB이고, 4GB라면 스왑은 일반적으로 권장되지 않습니다. 데이터베이스 크기는 어느 정도인가요? 트래픽량은 얼마나 되나요? 서버에서 Discourse 외에 다른 것이 실행되고 있나요?

서버에서는 Discourse 외에 다른 것은 실행되지 않습니다.

크기를 확인하기 위해 다음을 실행했습니다.

./launcher enter app
rails db
SELECT pg_size_pretty(pg_database_size(current_database()));

결과 출력은 4650 MB (1 row)였습니다.

트래픽에 관해서는:
어제 페이지뷰는 1,200회, 지난 한 주 동안에는 12,400회였습니다. 지난 한 주 동안 약 160명의 사용자가 있었고, 특정 시점에는 약 80명의 동시 접속자가 있었습니다.

여유 있는 디스크 공간이 있다면 스왑을 추가하여 일시적으로 숨 쉴 공간을 확보하세요.

스왑 공간을 1GB 추가했습니다. 오늘 밤 트래픽이 집중될 때 어떤 일이 벌어질지 지켜보겠습니다.

image

정말 대단하세요. 1GB 스왑을 추가한 뒤 크래시 문제가 모두 해결된 것 같습니다. RAM 문제였지 DB 문제가 아니어서 정말 다행이에요. 이번 주말에 서버의 RAM 용량을 늘릴 예정입니다. 이 스레드에서 도와주신 모든 분들께 진심으로 감사드립니다!

완료된 후 discourse-setup을 다시 실행하여 메모리 매개변수가 재설정되도록 하세요.

처음부터 제대로 튜닝이 됐는지 궁금하네요. :man_shrugging:t2:

솔직히 확신할 수 없습니다. 이전에는 하드웨어를 변경한 후 재빌드와 서버 재시작을 수행한 적이 있습니다. 재부팅 후에는 시스템 변경 사항이 Discourse에 반영되었을 것으로 추정됩니다.

스왑 파일을 설치한 후 4GB 이상의 "메모리"가 사용된 경우가 있었는데, 이는 서버가 충돌했던 가장 바쁜 시간대와 일치합니다. 오늘 업그레이드를 완료했고, 현재 사이트는 매우 잘 작동하고 있습니다.

하지만 실제로는 그렇지 않습니다. app.yml에 내장되어 있는 설정들이 데이터베이스가 사용할 수 있는 RAM 양 등을 제어합니다. 이 설정들은 수동으로 편집하거나 discourse-setup을 다시 실행하여 변경할 수 있습니다.

오늘 discourse-setup 함수를 다시 실행했습니다. 이전에 그 사실을 몰랐기 때문입니다. 저에게는 새로운 것이었습니다.