Code migration

유석현(SeokHyun Yu)·2023년 4월 14일
0

분산 시스템

목록 보기
20/27
post-thumbnail

코드 이전(Code migration)을 위한 다양한 접근 방식이 있다.

그 중 일부 이유는 성능 향상을 위해서 발생한다.

예를 들어, 과부하가 심한 컴퓨터에서 처리하던 작업을 덜 바쁜 컴퓨터로 이전함으로써 성능을 개선할 수 있다.

그러나 최근에는 분산 시스템에서는 컴퓨팅 용량을 최적화하는 것보다는 통신을 최소화하는 것이 더 중요한 문제가 되고 있다.

예를 들어, 클라이언트-서버 시스템에서 서버가 거대한 데이터베이스를 관리하고 있는 경우, 클라이언트가 많은 데이터베이스 작업을 수행해야 할 때, 클라이언트 애플리케이션 일부를 서버로 이전하여 결과만 네트워크를 통해 전송하는 것이 더 나을 수 있다.

이렇게 하면 통신 지연 시간이 줄어들 수 있다.

또한, 동적으로 구성된 분산 시스템에서는 클라이언트가 서버에 접속할 때, 서버에서 클라이언트 구현을 제공함으로써 지연 시간을 최소화할 수 있다.

클라이언트는 구현을 다운로드하고 초기화 단계를 거친 후 서버를 호출한다.

이 모델은 코드를 다운로드하고 초기화하는 프로토콜이 표준화되어 있어야 한다.

이 방법을 사용하면 클라이언트는 모든 소프트웨어를 미리 설치할 필요가 없으며, 인터페이스가 표준화되어 있다면 클라이언트-서버 프로토콜 및 구현을 자주 변경할 수 있다.

그러나 이러한 방법은 보안상의 문제가 발생할 수도 있다.


Models for code migration

코드 이전을 위한 다양한 모델이 존재한다.

Fuggetta 등(1998)의 프로세스 컴포넌트 모델은 코드 이전을 코드 세그먼트, 리소스 세그먼트, 실행 세그먼트로 분류한다.

코드 세그먼트(Code segment)는 프로그램을 구성하는 일련의 명령어 집합을 포함한다.

리소스 세그먼트(Resource segment)는 프로세스가 필요로 하는 외부 리소스에 대한 참조를 포함한다.

실행 세그먼트(Execution segment)는 프로세스의 현재 실행 상태를 저장한다.

이는 개별 프로세스를 이전하는 데 유용히다.

이동성 모델(Mobility models)은 약한 이동성과 강한 이동성으로 나눌 수 있다.

약한 이동성(Weak mobility)코드 세그먼트초기화 데이터를 전송하는 것으로, 전송된 프로그램은 미리 정의된 시작 위치 중 하나에서 시작된다.

예를 들어, 자바 애플릿은 항상 처음부터 시작한다.

이 모델은 대상 기계가 해당 코드를 실행할 수 있으면 사용할 수 있기 때문에 구현이 간단하다.

강한 이동성(Strong mobility)실행 세그먼트를 전송할 수 있다.

이 경우, 실행 중인 프로세스를 중지하고 다른 기계로 이동한 후, 이전한 위치에서 실행을 계속할 수 있다.

이는 보다 일반적인 방법이지만 구현이 더 어려울 수 있다.

또한, 이동성 모델은 송신자-초기화 이동성과 수신자-초기화 이동성으로 나눌 수 있다.

송신자-초기화 이동성(Sender-initiated mobility)은 코드가 현재 위치하는 기계에서 이동이 시작되며, 대표적인 예로는 계산 서버에 프로그램을 업로드하거나 검색 프로그램을 웹 데이터베이스 서버에 전송하는 경우가 있다.

수신자-초기화 이동성(Receiver-initiated mobility)은 이동이 대상 기계에서 이루어진다.

이는 보다 간단한 방법이지만, 클라이언트가 이전을 시작하는 경우도 많기 때문에 업로드가 완료된 후 인증을 받아야 할 필요가 있다.

또한, 약한 이동성(weak mobility)에는 이전된 코드를 대상 프로세스에서 실행할지 별도의 프로세스에서 실행할지 여부에 따라 여러 가지 유형이 있다.

코드를 대상 프로세스(target process)에서 실행하는 것은 별도의 프로세스를 시작할 필요가 없으므로 구현이 간단하지만, 대상 프로세스가 악성 코드로부터 보호되어야 한다는 단점이 있다.

이전된 코드를 별도의 프로세스(separate process)에서 실행하는 경우, 이러한 보안 문제를 해결할 수 있다.

강한 이동성(strong mobility)에는 실행 중인 프로세스를 이전하는 방법과 원격 복제하는 방법이 있다.

복제는 원본 프로세스의 정확한 사본을 생성한다.

따라서, 코드 이전을 위한 모델에는 다양한 유형이 있으며, 구현하는 방법에 따라 각각의 장단점이 있다.

이를 고려하여 코드 이전 모델을 선택해야 한다.


Migration and local resources

리소스 세그먼트는 마이그레이션에 특별한 주의가 필요하다.

리소스 세그먼트는 항상 다른 세그먼트와 함께 변경없이 전송되지는 않는다.

예를 들어, TCP 포트를 보유한 프로세스가 다른 위치로 이동하면 포트를 포기하고 대상에서 새 포트를 요청해야 한다.

프로세스와 리소스 간(process-to-resource)의 바인딩에는 세 가지 유형이 있다.

  1. 식별자(identifier)에 의한 바인딩: 가장 강력한 바인딩으로, 프로세스가 참조된 리소스를 정확히 필요로 한다.

  2. 값(value)에 의한 바인딩: 더 약한 바인딩으로, 리소스의 값만 필요하다.

  3. 유형(type)에 의한 바인딩: 실행에 영향을 주지 않는 동안 동일한 값을 제공하는 다른 리소스가 필요하다.

리소스와 기계 간(resource-to-machine)의 바인딩에는 세 가지 유형이 있다.

  1. 이동 가능한(unattached) 리소스: 쉽게 이동할 수 있는 리소스이다. (예: 데이터 파일)

  2. 고정된 리소스(fastened): 이동 가능하지만 상대적으로 높은 비용이 발생하며, 이동이 종종 불가능하다. (예: 로컬 데이터베이스, 전체 웹 사이트)

  3. 고정 리소스(fixed): 특정 기계나 환경에 밀접하게 연결된 리소스이다. (예: 로컬 장치, 로컬 통신 단말)

이 세 가지 프로세스-리소스 바인딩과 리소스-기계 바인딩을 결합하면 아홉 가지 조합이 가능하다.


식별자에 의한 리소스를 처리하기 위한 작업

  1. 이동 가능한 리소스: 이동(move)하는 것이 일반적으로 최선의 방법이다. 리소스가 공유될 경우 기계 경계를 넘어설 수 있는 전역 참조(global reference)를 설정하는 것이 대안이다.

  2. 고정된 또는 고정 리소스: 전역 참조를 생성하는 것이 가장 좋은 해결책이다.


값에 의한 리소스를 처리하기 위한 작업

  1. 고정 리소스: 이 경우 전역 참조를 설정하면 분산 공유 메모리 형태를 구현해야 한다.

  2. 고정된 리소스: 대상 기계에 일반적으로 사용 가능한 런타임 라이브러리와 같은 경우에는 이동이 필요하다. 큰 데이터 양이 복사될 때는 전역 참조가 더 좋다.

  3. 이동 가능한 리소스: 가장 쉬운 경우로, 리소스를 복사(또는 이동)하는 것이 최선의 해결책이다. 리소스가 프로세스에 의해 공유되는 경우에는 전역 참조를 사용해야 한다.


유형에 의한 리소스를 처리하기 위한 작업

동일한 유형인 로컬 리소스에 프로세스를 다시 바인딩(rebind)하는 것이 명확한 해결책이다.

리바인딩이 불가능한 경우에만 리소스를 복사하거나 전역 참조가 필요하다.


전반적으로, 코드 마이그레이션에서는 프로세스와 리소스 간의 바인딩과 리소스와 기계 간의 바인딩을 고려해야 한다.

이에 따라 이동 가능한, 고정된 또는 고정 리소스를 처리하는 다양한 작업이 필요하며, 이러한 작업은 리소스가 식별자, 값 또는 유형에 의해 바인딩되는지에 따라 달라진다.

이를 통해 코드 마이그레이션을 성공적으로 수행하고 분산 시스템의 성능과 효율성을 향상시킬 수 있다.


Migration in heterogeneous systems

코드 이전은 전체 환경(entire environment)을 이전하는 경우에도 필요할 수 있다.

이 경우, 특정 기계를 종료하거나 교체해야 할 때 작업을 계속할 수 있다.

예를 들어, 서버 클러스터에서 관리자는 특정 기계를 종료하거나 교체할 수 있다.

전체 가상 머신을 이전하는 경우, 메모리 이미지로컬 리소스에 대한 바인딩을 모두 이전해야 한다.

이는 매우 복잡한 작업일 수 있다.

전체 메모리를 이전하는 방법에는 세 가지가 있다.

첫째, 메모리 페이지(memory page)를 새로운 기계로 이동하고 이전 프로세스 중 나중에 수정되는 페이지를 다시 전송하는 방법이다.

이 방법은 이전 기간을 최소화할 수 있지만, 전송되는 데이터 양이 많아질 수 있다.

둘째, 현재 가상 머신을 중지하고 메모리를 이전한 후 새 가상 머신을 시작하는 방법이다.

이 방법은 이전 기간을 예측 가능하게 만들 수 있지만, 이전하는 가상 머신이 실시간 서비스를 제공하는 경우 중단 시간이 너무 길어질 수 있다.

셋째, 프로세스를 바로 시작하고 필요한 메모리 페이지를 요청에 따라 복사하는 방법이다.

이 방법은 이전 기간을 최소화하면서 안정적인 서비스를 제공할 수 있다.

따라서, 코드 이전을 위해서는 전체 환경을 이전해야 할 경우, 이전 방법에 대해 신중하게 고려해야 한다.

이전 기간을 최소화하면서 안정적인 서비스를 제공할 수 있는 방법을 선택해야 한다.

profile
Backend Engineer

0개의 댓글