하둡을 구성하는 핵심요소는 세 가지로 압축됩니다. 첫째는 하둡 분산 파일 시스템(HDFS). 둘째는 하둡 맵리듀스. 그리고 마지막으로 하둡 YARN 입니다. 하둡 딥인사이드의 챕터는 앞의 순서대로 진행이 될 것입니다. 그리고 그 첫번째 챕터, HDFS에 대한 이야기를 시작하도록 하겠습니다.
현 시점의 저는 HDFS가 어떤 구조와 형태로 작동하는지는 아직 잘 모르지만, 그것이 하둡 분산 파일 시스템이라는 건 알고 있습니다. 굉장히 큰 데이터를 분산된 형태의 파일로 저장한다는 정도의 이해죠.
그럼 아주 근본적으로 생각해봅시다. 분산 파일 시스템은 뭘까요? 분산 파일 시스템이 뭐길래 구글은 GFS라는 논문을 작성한 것일까요?
전 HDFS를 공부하기에 앞서 ‘이 분산 파일 시스템이 무엇인가’라는 근본적인 의문을 먼저 해소해 보려 합니다.
1. 분산 파일 시스템(Distributed File System) 개요
분산 파일 시스템의 정의는 무엇일까요? 사실 분산 파일 시스템(DFS)이란 이름 그 자체가 꽤나 직접적으로 분산 파일 시스템이 무엇인지를 나타내고 있습니다. 정확하게 정의하긴 힘들어도 ‘파일이 여기저기에 분산되어 보관되고 있는 시스템이다’라는 느낌은 받을 수 있으니까요. 그럼에도 좀 더 명확하게 개념을 잡기 위해서 DFS를 좀 더 정갈하게 정의해보겠습니다.
“분산 파일 시스템이란, 파일이 서로 물리적으로 다른 위치에 존재하는 파일 서버들에 분산되어 저장되어 있는 시스템을 의미한다. “
여기서 파일 서버들은 각각 하나의 컴퓨터라고 이해하시면 편합니다. 물론 서버라는 개념은 컴퓨터보다 좀 더 넓고 추상적인 개념에 가깝지만 일단 이해의 편의를 위해 컴퓨터라고 생각을 해보자는 겁니다.
내가 컴퓨터를 5대가지고 있다면 나는 5대의 서버를 가지고 있다고 말할 수 있습니다. 만약 이 컴퓨터들로 분산 파일 시스템을 만들려고 한다면, 나는 5대의 컴퓨터에 모든 파일들을 분산해서 넣어야하겠죠. 그렇다면 이 파일들을 일일이 하나씩 넣어야 할까요? 만약 내가 가진 컴퓨터가 부산에 한 대, 서울에 세 대, 인천에 한 대가 있다면, 나는 모든 지역을 방문해서 파일들을 집어 넣어야 하는걸까요?
여기서 등장하는 분산파일 시스템의 핵심요소가 바로 네트워크입니다. 사실 분산 파일 시스템은 네트워크가 없다면 무의미하다고 할 정도로 네트워크가 중요합니다. 분산 파일시스템의 근간이 되는 분산 시스템이라는 운영체제가 등장하는 배경에 네트워크의 등장이 있을 정도니까요.
분산 파일 시스템 하에서 각각 독립된 파일 서버들은 네트워크로 연결이 되어있습니다. 이 네트워크를 통해 물리적으로 떨어져있는 서버들에 접근이 가능해지고, 손쉽게 파일들을 분산 저장할 수 있게 되는거죠.
이뿐만아닙니다. 독립된 파일서버들이 네트워크로 연결되면서 어디서나 더 손쉽게 분산 저장된 파일에 접근이 가능해집니다. 제가 부산에있어도 서울이나 인천에 있는 컴퓨터에 저장된 파일을 사용할 수 있다는 것이죠.
지금까지는 저라는 개인에 초점을 맞췄다면, 이제는 분산파일 시스템을 사용하는 사용자가 100명이라고 해보죠. 분산파일 시스템 하에서 모든 사용자들은 원격으로 손쉽게 데이터를 공유할 수 있습니다. 그 수가 얼마가 됐든, 네트워크로 연결만 되어있다면 사용자들이 손쉽게 분산파일 시스템에 접근할 수있습니다. 마치 자신의 로컬 시스템에서 사용하는 것처럼 말이죠.
그럼 이를 토대로 다시 한번 분산 파일 시스템에서 대해서 정의해보겠습니다.
“분산 파일 시스템이란, 네트워크로 연결되어 있지만 서로 물리적으로 다른 위치에 존재하는 파일 서버들에 파일을 분산 저장하는 시스템이다.“
2. 분산 파일 시스템이 중요한 이유
분산 파일 시스템을 사용하는 이유는 여러 위치에서 특정 데이터에 대한 접근이 가능하도록 하기 위해서 입니다. 간단한 예를 하나 들어보겠습니다. 전 세계에 걸쳐 팀원들이 분산되어 있는 프로젝트 팀을 가정해보죠. 이들이 공동으로 작업을 하기 위해서는 동일한 파일에 접근할 수 있어야 합니다.
DFS(분산 파일 시스템)는 서로 다른 로컬에 있는 파일 서버와 같이 여러 위치에 분산되어 저장되는 파일 시스템입니다. 파일은 로컬에 저장된 것처럼 어느 위치의 모든 장치에서 파일에 액세스할 수 있습니다. DFS를 사용하면 제어된 방식으로 네트워크의 권한 있는 사용자 간에 정보와 파일을 편리하게 공유할 수 있습니다.
특히나 오늘날 클라우드 서비스의 이용이 증가하고 원격 환경에서의 협업이 빈번해지는 것을 감안하면 분산 파일 시스템이 더욱 중요할 수 밖에 없습니다. AWS S3, Google Cloud Storage, Microsoft Azure은 모두 분산 파일 시스템이 적용된 클라우드 서비스입니다.
여기서 한가지 더 짚고 넘어가겠습니다. 위의 개요에서 “네트워크로 연결만 되어있다면 사용자들이 손쉽게 분산파일 시스템에 접근할 수있습니다. 마치 자신의 로컬 시스템에서 사용하는 것처럼 말이죠.”라고 서술한 부분이 있습니다.
사실 이부분은 클라우드 서비스와 연관지으면 엄청 직관적으로 이해가 가능합니다. 우리가 GCP에서 인스턴스를 하나 생성했다고 해보죠. 우리는 Public-key를 만들고 GCP에 등록을하면, 이를 통해 ssh 통신을 하여 그 인스턴스에 접속할 수 있죠. 그리고 그 인스턴스에 접속하면 우리는 자신의 로컬 pc인 것처럼 파일을 생성하고 삭제하고 실행하는 모든 일들을 할 수가 있습니다. 이것이 자신의 로컬 시스템에서 사용하는 것처럼 분산 파일 시스템에 접근 할 수 있다는 것입니다.
3. 분산 파일 시스템의 장단점
지금까지 분산 파일 시스템을 공부해보니 꽤나 좋아보이는게 사실입니다. 하지만 좀더 구체적인 장점들을 나열해보고 단점들 또한 같이 알아보면 분산 파일 시스템을 이해하는데 더 큰 도움이 될것 같습니다. 장점들은 안다는 건 적시에 해당 시스템을 사용할 수 있는 통찰력을 제공해주고, 단점을 안다는 건 시스템을 구축할 때 다양한 변수를 고려하여 더욱 탄탄한 구조를 만들 수 있는 넓은 시야를 갖게 해주니까요.
먼저 장점부터 살펴보겠습니다. 분산 파일 시스템의 장점은 크게 네가지로 나눌 수 있습니다. 세부적인 내용은 아래와 같습니다.
[장점]
1) 높은 신뢰성(High Reliability)
분산 파일 시스템이 가지는 가장 큰 이점은 데이터 중복성, 즉 동일한 정보가 여러 노드에 저장됨에 따라 갖게되는 높은 신뢰성과 가동 시간입니다. 사실 저 개인적으로 높은 신뢰성이라는 말이 좀 직관적으로 와닿는 느낌은 아닙니다. 그러니 하나씩 좀 더 풀어서 설명해보도록 하겠습니다.
분산 파일 시스템은 동일한 데이터가 여러 서버(혹은 노드)에 분산되어 저장이 됩니다. 이를 데이터의 중복성(redundancy)이라고 하며, 분산 파일 시스템이 높은 신뢰성(reliability)을 갖게 해주는 핵심 원리가 되죠.
데이터의 중복성과 높은 신뢰성은 어떤 맥락에서 같이 등장하는 걸까요? 동일한 데이터 정보가 분산되서 저장되는 건 일견 비효율적을 보일수도 있을텐데 말이죠. 그러나 매우 큰 데이터가 저장되어야 한다고 생각해보면, 이야기가 달라집니다. 저장해야되는 데이터의 크기가 증가한다는건 그 자체로 데이터의 손실이 커진다는 것을 의미하기 때문입니다.
아주 단순하게 생각해보기 위해 어떤 보관소의 물건 유실이 10퍼센트 확률로 발생하고 보관소의 물건 보관에는 제한이 없다고 가정해봅시다. 내가 열개의 물건을 맡기면 한개의 물건이 유실될것이라고 예상할 수 있습니다. 그러나 내가 1억개의 물건을 맡긴다면 천만개의 물건이 유실될 것이라고 예상하게 됩니다. 유실 확률은 변하지 않았지만 실제 유실되는 물건의 수는 내가 맡긴 물건의 수에 비례해서 증가하기때문에 내가 맡긴 물건의 수가 크면 클수록 유실되는 물건의 양은 계속 늘어날 것입니다.
이는 데이터 세계에서도 마찬가지입니다. 모든 스토리지들은 위에서 예시로 든 보관소 처럼 어느정도 데이터 유실이 발생하게됩니다. 완전을 담보하는건 없기 때문이죠. 내가 저장해야되는 데이터의 양이 많아지면 많아질 수록 데이터의 유실량은 늘어나고 이는 데이터의 신뢰성에 아주 부정적인 영향을 미칩니다. 시스템의 신뢰성이 없어 사용자가 파일의 백업 본사본을 스스로 만들게되는 상황이 강요되기 때문이죠.
그렇기 때문에 데이터의 중복성은 분산 파일 시스템이 높은 신뢰성을 갖도록 해줍니다. 즉, 분산 파일 시스템은 원본이 손실된 경우 사용할 수 있는 백업 복사본을 만들어서 안정적인 스토리지의 역할을 수행한다는 것이죠.
그럼 가동시간은 뭘까요? 가동시간은 두 가지 측면에서 정의할 수 있습니다. 첫째는 내가 찾고자하는 데이터에 접근하는 속도라고 보시면 됩니다. 같은 데이터가 여러 서버에 복사본 형태로 저장되어 있다는 건, 모든 노드를 다 찾아보지 않고도 내가 원하는 데이터를 찾을 확률이 올라감을 의미합니다. 둘째는, 외부에서 해당 데이터에 접근하는 속도 혹은 편의성입니다. 분산 파일 시스템 하에서는 원하는 데이터를 찾을 때, 어떤 노드에서든 같은 검색을 수행해서 해당 데이터에 접근이 용이해집니다.
2) 높은 내결함성(Fault-tolerance)과 고가용성(Availability)
사실 이 두개의 성질을 따로 하나씩 해야할지 한번에 이야기할지 아니면 그냥 넘어갈지 꽤 긴 고민을 했었습니다. 근본적으로 두 성질은 위의 높은 신뢰성과 연관된 개념이기도 하고, 서로가 비슷한 개념이기도 하기 때문입니다. 그러나 동시에 이 두 가지 성질은 분산과 관련된 시스템이라면 어디에서라도 등장하는 너무 흔한 용어이기도 합니다. 우리가 현재 타겟으로 삼은 GFS, HDFS 뿐만아니라 클러스터링이 가능한 소프트웨어라면 관련 레퍼런스에서 반드시 이 두 가지 성질이 언급된다는 것을 알 수 있습니다. 그래서 어차피 뒤에 자주 나오는 개념이라면 이참에 확실히 정리하고자 한번에 묶기로 결정했습니다.
앞서 설명한 높은 신뢰성은 엄밀히 말하면 스토리지로서 분산 파일 시스템의 안정성과 직접적으로 연관이 있습니다. 즉, 분산 파일 시스템의 신뢰성은 스토리지로서의 기능이 얼마나 안정적이냐에 달려있다는 것입니다. 실제로 많은 분산 파일 시스템이 안정적인 스토리지를 높은 신뢰성 전략으로 사용합니다.
반면 내결함성과 가용성은 시스템의 에러와 장애에 관한 개념입니다. 사실 두 개념이 어느정도 혼용되는 경향이 있지만 엄밀하게 두 특성의 개념은 차이가 있습니다.
먼저 내결함성은 시스템의 일부 구성 요소가 작동하지 않더라도 계속 작동할 수 있는 기능을 의미합니다. 물론 내결함성이라는 말 자체가 좀 낯설긴 하지만, 좀 더 단순하게 해석하면 결함에 대한 내성 또는 장애에 대한 허용 정도로 이해할 수도 있습니다.
높은 내결함성이 시사하는 바는, 한 노드에서 문제가 발생하더라도 다른 모든 노드에서 동일한 정보를 쉽게 검색할 수 있다는 것입니다. 그리고 모든 노드가 동시에 가동 중지 시간을 경험할 위험은 제로에 가깝습니다.
여기서 주의해야 할점은 높은 내결함성이 장애를 떠안은채 서비스를 지속한다는 개념이 아니라는 것입니다. 장애가 있더라도 다른 가용영역(분산 파일 시스템 내의 다른 노드나 서버를 의미)으로 연결을 시킴으로서 해결하는 즉, 어찌보면 간접적으로 우회해서 해결할 수 있는 능력(또는 기능)을 의미하는 것입니다.
반면 가용성은 내결함성보다 좀 더 넓은 차원에서의 개념입니다. 고가용성은 전체 시스템 차원에서 사람의 개입없이 시스템이 항상 작동하며, 엑세스 가능하며, 가동 중지를 최소화 하도록 보장하는 기능을 의미합니다. 또, 고가용성은 내결함성과 달리 장애가 발생하면 복구(Failover)해서 서비스를 정상 운영할 수 있도록 합니다. 이 때문에 복구를 위한 약간의 장애시간이라는 개념도 이 고가용성이라는 개념안에 포함되어 있습니다.
한가지 재밌는 점은 높은 내결함성이든 고가용성이든 결과적으로 하나의 지향점을 가지고 있다는 것입니다. 이때문에 두 개념이 어느정도 혼용되어 퍼져있는 것이겠죠.
그럼 두 기능이 공통적으로 추구하는 지향점은 무엇일까요? 이는 바로 데이터 무결성입니다. 사실 별개의 개념으로 데이터 무결성을 소개할 수 도 있지만, 굳이 하위개념으로서 데이터 무결성을 사용한건, 이렇게 이해를 했을때 훨씬 이해가 잘 되었기 때문입니다.
데이터 무결성은 데이터의 생애주기 동안 모든 데이터가 얼마나 완전하고, 일관되고, 정확한지를 나타내는 정도를 뜻합니다. 데이터 무결성의 핵심 요소는 데이터가 우연하게 또는 의도적으로 변경되거나 파괴되는 상황에 노출되지않고 보존되어야 한다는 것입니다. 이러한 의미에서 높은 내결함성과 고가용성은 여러 장애로 인해 데이터가 손상되는 상황을 컨트롤함으로서 분산 파일 시스템의 데이터 무결성에 기여하게 됩니다. 물론 내결함성은 하드웨어 측면으로 장애 상황을 컨트롤 한다면, 고가용성은 좀더 소프트웨어적인 관점에서 장애상황에 대처한다는 차이는 존재합니다.
3) 확장가능성
분산 파일 시스템을 확장하고 싶을 땐, 네트워크로 원하는 노드를 연결해주기만 하면 시스템의 확장이 가능합니다. 이처럼 더 쉽고 빠르고 거대한 클러스터를 구축가능하다는 건 이 분산 파일 시스템이 가지는 큰 특징 중 하나입니다.
4) 협업과 접근 용이성(Collaboration and Ease of Access)
분산 파일 시스템을 사용하면 모든 직원이 서로 다른 위치에서 동시에 회사 데이터에 접근할 수 있습니다. 단순히 데이터에 접근하는 것 외에도 직원들은 파일을 업로드, 다운로드 및 공유 할 수 있으므로 여러 사람이 한 번에 하나의 파일로 작업 할 수 있습니다. 이는 문서 처리 시간을 줄이고 모든 팀이 원격으로 작업하는 경우에 생산성 향상이 가능하게 합니다.
[단점]
1) 보안 위험(Security Threats)
데이터는 여러 물리적 컴퓨터 및 위치에 저장되므로 이러한 모든 단계에서 위반이 발생할 수 있으므로 저장소의 보안, 파일 전송 프로토콜 및 저장소 연결에 대한 더 많은 투자가 필요합니다. 그렇지 않으면 시스템 취약점을 이용하여 인터넷에 민감한 데이터 유출를 유출시키는이 상황이 발생할 수도 있습니다. 그렇기 때문에 내부 VPN 연결을 통해 접근을 제한하고 2FA 또는 OTP와 같은 여러 보안 계층을 추가하여 회사 외부에서 데이터에 액세스 할 수 없도록해야합니다.
2) 속도 감소(Reduced Speed)
데이터 특성과 물리적 시스템 용량에 따라, 팀이 빅 데이터를 대상으로 대규모 작업 진행할 경우, 연결, 수신 및 발신 서버 요청이 많은 서버의 CPU 및 RAM 리소스를 더 소비하므로 전체적인 읽기 속도가 느려질 수 있습니다. 또한, 모든 노드가 한번에 데이터를 보내려하고 하는 경우가 있다면, 병목현상으로 인해 오버로드가 발생할 가능성이 존재합니다.
이러한 속도의 감소가 발생할 수 있다는 것은, 노드 간의 데이터가 전송될때 네트워크 상의 메세지와 데이터가 손실될 수도 있다는 것을 의미합니다.
3) 관리 복잡화(Management Complications)
분산 파일 시스템 관리는 중앙 집중식 관리보다 더 복잡한 프로세스를 가집니다. 데이터가 다른 소스에서 로드되는 경우 결함이 있는 노드를 찾아 적절한 시스템 진단을 수행하는 것이 어려울 수 있다는 것입니다. 그렇기 때문에 분산 시스템을 선택하는 경우 고도로 숙련 된 엔지니어 팀이 필수입니다. 불시의 사고가 있더라도 시스템의 특성으로 인해 그 사고를 처리하는 시간이 더 길어질 수 있기 때문입니다.
4. 빅데이터에서의 분산 파일 시스템
빅 데이터 작업 과제 중 하나는 서버가 보유한 스토리지 용량이나 컴퓨팅 성능이 아무리 커도 단일 서버에서 관리하기에는 너무 크다는 것입니다. 특정 시점이 지나면, 단일 서버에 점점 더 많은 용량을 추가하기 위해 계속 확장하는 것이 더이상 의미가 없습니다. 대신 각 클러스터의 컴퓨팅 성능을 활용하기 위해 확장하여 데이터를 여러 노드에 분산해야 합니다. 분산 파일 시스템을 통해 기업은 여러 클러스터 또는 노드에서 빅 데이터에 대한 접근을 관리할 수 있으므로 빅 데이터를 빠르게 읽고 병렬 로 읽기 및 쓰기를 수행할 수 있습니다.
5. 분산 파일 시스템의 작동
분산 파일 시스템은 배포와 복제라는 두 가지 방식으로 작동합니다.
- 배포 : 먼저 DFS는 데이터 세트를 여러 클러스터 또는 노드에 분산합니다. 각 노드는 DFS가 데이터 세트를 병렬로 처리할 수 있도록 하는 자체 컴퓨팅 성능을 제공합니다.
- 복제 : 또한 DFS는 동일한 정보를 여러 클러스터에 복사하여 데이터 세트를 다른 클러스터에 복제합니다. 이를 통해 분산 파일 시스템은 노드 또는 클러스터 장애 시 데이터를 복구하는 내결함성과 동일한 데이터를 동시에 처리할 수 있는 높은 동시성을 달성할 수 있습니다.