공간이 극도로 제한된 상태에서 Postgres 업그레이드

포럼에 문서화된 절차에는 Postgres 업그레이드 방법 두 가지가 나열되어 있습니다.

  1. Discourse가 처리하도록 두는 것입니다. 이렇게 하면 디스크 공간의 3배가 필요합니다. 따라서 DB가 100GB라면 업그레이드를 위해 공백 상태의 추가 200GB가 필요합니다. 대용량 설치 환경의 사용자에게는 명백한 큰 문제입니다.
  2. “수동 업데이트” 절차를 따르는 것입니다. 이 방법은 디스크 공간의 2배가 필요하므로, DB가 100GB라면 추가 100GB의 공백 공간이 필요합니다. 일부 사용자에게도 여전히 큰 문제입니다.

이 게시글에서 @Falco는 하드 링크를 사용하여 인플레이스(in-place) 업그레이드를 수행하기 위해 --link 옵션을 사용하라고 제안했습니다. 그가建议使用하는 Docker 컨테이너는 해당 인수를 지원하지만, Discourse 개발진은 해당 게시글에서 이를 사용할 것을 권장하지 않습니다.

따라서 제 질문은 다음과 같습니다. 옵션 3은 다음과 같이 되어야 하는가요?

  1. 아래 명령어를 실행하면 매우 적은 양의 추가 디스크 공간만 필요합니다. 예를 들어 DB가 100GB라면 추가 10GB 정도만 필요할 수 있습니다. 그렇다면 이것이 Discourse 개발진이 권장하는 절차이며, 실제로 시도해 보고 성공적으로 완료한 사람이 있는가요?

새로운 인플레이스 업그레이드 명령어:

docker run --rm \
	-v DIR:/var/discourse/shared/standalone/postgres_data:/var/lib/postgresql \
	tianon/postgres-upgrade:12-to-13 \
	--link

 

기존의 새 디렉터리로 업그레이드하는 명령어(2배의 공간 필요)와 비교:

docker run --rm \
	-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/12/data \
	-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/13/data \
	tianon/postgres-upgrade:12-to-13

P.S.: 해당 PG13 업그레이드 스레드에 바로 답글을 달았어야 했는데, 포럼은 7일 후에 게시글을 삭제하도록 설정되어 있습니다. 왜 그렇게 설정되어 있나요? 처음 이 문제가 제기되었을 당시 많은 논의가 있었는데, 참고용으로 유용했을 텐데 아쉽습니다.

만약 그렇게 한 사람이 있었다면, 여기서는 언급하지 않았습니다. 여기의 대부분의 지침은 최대한 실수를 방지하도록 설계되어 있으며, 시스템 관리에 대한 최소한의 지식을 요구합니다. 대부분의 사람들은 아주 적은 돈을 아끼기 위한 방법보다는 가장 안전하고 가장 많이 테스트된 방법을 선호합니다.

당신에게 효과가 있다면, PostgreSQL 13 업데이트에 맞게 업데이트할 수 있지만, 그렇게 하기 전에 bash가 무엇인지 모르는 사람에게 그렇게 하라고 권장하는 것이 괜찮다고 생각합니까? 데이터베이스가 손상되지 않고 사이트가 영원히 망가지지 않을 것이라고 확신합니까?

그 아이디어는 다른 유용한 정보가 제시되면, 사람들이 도움이 되거나 오히려 잘못된 것으로 밝혀질 수 있는 수년치 게시글을 읽어야 하는 대신 OP(원문)에 추가하자는 것입니다.

아니요, 확신이 서지 않습니다. 저는 Postgres에 대한 경험이 많지 않아서, Discourse 개발자 중 한 명이 실제로 작동하는지 확인해 주기를 바랐습니다.

설령 실제로 작동하더라도, 기존 방식은 롤백을 위해 데이터베이스의 별도 복사본을 유지하기 때문에 기본 업그레이드 절차로 권장하지는 않을 것입니다. 하지만 작동한다면, 저장 공간이 제한된 환경에서는 훌륭한 옵션이 될 수 있을 것입니다.

또 다른 쉬운 방법은 새 서버를 설정하고 데이터를 이관한 후 기존 서버를 끄는 것입니다. 기존 서버를 계속 사용해야 한다면, 업그레이드를 임시 서버에서 수행한 후 원래 서버에 새로 설치(아마도 OS 업그레이드가 필요할 것입니다)하고 다시 원래 서버로 옮기면 됩니다.

이 방법은 안전하고 간단하며 잘 문서화되어 있습니다. 수백 명이 이 방법을 사용해 왔습니다.

네, 하지만 그 작업에는 하루에서 이틀 정도가 걸릴 겁니다. 그 기간 동안에는 a) 해당 기간 동안 작성된 게시물이 삭제될 수 있음을 사용자에게 알리거나, b) 포럼을 읽기 전용으로 설정하는 두 가지 방법 중 하나를 선택할 수 있습니다. 어느 쪽이든 완벽한 해결책은 아닙니다.

서버가 재구축 기간보다 훨씬 오래 다운될 것 같지는 않습니다. 그리고 새 서버로 이전한 후 그곳에 머무른다면, 이전 작업을 하는 동안 기존 서버를 읽기 전용 모드로 유지할 수 있습니다. 다운타임이 걱정이라면, 새 서버로 이전하는 것이 훨씬, 훨씬 낫습니다.

우리는 꽤 큰 포럼을 운영하고 있지만, 백업 복구를 해본 적이 없어서 얼마나 걸릴지 정확히 알 수 없습니다. 만약 백업 복구를 진행한다면, 새 호스팅으로 이주할 것입니다. 하지만 추가적인 작업과 번거로움을 피하고 싶다면, 가능하면 이를 피하고 싶습니다.

네, 제가 Discourse on postgres 12 breaks upgrades - #8 by merefield 처음 제안했던 대로입니다.

그냥 한 번에 진행해 보는 건가요?

여기서 내가 올린 모든 게시글은 그 일을 피하기 위한 지속적인 시도였습니다.

@Wingtip 님, 이거 업그레이드된 적 있으셨나요?

제한된 공간 문제에서 업그레이드를 해결하는 또 다른 방법은 백업을 만든 후, postgres 디렉터리를 rm -r로 삭제하고, 다시 빌드한 다음 백업을 복원하는 것입니다. 지난주에 한 사이트에서 이렇게 처리했습니다.

백업은 데이터 디렉터리를 복제하는 것과 거의 같은 공간(압축까지 해야 하므로 더 많은 공간)을 차지하지 않을까요?

아니요, 업그레이드는 한 번도 하지 않았습니다. DB를 삭제하고 백업에서 복구하는 것은 꽤 위험해 보입니다. 기본적으로 인플레이스 업그레이드가 제대로 작동해야 합니다.

우리는 2023년에 지원이 종료되는 ubuntu 18.04를 사용 중입니다. 그래서 그 시점에는 어쩔 수 없이 새로운 호스트로 마이그레이션해야 할 것 같고, 그때를 기점으로 마음을 단단히 먹고 22.04 LTS가 설치된 새로운 호스트를 구축한 뒤 백업에서 복구할 계획입니다.

흠. 비슷할 수도 있겠네요. 백업 모델에서는 복사본 중 하나가 압축되는데, 이게 차이를 만들 수 있지 않을까요? 그리고 제가 작업했던 사이트는 S3에 백업을 저장하고 있었고, 테스트 사이트였기 때문에 문제가 생겨도 위험 부담이 낮았습니다.

하지만 백업은 인플레이스 업그레이드보다 훨씬 더 많은 상황과 빈도로 사용되므로, 저는 훨씬 더 안전하다고 생각합니다.

그럴 수도 있겠지만, 저는 postgres에 대해 전문 지식이 많지 않아서 직접 진행하는 데 자신이 없습니다. 반면, 완전히 다른 VM에서 백업으로 사이트 전체를 복구하는 것은 자신감이 있지만, 복구에 걸리는 시간만큼 게시물이 사라지는 결과를 감수해야 하므로 그것도 별로 달갑지 않습니다. 하지만 18.04가 더 이상 지원되지 않으므로, 내년에는 선택지가 많지 않을 것입니다.

데이터베이스가 수십 GB 규모가 아니라면 몇 시간이 걸리지 않습니다. 그리고 백업 및 복원 전에 포럼을 읽기 전용 모드로 전환하므로 게시물이 사라지지 않습니다. 거의 다운타임 없이 읽기 전용 시간만 발생하게 할 수 있으니 그렇게 어렵지 않습니다.

root@forum-app:/shared/postgres_data# du -sh
97G     .

읽기 전용으로 설정하기보다는, 오늘 작성된 게시글이 일시적이라는 내용을 알려주는 배너를 띄우는 편이 낫다고 생각합니다. 제 생각에는 그런 게시글이 사라지더라도 사람들이 자유롭게 이야기할 수 있게 하는 것이 더 좋습니다.

그때가 되면 내장된 Discourse 채팅 기능에도 접근할 수 있습니다. 이 기능은 2.9 버전에서 출시될 예정이며(기본적으로 비활성화되어 있을 수 있지만, 베타 단계에서 사용이 지원됩니다).