[PostgreSQL] 13 => 18 마이그레이션 노트 (AWS RDS)
AWS RDS에서 PostgreSQL 13 버전의 기술지원이 종료됨에 따라 최신 버전으로의 마이그레이션을 단행하게 되었다.
그간 버전들에서 I/O 관련 최적화나 Vacuum 개선 등이 많이 들어가서 전체적인 성능 향상도 될 것이라고 기대하면서 업그레이드를 했다.
PostgreSQL이 일반적인 경우에서는 하위호환을 대체로 잘 지켜주는 편이라서 큰 문제는 없지만, 신경써야 하는 부분이 몇가지 있기는 했다.
호환성에 영향을 주는 전체 세부사항들은 릴리즈 노트들을 참고하는 것이 좋다. 양이 제법 많다.
14 버전 https://www.postgresql.org/docs/release/14.0/
15 버전 https://www.postgresql.org/docs/release/15.0/
16 버전 https://www.postgresql.org/docs/release/16.0/
17 버전 https://www.postgresql.org/docs/release/17.0/
18 버전 https://www.postgresql.org/docs/release/18.0/
기존 함수들의 미묘한 동작들을 명확하게 바꾼다거나 하는 자잘한 변경사항들이 꽤 많긴 한데, 이런건 실제로 해당하는 경우가 드물 것이다.
그래서 내가 겪은 주요하고 일반적인 부분만 정리해본다.
SSL 옵션 강제 (AWS RDS)
이건 클라우드 서비스마다 다른데, AWS RDS의 경우에는 15 버전부터 SSL 옵션이 강제가 된다.
그래서 연결시에 SSL을 켜지 않으면, 다음과 같은 오류가 발생한다.

이걸 해결하려면 서버 측에서 이런 식으로 넘겨야 한다.
postgresql://username:password@hostname:port/database?sslmode=require
이건 구버전에서도 사용할 수 있으나 필수가 아니었을 뿐이라서, 미리 적용해서 선조치를 해놓으면 되는 부분이다.
WAL Logical Replication 하위호환 불가
WAL 레벨에서는 호환성이 거의 보장되지 않는다. 그래서 WAL Logical Repliaction을 쓰는 경우에는 업그레이드가 불가능하며, 기존 구성을 삭제해야 한다.
이건 보통 CDC를 구현할때 주로 사용되는 기능이라서, 서드파티와 동기화를 걸어놓은 상황이라면 매우 높은 확률로 이걸 쓰고 있다고 생각하면 된다. 아무튼 그래서 CDC를 걸어놓고 쓰는 경우에는 리스크를 감안해야 한다.
RDS는 Replication을 사용중일 경우 업그레이드시에 다음과 같은 오류를 발생시킨다.

------------------------------------------------------------------
Upgrade could not be run on Fri Jan 30 05:15:34 2026
------------------------------------------------------------------
The instance could not be upgraded from 13.22.R2 to 18.1.R1 because of following reasons. Please take appropriate action on databases that have usages incompatible with requested major engine version upgrade and try again.
- The instance could not be upgraded because it has one or more logical replication slots. Please drop all logical replication slots and try again.
----------------------- END OF LOG ----------------------
지우라는 것이다.
시키는대로 다 찾아서 지워주면 된다.
select * from pg_replication_slots
SELECT pg_drop_replication_slot('이름');
당연히 이 방식은 복제의 중단을 발생시킨다. 그래서 업그레이드 후에 다시 만들더라도 그 사이에 발생한 Write에 대해서는 WAL 로그 읽기가 불가능하다.
그 누락건들에 대해서는 알아서 잘 찾아서 처리를 해주거나, 전체 동기화를 하거나 해야 할 것이다.
그래서 부침이 좀 있긴 했지만 업그레이드 자체는 완수를 했다.

성능 향상
PostgreSQL 17/18 버전 즈음해서 성능 향상에 대한 바이럴을 많이 봤던지라 막연한 기대를 좀 했었는데, 의외로 눈에 띄는 성능 개선이 보이지는 않았다.

01/30부터 바뀌었는데, 레이턴시는 별다른 차이가 없었다.
스루풋이나 기타 성능 지표에서도 별반 차이가 느껴지는 부분은 없었다.
기존에 auto vacuum으로 인한 성능 병목을 느꼈거나, 동시 read로 인한 병목지점에 존재한 경우가 아니라면, 막 체감될 정도로 개선되지는 않는 것 같다.