[DS] 1. Distributed System Introduction

sunny·2024년 3월 25일

ds

목록 보기
1/1

이 글은 건국대학교 2024년 1학기 분산시스템 수업과 『Distributed Systems: Principles and Paradigms』 를 참고하여 작성되었습니다.

분산 시스템의 정의

A distributed system is a collection of independent computers that appears to its users as a single coherent system

분산 시스템이란 하나의 일관된 시스템을 사용자에게 제공하는 독립된 컴퓨터들의 집합을 의미한다.

  • 독립된 컴퓨터들은 모두 자발적이고(autonomous), 각각은 이질적(heterogeneous)일 수 있다.
  • 클라이언트는 서버가 분산되어 있다고 인지하지 못한다.

Middleware

  • middleware 형태로 분산 시스템의 소프트웨어를 개발할 수 있다.
  • application과 OS 사이에 존재한다.
    (middleware와 응용 프로그램 모두 application 계층에서 작동하지만, 역할 상으로는 middleware가 응용 프로그램에게 서비스를 제공해주므로 middleware가 더 아래에 있다고 여겨진다.)

middleware는 분산 시스템 서비스를 제공한다.
middleware를 사용하면 클라이언트가 서로 다른 OS에서도 동일한 방식으로 서비스를 요청할 수 있다는 장점이 있다. 또한 여러 대의 서버가 있다는 사실을 숨기므로 투명성을 제공한다. 하지만 중간에 레이어가 하나 더 있으므로 느리다는 단점이 있다.

  • middleware ex) JVM
  • middleware와 framework의 차이점
    middleware다른 애플리케이션의 서비스를 이용할 수 있도록 구현된 API와 같은 역할을 한다. middleware는 대부분이 독립적인 소프트웨어처럼 작동한다. 이에 대한 예시로는 애플리케이션끼리 데이터를 주고 받을 수 있도록 만들어진 CM(Communication Middleware)가 있다.
    반면에 framework애플리케이션을 개발하기 위한 틀/도구이다. 개발자들이 필요한 기능을 스스로 구현할 수 있도록 도구를 제공하는 역할을 한다. framework는 일부만 독립적으로 작동하고 대부분이 그렇지 않다.

분산 시스템의 목표

좋은 분산시스템은 사용성과 성능을 고려해야 한다. 둘은 trade-off 관계이므로 둘 사이에서 적절한 타협점을 찾아야 한다. 사용성이란 사용자가 사용하기 편한 것을 추구하고, 성능 측면은 지연을 최소화하며 사용자에게 빠르게 서비스를 제공하는 것을 추구한다.

  • 사용성 측면에서의 추구하는 것 : 1, 2, 3, 4
  • 성능 측면에서의 추구하는 것 : 5

1. 사용성 : making resources accessible

사용자가 리모트 리소스를 편하게 사용할 수 있도록 하는 것이 주된 목적이다.
이를 위해 일관된 방식으로 서비스 요청이 가능하도록 만들어야 한다. 안드로이드, ios, web에서 모두 동일한 방식으로 사용 가능하다면 accssible한 애플리케이션이라 할 수 있다.

리모트 리소스에 쉽게 접근하기 위한 수단으로는 groupware라는 소프트웨어가 있다. 이것은 CSCW(Computer Supported Cooperative Work)라고도 불리는 응용 프로그램으로, 여러 사용자들이 리소스를 공유하며 협동 작업을 할 수 있도록 기능을 제공해준다. 이를 사용하여 공유 문서에서 동시에 문서를 편집하거나 화상 회의를 진행할 수 있다.

이를 통해 여러 사용자들간의 connectivity와 sharing이 증가할 것이다. 이는 보안 상의 문제를 유발할 수 있으니 주의해야 한다. (보안을 잘 유지하기 위해서 인증과 인가를 구현하자!)

2. 투명성 : distribution transparency

서비스를 제공하는 리소스가 분산되어 있는 것을 클라이언트에게 숨겨야 한다. 여기서 '숨겨야 하는데 왜 투명성을 이야기할까?' 라는 의문이 들 수 있다. 하지만 여기서 투명성은 서버와 클라이언트 사이의 막이 투명하다는 것이 아니라, 서버 자체가 투명해진다는 것을 의미한다.

투명성이 보장되면 클라이언트가 편리하게 서비스를 사용할 수 있기 때문에 이를 지향한다. 따라서 사용자가 서버의 존재 자체를 모르는 것이 가장 이상적인 분산 시스템의 모습이다. (딜레이없이 서비스가 제공되는 상태)

  • degree of transparency
    앞의 이야기만 놓고 보면 투명성이 분산 시스템에서 가장 우선시 되는 목표라 생각할 수 있지만, 이것이 항상 좋은 것만은 아니다. 투명성과 성능은 trade-off 관계이므로 지나친 투명성은 시스템의 성능을 악화시켜 느려질 수 있다. 이를 막기 위해 적절한 투명성을 지향하는 것이 바람직하다.
  • types of transparency
  1. access
    리소스에 접근하는 방식을 동일하게 하여 시스템이 분산되어 있는 사실을 숨긴다.

  2. location, migration, relocation
    location은 말그대로 리소스가 어느 서버에 위치해 있는지를 숨기는 것이다.
    migration과 relocation은 리소스의 이동을 숨기는 것이다. migration은 사용자가 리소스를 사용하지 않는 틈을 타 리소스를 다른 서버로 이동시키는 방식이고, relocation은 사용자가 사용중인 리소스를 다른 서버로 옮기는 방식이다.

  3. replication, distribution
    replication은 여러 서버에 동일한 리소스를 복제해 놓는 것이고, distribution은 하나의 리소스를 쪼개어 각각 다른 서버에 나누어 보관하는 방식이다. 이 방식을 사용하여 분산 시스템의 성능을 향상시킬 수 있다.

  4. concurrency
    같은 리소스에 여러 사용자가 동시에 접근하고 있다는 사실을 숨기는 것이다.
    동시에 변경했을 때 충돌이 나는 문제를 해결하는 방법은 이후에 locking mechanism에서 다룰 예정이다.

  5. failure transparency
    서비스의 failure를 숨기면서 복구 가능한 것을 의미한다. 분산 시스템의 특성 중 4. dependabiliy, 신뢰성과 관련이 있다.

3. 개방성 : openness

개방성은 표준을 지키는 것과 관련이 있다. 둘은 무슨 관계일까?
시스템을 오픈소스로 개방하면 사용자들에게 분산 시스템을 사용하기 위한 standard rules을 제공할 수 있다. 이렇게 제공된 규칙은 protocol이라는 통신 규약에서 공식화된다. 이는 시스템의 사용성을 향상시켜줄 수 있다. 따라서, 오픈소스를 통해 제공된 standard rule에 따라서 애플리케이션을 만들면 사용성을 보장할 수 있다.
(오픈소스로 개방된 시스템을 인터페이스, 이를 따라 만든 애플리케이션을 구현체라고 비유할 수 있다)

openness를 지킬 때의 이점에는 interoperability와 portability가 있다.
interoperability는 상호운용성을 의미한다. A, B회사에서 동일한 서비스 C를 각각 만들었을 때, 사용자 입장에서 두 서비스를 동일한 품질로 사용할 수 있으면 해당 서비스를 '상호 운용이 가능한 서비스'라고 한다.
portability는 이동성 또는 휴대성을 의미한다. java처럼 여러 시스템(OS)에서 이용 가능한 서비스를 뜻한다. 위의 경우와 비교해보면, A라는 한 회사에서만 개발한 서비스 C를 B 회사의 환경에서도 사용할 수 있는 서비스를 가리킨다.

오늘날 서비스들은 flexible 하게 제공하지 않고 monolithic 하게 제공된다. 이는 openness가 잘 실천되고 있지 않다고 볼 수 있다. 이를 해결하기 위해선 사용자에게 제공할 서비스의 policy와 mechanism을 분리 해야한다. 서비스를 어떻게 제공할 지와 무엇을 제공할지를 분리해서 설계해야 한다는 의미이다. 웹 캐시를 예로 들자면, 캐시를 사용하여 서비스의 성능을 높이는 것은 적용하되, 여러 옵션들을 사용자가 선택할 수 있도록 하여 서비스 제공 방식을 다양화하면 flexible한 서비스를 만들 수 있다.

4. 신뢰성 : dependability

사용자가 믿고 사용할 수 있는 서비스는 중단 없이 계속 사용할 수 있어야 한다. 이는 결함(fault) 또는 고장(failure)이 발생해도 정상적 혹은 부분적으로 기능을 수행한다는 것을 의미한다.

5. 확장성 : scalability

여러가지 측면의 확장성이 있다.

  1. size (크기, 개수 확장)
    서버 입장에서는 컴퓨터(리소스)의 성능을 높이거나 개수를 늘리는 것을 의미하고, 클라이언트 입장에서는 사용자가 많아지는 것을 의미한다.

centralized 서비스란 서버가 한 대로 구성되어 있으며 모든 클라이언트가 이 서버에 요청을 보낸다. 이러한 중앙 집중 방식은 성능 측면에서 매우 좋지 않다. 이를 보완하기 위해서 나온 것으로 decentralized 서비스와 distributed 서비스가 있다.

decentralized 서비스는 서버를 여러 개로 분산하여 하나의 서버에서 오류가 발생해도 나머지 서버는 부분적으로 정상 작동이 가능하다.

distributed 서비스는 서버가 없이 클라이언트로만 이루어져 있다. 각각의 클라이언트는 때로는 서버의 역할을 하기도 하고 클라이언트의 역할을 하기도 한다.

이는 확장성 측면에서만 바라본 장단점이고, 이외에도 여러 요소를 고려하여 적절한 구조를 선택해야 한다.

  1. geographically (지리적 확장)
    서버와 클라이언트의 거리가 멀어지는 것과, 서버 간의 거리가 멀어지는 것 이렇게 두가지 의미가 있을 수 있다.

    먼저 서버와 클라이언트의 거리가 멀어져서 발생하는 딜레이를 최소화하기 위해선 통신 횟수를 줄여야 한다. 예를 들면 서버에서 하던 유효성 검증을 클라이언트 측에서 하면 잘못된 요청이 발생했을 때 클라이언트와 서버 사이에서 요청과 응답이 오가는 횟수를 줄일 수 있다.

서버와 서버 간의 거리가 멀어졌을 땐 리소스를 distribution 하거나 replication 하는 방식으로 지연을 최소화할 수 있다. distribution은 하나의 정보를 쪼개서 서버별로 관리하는 것이고, replication은 하나의 정보를 여러개 복사하여 여러 서버에 저장하는 방식이다. DNS는 distribution 방식을 사용하여 도메인 정보를 관리하는 대표적인 사례이다.

replication 방식 사용 시에는 데이터의 consistency 문제를 주의해야 한다. 하나의 정보가 여러 곳에 위치하면, 한 곳에서 갱신됐을 때 다른 곳의 정보도 함께 갱신해줘야 한다.

0개의 댓글