티스토리 뷰

728x90
반응형

[1] 이슈

 

며칠 전 헤로쿠로부터 메일을 받았다.

나의 DB는 8,027 row를 가지고 있는데 내가 사용 중인 PostgreSQL DB Hobby Dev Plan (무료)는 최대 10,000 row만 insert 가능하다는 것이였다.

 

10,000 row를 넘어가면 더이상 insert가 되지 않고 plan을 준수하게 될 때 insert 권한이 자동 복구된다고 한다,,, 

database를 Basic ($9/month) or higher plan으로 마이그레이션 하라고 했다,,, 

 

 

참고로

Heroku >  My App > Resource > Add-ons 

Heroku Postgres 선택하면 

 

 

 

 

현재 row 개수, 최대 row 개수 등 DB 상태 및 설정을 볼 수 있다. 

 

사용자가 늘고 있는 추세라서 migration을 해야할 것 같다,, 흑 

 

 

[2] Plan & Pricing 

 

elements.heroku.com/addons/heroku-postgresql 에서 Plan을 볼 수 있습니다.

저는 Hobby Basic으로 한단계 업그레이드 하면 될 것 같습니다. 

Hobby Basic Plan은 천만개의 row를 insert할 수 있다고 합니다. 

 

 

 

 

 

[3] migration

 

migration은 이 문서를 보고 따라해주면 됩니다. 

 

native PostgreSQL 백업 & 복원 방법을 쓰는 pg:copy upgrade method 를 사용하여 마이그레이션 합니다. 

pg:copy는 database backup을 Disk에 쓰는 대신 백업 데이터를 새로 프로비저닝된 데이터베이스의 복원 프로세스로 직접 스트리밍 한다고 합니다. 

 

최대 3분의 application downtime 이 발생할 수 있다고 합니다. (너의 스키마와 database plan에 따라 다를 수도 있다고 합니다.)

저는 새벽에 진행했습니당,, 

 

마이그레이션 절차대로 진행해보겠습니다.  

(참고로 저는 예전에 카드등록해둔 상태입니다. 만약 카드 등록 안하셨으면 먼저 하시고 진행해주셔야할 것 같아요!)

 

1) Provision a new database

 

새로운 database를 provision합니다. 원하는 플랜으로! 

heroku addons:create heroku-postgresql:hobby-basic --app onion-family-api

 

standard 플랜 이상은 몇분이 걸린다고 하는데 저는 hobby-basic이여서

금방 되었어요! 

 

새로운 slippery DB가 만들어졌다고 나옵니다. 

HEROKU_POSTGRESQL_COPPER_URL이 새 DB를 나타내는 URL이고

이따 3번 단계에서 써줄 것입니다. 

 

 

 

 

2) Enter maintenance mode to prevent database writes

 

upgrade 하는 동안 

현재 database에 새로운 데이터가 추가안되도록 하는 게 중요합니다.

왜냐면 그 데이터는 new database에 옮겨지지 못하기 때문입니다. 

 

이를 위해 앱을  maintenance mode 에 둬야하고

돌고 있는 scheduler jobs이 있으면 disable 시켜야합니다. 

 

아래 명령어로 maintenace 모드로 둡니다.

heroku maintenance:on --app onion-family-api

 

3) Transfer data to the new database

 

아래 명령어로

현재 database -> 새로 provisioned database로 data를 copy합니다. 

 

- DATABASE_URL: 현재 database url 

- HEROKU_POSTGRESQL_COPPER_URL: 1단계에서 만든 새 database url 

heroku pg:copy DATABASE_URL HEROKU_POSTGRESQL_COPPER_URL --app onion-family-api

 

그리고 destructive action이기 때문에 앱 이름을 한번 더 입력해주면 진행하겠다고 나오는데 앱 이름을 입력해주세요!

그럼 copy를 진행합니다. 

 

 

 

 

4) Promote the new database

 

아직 new database는 앱의 active database가 아닙니다. 

new database를 앱의 primary database 로 지정해주기 위해 아래명령어를 실행시켜줍니다. 

heroku pg:promote HEROKU_POSTGRESQL_COPPER_URL --app onion-family-api

 

그러면 앱의 primary batabase url을 나타내는 DATABASE_URL이 

새 DB URL으로 바뀌었다고 나오네요

 

그리고 옛날 primary DB는 HEROKU_POSTGRESQL_BROWN_URL 로 나타내겠다고 합니다. (6번 단계에서 필요함)

 

 

 

 

5) Exit maintenance mode

이제 maintenance mode를 꺼줍니다. 

heroku maintenance:off --app onion-family-api

 

6) Deprovisioning the old primary database

이제 old primary database를 없애줍니다. 

HEROKU_POSTGRESQL_BROWN_URL은 4번 단계에서 나온 old primary database url입니다. 

heroku addons:destroy HEROKU_POSTGRESQL_BROWN_URL --app onion-family-api

 

 

이 명령도 계속 진행할 것이면 앱이름을 입력하라고 하는데 입력해서 진행해줍니다.

 

 

 

 

 

 

이제

Heroku >  My App > Resource > Add-ons 

Heroku Postgres 선택하면 들어가보면 최대 row 개수가 업데이트 되어있는 것을 볼 수 있습니다,, 

 

 

 

 

 

 

 

 

 

 

반응형
댓글