분산 시스템 이해하기
근래 MSA, 쿠버네티스, 카프카 등 대규모 서비스에서 사용되는 여러가지 기술들에 대해 눈으로 보고 귀를 듣는 경우가 많아졌다. 꽤나 예전부터 학습하고자 하는 마음에 관련 포스트들을 북마크에 쟁여 놓고 있었는데 일련의 경험이 트리거가 되어 드디어 그 보따리를 풀게 되었다. 먼저, 이것들의 바탕이 되는 분산 시스템의 개념에 대해서 이해해보자.
분산 시스템이란?
A collection of independent computers that appear to its users as one computer - Andrew Tanenbaum -
분산 컴퓨터 시스템(혹은 클러스터 컴퓨터 시스템)은 사용자의 입장에서 하나의 컴퓨터가 동작하는것처럼 보여지지만, 실제로는 여러개의 독립적인 컴퓨터(노드)가 네트워크를 통해 연결되어 작동하는 시스템을 의미한다. 필요하다면 여러 노드가 메세지를 통해 협력하여 작업을 수행한다.
분산 시스템은 확장성, 가용성, 성능 향상 등을 목표로 여러 노드가 협력하는 모든 개념을 포함한다.
- 대용량의 데이터를 안전하게 저장하고 빠르게 읽기 위해 여러 데이터베이스에 데이터를 분산 저장하고 동기화하는 시스템
- 장애 내구성을 높이고 부분별 확장성을 위해 큰 역할을 작은 역할로 분할하고 각 역할을 맡은 노드들이 협력하여 작업을 수행하는 시스템
- 성능향상을 위해 쓰기 데이터베이스와 읽기 데이터베이스를 나누어 관리하는 시스템
분산 시스템 설계 목표
Resource Sharing
사용자는 분산 시스템 상의 자원을 쉽게 공유하고 접근할 수 있어야 한다. 자원이라 함은 파일, 서비스, 네트워크 등 무엇이든 될 수 있다.
Transparency
프로세스와 자원이 시스템 내 여러 물리적인 컴퓨터에 분산되어 있다는 사실을 감추어야한다. 투명성에는 여러가지 종류가 있다.
Name | Description | |
---|---|---|
Access | 각 노드들이 하드웨어 및 OS의 종류가 다르므로 데이터 표현의 차이가 존재할 수 있다. 사용자는 이러한 차이와 그 구조를 알 필요가 없어야 한다. | |
Location | 사용자가 자신이 사용하는 개체가 시스템 내 물리적으로 어디에 위치하는지 알 필요가 없어야 한다. | |
Relocation | 기존에 존재하던 리소스인지 새로운 리소스인지, 대체한 리소스인지 사용자는 알 필요가 없어야 한다. | |
Migration | 실행 중인 프로세스의 물리적 위치가 변경되어도 사용자는 이를 알 필요가 없으며 영향을 받지도 않는다. | |
Replication | 가용성 및 퍼포먼스를 위해 복제가 이루어질 수 있다. 사용자는 정보가 복제인지 알 필요가 없으며 이로인한 영향도 받지 않아야 한다. | |
Concurrency | 여러 작업, 프로세스가 동시에 실행될 때 이로인한 복잡성을 숨겨야 한다.(락, 트랜잭션 등 동시성 제어를 위한 요소 숨기기) | |
Failure | 일부 시스템의 실패와 이를 복구하는 과정을 숨겨야 한다. 사용자는 일부가 고장이 나더라도 시스템은 계속 정상 작동해야한다. |
Openness
개방성은 분산 시스템에서 다른 시스템이 쉽게 사용 및 연동할 수 있어야 한다는 의미이다. 다시말해 프로세스가 자신이 제공하는 구문, 의미를 설명하는 표준 규칙을 준수하여 다른 구성 요소와 상호작용 할 수 있는 인터페이스를 잘 정의해야한다. 잘 정의된 인터페이스는
- 상호 윤용성이 좋다 - 서로 다른 구성요소가 서로 의지하여 동작할 수 있다.
- 이식성과 확장성이 높다 - 동일한 인터페이스를 가지는 다른 시스템에서도 수정 없이 동작할 수 있다.
Scalability
여기서 확장성은 규모, 지리적, 관리적인 측면을 모두 의미한다. 필요에 따라 증가하는 부하를 처리할 수 있어야 하고, 지리적으로 멀리 떨어진 사용자의 요청처리, 시스템 구성요소가 늘어나도 관리하기 수월해야한다.
분산 시스템이 도입된 서비스들
- 분산 어플리케이션 - MSA
- 분산 데이터베이스(스토리지) - Redis Cluster
- 분산 파일 시스템 - HDFS
- 분산 메시징 큐 - Kafka
- 분산 컴퓨팅 프레임워크 - Apache Spark, Flink
참고
댓글남기기