SAN과 NAS 비교
최근 몇 년 동안 제가 목격한 가장 큰 혼란 중 하나는 NAS와 SAN에 관한 것입니다. 각각이 무엇인지 이해하면 어디서 유용하고 적합한지를 파악하는 데 크게 도움이 됩니다.
첫 번째 과제는 마케팅 용어를 걷어내고 기술적인 용어로 넘어가는 것입니다. NAS는 네트워크 결합 스토리지(Network Attached Storage)를 의미하지만 정확히 그것만을 뜻하지는 않으며, SAN은 스토리지 영역 네트워크(Storage Area Network)를 의미하지만 일반적으로 네트워크 자체가 아닌 SAN 장치를 가리키는 데 사용됩니다. 가장 정확한 의미에서 SAN은 스토리지 트래픽 전용 네트워크를 말하지만, 현실 세계에서는 그렇게 일반적으로 사용되지 않습니다. 여기서는 NAS와 SAN 장치에 대해 이야기하고 비교할 것이므로 네트워크가 아닌 장치를 의미하는 정의를 사용하지 않겠습니다. 사실 NAS와 SAN 모두 마케팅 용어이며, 그로 인해 경계가 다소 흐릿합니다. 관련된 모든 당사자가 의미를 알고 있다면 일반적인 기술적 대화에서 사용하기에는 충분히 정확하지만, 의미를 논의할 때는 멋있게 들리는 이름을 걷어내고 가장 기술적인 설명에 집중해야 합니다. 마케팅에서 사용될 때 두 용어 모두 특정 기술이 '어플라이언스화'되었다는 것을 암시하는 데 사용되므로, 용어의 사용이 불필요하게 복잡해지지만 그렇다고 더 유용하지도 않습니다.
따라서 첫 번째 과제는 이 두 명칭이 장치 맥락에서 무엇을 의미하는지 정의하는 것입니다. 두 장치 모두 스토리지 서버로, 단순히 스토리지를 외부 세계에 노출하는 두 가지 다른 방식일 뿐입니다.
둘 중 더 단순한 것은 SAN으로, 정확하게는 블록 스토리지 장치입니다. 스토리지를 외부에 블록 장치로 노출하는 모든 장치가 이 범주에 속하며, 사용 방식에 따라 상호 교환적으로 사용할 수 있습니다. 블록 스토리지 장치에는 외장 하드 드라이브, DAS(직접 연결 스토리지, Direct Attach Storage), 그리고 SAN이 있습니다. 이 모두는 사실 같은 것입니다. 데스크톱에 연결하면 외장 하드 드라이브라고 부릅니다. 서버에 연결하면 DAS라고 부릅니다. 장치와 최종적으로 스토리지를 사용하는 장치 사이에 스위치 같은 형태의 네트워킹을 추가하면 SAN이라고 부릅니다. 이 장치들 사이에는 기술적인 차이가 없습니다. 전통적인 SAN을 데스크톱에 직접 연결하여 외장 하드 드라이브처럼 사용할 수 있습니다. 외장 하드 드라이브를 스위치에 연결하여 네트워크의 여러 장치에서 사용할 수도 있습니다. 스토리지 장치와 이를 사용하는 시스템 간의 인터페이스는 블록입니다. 블록 스토리지의 일반적인 프로토콜에는 iSCSI, 파이버 채널(Fibre Channel), SAS, eSATA, USB, 썬더볼트(Thunderbolt), IEEE1394(일명 파이어와이어, Firewire), 이더넷 파이버 채널(FCoE), 이더넷 ATA(AoE) 등이 있습니다. 블록 스토리지 장치에 연결하는 장치는 항상 스토리지를 디스크 드라이브로 인식할 뿐 그 이상은 아닙니다.
NAS는 '파일러(filer)'라고도 알려져 있으며, 파일 스토리지 장치입니다. 즉, 스토리지를 네트워크 파일 시스템으로 노출합니다. 따라서 이 스토리지에 연결하는 장치는 디스크 드라이브가 아니라 마운트 가능한 파일 시스템을 보게 됩니다. NAS가 어플라이언스로 패키지화되지 않을 때 우리는 단순히 파일 서버라고 부르며, 데스크톱에서 서버에 이르는 거의 모든 컴퓨팅 장치에는 이 기능이 어느 정도 포함되어 있습니다. 파일 스토리지 장치의 일반적인 프로토콜에는 NFS, SMB/CIFS, AFP가 있습니다. 그 외에도 많은 것들이 있으며, 기술적으로 FTP, HTTP 같은 특수 케이스 파일 스토리지 프로토콜도 포함될 수 있습니다. 극단적인 예로, 전통적인 웹 서버는 매우 특화된 형태의 파일 스토리지 장치입니다.
블록 스토리지와 파일 스토리지 장치를 구분하는 것은 외부 세계에 제공하는 인터페이스 유형입니다. 달리 말하면, 스토리지 스택 내에서 서버 장치와 클라이언트 장치 사이의 경계가 어디에 있느냐입니다.
오늘날 동일한 장치에서 블록 스토리지와 파일 스토리지 모두를 제공하는 스토리지 장치가 매우 일반화되었습니다. 이를 수행하는 시스템을 유니파이드 스토리지(unified storage)라고 합니다. 유니파이드 스토리지에서는 블록 스토리지 장치(SAN)로 동작하는지, 파일 스토리지 장치(NAS)로 동작하는지, 또는 둘 다인지는 구매하는 것이 아니라 장치에 대해 구성하는 동작을 기반으로 합니다. 이는 이것이 순전히 프로토콜 또는 인터페이스의 구별이지, 크기·기능·신뢰성·성능·기능 등의 구별이 아님을 강조하는 중요한 점입니다.
두 유형의 장치 모두 스토리지를 외부에 넘겨주는 '분기점' 아래에서 확장 기능을 제공할 수 있는 옵션이 있지만 반드시 그래야 하는 것은 아닙니다. 둘 다 RAID, 논리 볼륨 관리, 모니터링 등을 제공할 수도, 하지 않을 수도 있습니다. 파일 스토리지(NAS)는 Windows NTFS ACL 같은 파일 시스템 기능도 제공할 수 있습니다.
블록 스토리지의 핵심 장점은 연결하는 시스템이 스토리지 시스템을 전통적인 디스크 드라이브처럼 조작할 기회를 갖는다는 것입니다. 이는 스토리지 장치의 '블랙박스' 내에서 이미 수행되었을 수 있는 RAID 및 논리 볼륨 관리를 원한다면 더 높은 수준에서 다시 수행할 수 있음을 의미합니다. 클라이언트 장치는 어떤 종류의 장치를 보고 있는지 인식하지 못하며, 단지 디스크 드라이브처럼 보인다는 것만 알 뿐입니다. 따라서 신뢰(예를 들어, 적절한 수준의 RAID가 있다고 가정하는 것)를 선택하거나, 일반 로컬 디스크처럼 여러 블록 스토리지 장치를 RAID로 결합할 수 있습니다. 이는 매우 드문 경우이지만 흥미로운 옵션이며, 이런 방식으로 사용되도록 설계된 제품들도 있습니다.
보다 일반적으로는 Linux LVM, Solaris ZFS, Windows 동적 디스크(Dynamic Disks) 같은 논리 볼륨 관리가 장치의 노출된 블록 스토리지 위에 적용된 다음, 그 위에 파일 시스템이 사용됩니다. 블록 스토리지 장치를 사용할 때 파일 시스템은 스토리지 장치가 아닌 클라이언트 장치에 의해 생성되고 관리된다는 점을 기억하는 것이 중요합니다. 스토리지 장치는 자신이 제공하는 블록 스토리지가 어떻게 사용되는지 전혀 알지 못하며, 최종 사용자가 완전한 통제권을 갖고 원하는 대로 사용할 수 있습니다. 이는 블록 스토리지 장치를 연쇄적으로 연결하여 하나가 다음 것에 스토리지를 제공하고, 이것들을 RAID 그룹으로 결합할 수 있는 지점까지 확장됩니다. 블록 스토리지 장치는 사실상 무한정으로 계층화될 수 있습니다.
반면 파일 스토리지 장치는 스토리지의 블록 부분을 모두 포함하므로 RAID, 논리 볼륨 관리, 모니터링에 대한 모든 기회는 파일 스토리지 장치가 처리해야 합니다. 그런 다음 블록 스토리지 위에 파일 시스템이 적용됩니다. 일반적으로 Linux의 EXT4, FreeBSD와 Solaris의 ZFS, Windows NTFS가 사용되지만, WAFL, XFS, JFS, BtrFS, UFS 등 다른 파일 시스템도 물론 가능합니다. 이 파일 시스템에 데이터가 저장됩니다. 이 데이터를 외부 세계와 공유하기 위해 네트워크 파일 시스템(분산 파일 시스템이라고도 함)이 사용되며, 네트워크가 활성화된 파일 시스템 인터페이스를 제공합니다. NFS, SMB, AFP가 가장 일반적이지만, 어떤 프로토콜 계열에서도 마찬가지로 수많은 특수 케이스와 특이한 가능성이 있습니다.
파일 스토리지 장치의 스토리지를 사용하려는 원격 장치는 로컬 파일 시스템을 보는 것과 동일하게 네트워크를 통해 보고 동일한 방식으로 마운트할 수 있습니다. 이로 인해 파일 스토리지는 모든 면에서 매우 자연스럽기 때문에 일반 소비자가 사용하기 특히 쉽고 명확합니다. 우리는 일반 데스크톱 컴퓨팅을 위해 매일 네트워크 파일 시스템을 사용합니다. 예를 들어 Windows에서 '드라이브를 매핑'할 때 네트워크 파일 시스템을 사용하는 것입니다.
블록 스토리지와 파일 스토리지 사이에서 반드시 구별해야 하는 중요한 차이점은, 둘 다 잠재적으로 네트워크에 위치하여 여러 클라이언트 머신이 연결할 수 있지만, 오직 파일 스토리지 장치만이 그 액세스를 중재(arbitrate)하는 능력을 갖는다는 것입니다. 이것은 매우 중요하며 가볍게 넘길 수 없습니다.
블록 스토리지는 디스크 드라이브로 나타납니다. 단순히 디스크 드라이브를 두 대 이상의 컴퓨터에 동시에 연결하면 어떤 일이 일어날지 상상할 수 있습니다. 각 컴퓨터는 다른 컴퓨터의 존재를 알지 못하고 새로 생성된 파일이나 변경 사항을 인식하지 못하여 시스템들이 빠르게 서로의 데이터를 덮어쓰기 시작할 것입니다. 모든 노드에서 파일 시스템이 읽기 전용이라면 문제가 없습니다. 그러나 어떤 시스템이 데이터를 쓰거나 변경하면 다른 시스템에 문제가 생깁니다. 이는 일반적으로 매우 빠르게, 보통 몇 분 이내에 데이터 손상을 초래합니다. 극단적인 예로, 두세 개의 클라이언트 시스템이 모두 디스크 드라이브에 대한 독점적 접근권이 있다고 믿고 동시에 디스크 조각 모음을 실행한다고 상상해보세요. 드라이브의 모든 데이터가 몇 초 만에 뒤죽박죽이 될 것입니다.
반면 파일 스토리지 장치는 네트워크 파일 시스템이 실제 파일 시스템에 대한 액세스 통신을 처리하며, 파일 시스템은 그 특성상 자연스럽게 다중 사용자를 지원하기 때문에 자연스러운 중재를 갖습니다. 따라서 파일 스토리지 장치에 연결된 한 시스템이 변경을 하면 모든 시스템이 즉시 변경 사항을 인식하고 '서로 발을 밟는' 일이 없습니다. 심지어 그런 시도를 하더라도 파일 스토리지 장치의 파일 시스템이 액세스를 중재하고 최종 결정권을 갖기 때문에 그런 일이 발생하지 않습니다. 이는 최종 사용자(여기서는 시스템 관리자를 포함하는 의미로 '최종 사용자' 용어를 사용합니다)에게 데이터 공유를 쉽고 투명하게 만들어줍니다.
이는 블록 장치에서 스토리지를 공유할 방법이 없다는 것을 의미하지는 않지만, 그 중재는 블록 스토리지 장치 자체가 처리할 수 없습니다. 블록 스토리지 장치는 클러스터 파일 시스템(clustered file system)을 사용하여 '공유 가능'하게 만들 수 있습니다. 이러한 유형의 파일 시스템은 서버 클러스터가 단일 SCSI 케이블 양 끝에 SCSI 컨트롤러가 있는 두 서버와 케이블 중간에 공유 드라이브가 연결된 방식으로 스토리지 자원을 공유하던 시절로 거슬러 올라갑니다. 서버들이 통신할 수 있는 유일한 수단은 파일 시스템 자체를 통해서였기 때문에, 파일 시스템 자체를 통해 장치 간 통신이 가능하도록 특수한 클러스터 파일 시스템이 개발되어 한쪽이 변경한 내용을 다른 쪽에 알릴 수 있게 되었습니다. 이것은 실제로 놀랍도록 잘 작동하지만, 클러스터 파일 시스템은 Red Hat의 GFS와 Oracle의 OCFS가 전통적인 서버 세계에서 가장 잘 알려진 것들이고, VMware의 훨씬 최신인 VMFS가 가상화 스토리지에 사용되어 매우 잘 알려지면서도 상대적으로 드뭅니다. 시스템 관리자를 포함한 일반 사용자들은 클러스터 파일 시스템에 접근하지 못하거나 사용을 허용하지 않는 요구사항을 가질 수 있습니다. 중요하게 주목할 점은 중재가 파일 스토리지 장치처럼 강제(enforcement)가 아닌 신뢰(trust)를 통해 처리된다는 것입니다. 파일 스토리지 장치에서는 장치 자체가 액세스 중재를 처리하며 이를 우회할 방법이 없습니다. 클러스터 파일 시스템을 사용하는 블록 스토리지 장치의 경우, 스토리지에 연결하는 모든 장치가 클러스터 파일 시스템을 무시하고 단순히 수동적인 중재를 우회할 수 있습니다. 이는 일반적으로 우연히 발생할 만큼 간단합니다. 파일 시스템을 마운트할 때 잘못된 파일 시스템 유형을 지정하거나, 드라이브 오작동이나 악의적인 행동을 통해 발생할 수 있습니다. 따라서 블록 수준 스토리지를 보호하기 위해 네트워크 수준에서의 액세스 보안이 매우 중요합니다.
여기서 드러나는 기본 개념은 블록 스토리지 장치는 '멍청한' 장치(디스크 드라이브의 고급 버전이라고 생각하세요)이고, 파일 스토리지 장치는 '스마트한' 장치(전통적인 서버라고 생각하세요)라는 것입니다. 파일 스토리지 장치는 CPU, 메모리, 스토리지, 파일 시스템, 네트워킹을 갖춘 완전히 작동하는 '컴퓨터'를 포함해야 합니다. 블록 스토리지 장치에는 이러한 것들이 있을 수 있지만 반드시 필요하지는 않습니다. 가장 단순한 형태에서 블록 스토리지 장치는 USB 또는 이더넷 어댑터가 부착된 디스크 드라이브에 불과할 수 있습니다. RAID 컨트롤러와 이더넷 또는 파이버 채널 어댑터만으로 구성되는 경우도 실제로 드물지 않습니다.
블록 스토리지 장치와 파일 스토리지 장치 모두 사소하게 단순한 장치로 규모를 축소하거나 대규모 '메인프레임급' 초고가용성 시스템으로 확장할 수 있습니다. 둘 다 빠르거나 느릴 수 있습니다. 어느 것이 더 낫거나 더 나쁜 것이 아니며, 어느 것이 더 높거나 더 낮은 것도 아니고, 어느 것이 더 엔터프라이즈급인 것도 아닙니다. 서로 다를 뿐이며 일반적으로 다른 목적을 위해 사용됩니다. 그리고 어느 쪽도 고급 기능을 포함할 수도 있고 포함하지 않을 수도 있습니다. 과제는 어떤 작업에 어느 것이 적합한지 아는 것입니다.
저는 블록 스토리지 프로토콜을 커맨드 라인의 '표준 출력(standard out)' 스트림과 같이 생각하기를 좋아합니다. 따라서 모든 스토리지 '파이프라인'의 기본 수준은 항상 블록 장치이며, 출력이 블록 스토리지 프로토콜로 유지되는 한 여러 블록 장치 또는 변환이 각각 파이프로 연결되어 존재할 수 있습니다. 파일 시스템을 적용할 때만 체인을 종료합니다. 이런 방식으로 하드웨어 RAID, 네트워크 RAID, 논리 볼륨 관리 등이 필요에 따라 다양한 조합으로 적용될 수 있습니다. 블록 스토리지는 진정으로 단순한 데이터 블록이 아니라 스토리지 시스템의 빌딩 블록입니다.
매우 흥미로운 점은, 블록 스토리지 장치는 연쇄될 수 있고 네트워크 스토리지 장치는 '입력'으로 블록 스토리지를 받아들여야 하기 때문에, 블록 스토리지 장치(SAN)가 파일 스토리지 장치(NAS)의 백업 스토리지로 사용되는 것이 실제로 매우 흔하다는 것입니다. 특히 고급 시스템에서 그렇습니다. 단일 섀시 내에 공존하거나 네트워크에서 협력하여 작동할 수 있습니다.
