(번역) 다운타임 없는 장고 마이그레이션
23 Sep 2017 | django model field migrationDjango Migrations without Downtime 번역글입니다.
아래의 지침은 장고 마이그레이션을 수행할 때 실제 운영중인 웹 서비스가 다운되지 않도록 하기 위한 절차이다. 이는 명시적으로 수동으로 수행되며, 자동 배포 프로세스의 일부가 아님을 밝혀둔다.
필드 혹은 테이블 추가
null을 허용하는 필드 혹은 새로운 테이블 추가
- 새로운 모델 혹은 컬럼을 추가한다.
- 로컬에서 모델 마이그레이션을 수행한다.
- 2개의 분리된 풀리퀘스트를 만든다. 하나는 모델 변경사항을 포함하고, 다른 하나는 새롭게 수행된 마이그레이션을 포함한다. 모델 변경 마이그레이션은 오직 모델 변경 코드만 포함해야하며, 변경한 모델을 활용한 다른 추가적인 코드를 포함해서는 안된다.
- 마이그레이션 풀리퀘스트를 머지하고 배포한다.
- 프로덕션 DB에서 새로운 마이그레이션을 수행한다. 프로덕션 모델 코드가 거기에 있지 않을 것으로 기대하지 않는다면, 추가되는 필드는 프로덕션 DB에서 문제를 일으키지 않을 것이다.
- 모델변경 풀리퀘스트를 머지한다.
- 모델변경사항을 포함한 코드를 배포한다. 이전에 작성한 컬럼/테이블에서 심리스하게 읽기 작업을 수행한다.
NOT NULL 필드 추가
null을 허용하지 않는 필드를 추가하기 위해서 위의 절차를 먼저 수행해야한다. 그리고 아래의 추가적인 작업을 수행한다.
- null=False로 모델을 수정한다. 또한 당신이 NOT NULL로 변경하는 필드에 절대로 Node을 추가하거나 업데이트하지 않도록 한다.
- 변경사항에 대해서 마이그레이션을 수행한다.
- 2개의 분리된 풀리퀘스트를 만든다. 하나는 모델 변경을 위해서, 다른 하나는 마이그레이션을 위한 것이다.
- 모델 변경 풀리퀘스트를 머지하고 배포한다.
- 마이그레이션 풀리퀘스트를 머지한다.
- 프로덕션 DB에서 마이그레이션을 수행한다.
아주 큰 사이즈의 테이블에 NOT NULL 컬럼을 추가할 때
장고 마이그레이션은 NOT NULL 필드를 추가할 때 디폴트 값을 추가하도록 강요할 것이다. 해당 값은 마이그레이션을 수행시 빈 컬럼을 채우기 위해서 사용된다. 이와 같은 업데이트 절차는 마이그레이션이 끝날 때까지 postgres 테이블이 쓰기 작업을 수행하지 못하도록 잠근다. 비교적 작은 사이즈의 테이블 (10만개 row 이하)은 괜찮다. 하지만 아주 큰 테이블은 문제가 될 수 있다. 왜냐하면 테이블락은 마이그레이션이 완료되는 동안 요청을 실행하는 것을 막을 수 있기 때문이다. 이러한 이유로 특히 큰 테이블에는 새로운 필드를 null을 허용하도록 하는 것을 검토해 볼 수 있다. 이는 어플리케이션 코드에서는 비용이 들지만, 요청에 응답하지 못하게 되는 것보다는 더 나을 것이다.
필드 혹은 테이블 삭제
null을 허용하는 필드 혹은 테이블 삭제
본질적으로 추가 작업과 동일하지만 순서가 약간 다르다.
- 어플리케이션 코드에서 삭제할 모델 혹은 컬럼을 사용하는 부분을 삭제한다.
- 삭제할 모델/컬럼이 남아 있지만, 코드에서 해당 부분을 사용하는 곳이 없는 버전을 먼저 배포한다.
- 너의 어플리케이션 코드에서 해당 모델 혹은 컬럼을 삭제한다.
- 삭제 마이그레이션을 수행한다.
- 모델 수정 풀리퀘스트를 머지한다.
- 모델 변경사항이 포함된 코드를 배포한다. 삭제될 부분을 참고함으로써 발생하는 에러가 없는지 확인한다.
- 마이그레이션 풀리퀘스트를 머지한다.
- 마이그레이션이 포함된 코드를 배포한다.
- 프로덕션 DB에서 명시적으로 바이그레이션을 수행한다.
NOT NULL 필드 삭제
NOT NULL 필드를 삭제하기 위해서 당신은 먼저 null을 허용하는 필드로 마이그레이션을 해아한다. 그리고 위의 null을 허용하는 필드를 삭제할 때와 같은 절차를 수행한다. NOT NULL 필드를 null을 허용하는 필드로 변경하는 절차는 아래와 같다.
- 필드 null=True로 변경한다.
- 변경사항 적용을 위해서 마이그레이션을 수행한다.
- 2개의 분리된 풀리퀘스트를 만든다. 하나는 모델 변경을 위해서, 다른 하나는 마이그레이션을 위한 것이다.
- 마이그레이션 풀리퀘스트를 머지하고 배포한다.
- 프로덕션 DB에서 마이그레이션을 수행한다.
- 모델 변경 코드를 머지하고 배포한다.
위 작업을 수행한 이후에 null을 허용하는 필드를 삭제할 때와 같은 절차를 수행한다.