실제 운영 중인 서비스에 실시간 패치를 하는 방법

HYEONG HWAN, MUN/ 8월 14, 2015/ 미분류/ 0 comments

https://blog.lael.be/post/1886

먼저 컴퓨터공학 용어인 Atomic operation 에 대해 알아보자.

 

Atomic operation(원자적 연산)은 다음 두가지 조건을 반드시 만족해야 한다.
1. 모든 조작이 완료할 때까지 어떤 프로세스도 변경을 알지 못하도록 비가시적이어야 한다.
2. 조작 중에 어느 하나라도 실패한다면 조작 전체도 실패하고 시스템의 상태를 조작 이전 상태로 복구해야 한다.

외부에서는 조작의 집합이 단번에 성공하거나 실패하는 것으로 보인다. 쉽게 말해서 중간 상태가 없는 것이다.

 

자세한 설명 및 예시는 여기를 참조 : http://vaert.tistory.com/39


리눅스 tar 프로그램을 사용해서 압축해 본 적이 있는가?

압축 중에 Control - C 를 입력하면 압축이 중지된다.
이것을 다시 이해해 보자면 tar 압축 프로세싱 중에 다른 명령(Abort)이 들어온 것이다.
압축 중인 파일을 다른 프로그램이 다운로드(Read) 한다면 현재 압축된 파일만큼 다운로드 될 것이다. (즉 압축 중인 파일을 다운받게됨.)

 

tar 명령은 Atomic operation 이 아니기 때문에 중간 상태가 있게 된다. 따라서 위와 같은 현상이 일어나는 것이다.

 

비슷한 원리로 서버상의 파일을 열어서 저장(save) 하는 경우나, upload로 파일을 대체하는 경우, git pull 같은 명령어로 업데이트 하는 경우에도 Atomic operation 이 아니므로 중간상태가 있게 되어 아주 잠깐이지만 장애상태가 있게 된다.

 


 

실제 운영 중인 서비스에 실시간 패치를 하는 방법.

 

Atomic Operation 인 mv 명령어를 사용한다.

예를 들어 login.php 파일을 수정하고자 한다면

login2.php 로 업로드 한 후에 #mv login2.php login.php  로 교체하는 작업을 하자.

mv 명령어는 중간상태가 없기 때문에 즉시 적용된다.

 

Maintenance Mode 를 사용하기.

Maintenance Mode(점검 모드)를 사용해서 다른 프로세스의 접근을 막으면 된다.

비슷한 원리로, Mutax 를 구현해서 특정 작업중에는 해당 자원을 접근하지 않도록 막으면 된다.
대부분의 서비스는 점검일을 정해두고 패치를 진행한다. (주말 새벽이라던가, 한달에 한번 이라던가)

 

Load Balancing 을 사용하기.

SQL-Server-Multi-AZ-resizeable

 

두개 이상의 서버를 구성한 후 하나씩 번갈아가면서 패치하는 방법이다.

로드밸런서 아래에 A, B 서버가 동기화 되고 있다고 가정하면

- B 서버를 네트워크에서 분리해서 미리 패치를 하고

- B 서버를 네트워크에 연결한다. 마스터 서버를 B 로 설정한다.

- A 서버를 분리해서 패치하고

- A 서버를 네트워크에 연결한다. 마스터 서버를 다시 A 로 설정한다.

Amazon Cloud 에서 일부 서비스가 위와 같은 방식으로 패치를 진행한다고 한다.

 

참조 : http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_UpgradingDBInstances.html

참조 : http://superuser.com/questions/101676/is-there-some-difference-between-mv-and-cp-rm-the-old-file-on-unix

 

Leave a Comment

작성하신 댓글은 관리자의 수동 승인 후 게시됩니다.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*