이 글은 건국대학교 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
분산 시스템이란 하나의 일관된 시스템을 사용자에게 제공하는 독립된 컴퓨터들의 집합을 의미한다.

middleware는 분산 시스템 서비스를 제공한다.
middleware를 사용하면 클라이언트가 서로 다른 OS에서도 동일한 방식으로 서비스를 요청할 수 있다는 장점이 있다. 또한 여러 대의 서버가 있다는 사실을 숨기므로 투명성을 제공한다. 하지만 중간에 레이어가 하나 더 있으므로 느리다는 단점이 있다.
좋은 분산시스템은 사용성과 성능을 고려해야 한다. 둘은 trade-off 관계이므로 둘 사이에서 적절한 타협점을 찾아야 한다. 사용성이란 사용자가 사용하기 편한 것을 추구하고, 성능 측면은 지연을 최소화하며 사용자에게 빠르게 서비스를 제공하는 것을 추구한다.
사용자가 리모트 리소스를 편하게 사용할 수 있도록 하는 것이 주된 목적이다.
이를 위해 일관된 방식으로 서비스 요청이 가능하도록 만들어야 한다. 안드로이드, ios, web에서 모두 동일한 방식으로 사용 가능하다면 accssible한 애플리케이션이라 할 수 있다.
리모트 리소스에 쉽게 접근하기 위한 수단으로는 groupware라는 소프트웨어가 있다. 이것은 CSCW(Computer Supported Cooperative Work)라고도 불리는 응용 프로그램으로, 여러 사용자들이 리소스를 공유하며 협동 작업을 할 수 있도록 기능을 제공해준다. 이를 사용하여 공유 문서에서 동시에 문서를 편집하거나 화상 회의를 진행할 수 있다.
이를 통해 여러 사용자들간의 connectivity와 sharing이 증가할 것이다. 이는 보안 상의 문제를 유발할 수 있으니 주의해야 한다. (보안을 잘 유지하기 위해서 인증과 인가를 구현하자!)
서비스를 제공하는 리소스가 분산되어 있는 것을 클라이언트에게 숨겨야 한다. 여기서 '숨겨야 하는데 왜 투명성을 이야기할까?' 라는 의문이 들 수 있다. 하지만 여기서 투명성은 서버와 클라이언트 사이의 막이 투명하다는 것이 아니라, 서버 자체가 투명해진다는 것을 의미한다.
투명성이 보장되면 클라이언트가 편리하게 서비스를 사용할 수 있기 때문에 이를 지향한다. 따라서 사용자가 서버의 존재 자체를 모르는 것이 가장 이상적인 분산 시스템의 모습이다. (딜레이없이 서비스가 제공되는 상태)

access
리소스에 접근하는 방식을 동일하게 하여 시스템이 분산되어 있는 사실을 숨긴다.
location, migration, relocation
location은 말그대로 리소스가 어느 서버에 위치해 있는지를 숨기는 것이다.
migration과 relocation은 리소스의 이동을 숨기는 것이다. migration은 사용자가 리소스를 사용하지 않는 틈을 타 리소스를 다른 서버로 이동시키는 방식이고, relocation은 사용자가 사용중인 리소스를 다른 서버로 옮기는 방식이다.
replication, distribution
replication은 여러 서버에 동일한 리소스를 복제해 놓는 것이고, distribution은 하나의 리소스를 쪼개어 각각 다른 서버에 나누어 보관하는 방식이다. 이 방식을 사용하여 분산 시스템의 성능을 향상시킬 수 있다.
concurrency
같은 리소스에 여러 사용자가 동시에 접근하고 있다는 사실을 숨기는 것이다.
동시에 변경했을 때 충돌이 나는 문제를 해결하는 방법은 이후에 locking mechanism에서 다룰 예정이다.
failure transparency
서비스의 failure를 숨기면서 복구 가능한 것을 의미한다. 분산 시스템의 특성 중 4. dependabiliy, 신뢰성과 관련이 있다.
개방성은 표준을 지키는 것과 관련이 있다. 둘은 무슨 관계일까?
시스템을 오픈소스로 개방하면 사용자들에게 분산 시스템을 사용하기 위한 standard rules을 제공할 수 있다. 이렇게 제공된 규칙은 protocol이라는 통신 규약에서 공식화된다. 이는 시스템의 사용성을 향상시켜줄 수 있다. 따라서, 오픈소스를 통해 제공된 standard rule에 따라서 애플리케이션을 만들면 사용성을 보장할 수 있다.
(오픈소스로 개방된 시스템을 인터페이스, 이를 따라 만든 애플리케이션을 구현체라고 비유할 수 있다)
openness를 지킬 때의 이점에는 interoperability와 portability가 있다.
interoperability는 상호운용성을 의미한다. A, B회사에서 동일한 서비스 C를 각각 만들었을 때, 사용자 입장에서 두 서비스를 동일한 품질로 사용할 수 있으면 해당 서비스를 '상호 운용이 가능한 서비스'라고 한다.
portability는 이동성 또는 휴대성을 의미한다. java처럼 여러 시스템(OS)에서 이용 가능한 서비스를 뜻한다. 위의 경우와 비교해보면, A라는 한 회사에서만 개발한 서비스 C를 B 회사의 환경에서도 사용할 수 있는 서비스를 가리킨다.
오늘날 서비스들은 flexible 하게 제공하지 않고 monolithic 하게 제공된다. 이는 openness가 잘 실천되고 있지 않다고 볼 수 있다. 이를 해결하기 위해선 사용자에게 제공할 서비스의 policy와 mechanism을 분리 해야한다. 서비스를 어떻게 제공할 지와 무엇을 제공할지를 분리해서 설계해야 한다는 의미이다. 웹 캐시를 예로 들자면, 캐시를 사용하여 서비스의 성능을 높이는 것은 적용하되, 여러 옵션들을 사용자가 선택할 수 있도록 하여 서비스 제공 방식을 다양화하면 flexible한 서비스를 만들 수 있다.
사용자가 믿고 사용할 수 있는 서비스는 중단 없이 계속 사용할 수 있어야 한다. 이는 결함(fault) 또는 고장(failure)이 발생해도 정상적 혹은 부분적으로 기능을 수행한다는 것을 의미한다.
여러가지 측면의 확장성이 있다.

centralized 서비스란 서버가 한 대로 구성되어 있으며 모든 클라이언트가 이 서버에 요청을 보낸다. 이러한 중앙 집중 방식은 성능 측면에서 매우 좋지 않다. 이를 보완하기 위해서 나온 것으로 decentralized 서비스와 distributed 서비스가 있다.
decentralized 서비스는 서버를 여러 개로 분산하여 하나의 서버에서 오류가 발생해도 나머지 서버는 부분적으로 정상 작동이 가능하다.
distributed 서비스는 서버가 없이 클라이언트로만 이루어져 있다. 각각의 클라이언트는 때로는 서버의 역할을 하기도 하고 클라이언트의 역할을 하기도 한다.
이는 확장성 측면에서만 바라본 장단점이고, 이외에도 여러 요소를 고려하여 적절한 구조를 선택해야 한다.
geographically (지리적 확장)
서버와 클라이언트의 거리가 멀어지는 것과, 서버 간의 거리가 멀어지는 것 이렇게 두가지 의미가 있을 수 있다.
먼저 서버와 클라이언트의 거리가 멀어져서 발생하는 딜레이를 최소화하기 위해선 통신 횟수를 줄여야 한다. 예를 들면 서버에서 하던 유효성 검증을 클라이언트 측에서 하면 잘못된 요청이 발생했을 때 클라이언트와 서버 사이에서 요청과 응답이 오가는 횟수를 줄일 수 있다.

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

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