LUN 은 네트워크를 건너온 디스크다 — iSCSI 와 멀티패스
한 줄 요약
iSCSI 는 SCSI 명령을 TCP 위에 실어 블록 장치를 네트워크 너머로 건넨다. 서버에는 로컬 디스크처럼 /dev/sdX 로 보이지만, 그 아래에는 네트워크가 있다. 그래서 마운트 순서(_netdev), 접근 제어(ACL·CHAP), 경로 이중화(멀티패스)라는 로컬 디스크에 없던 세 가지 일이 생긴다.
왜 이게 필요했나
NFS 는 파일을 나눠 쓴다. 서버가 파일시스템을 갖고, 클라이언트는 "이 파일을 읽어 달라" 고 부탁한다. 그런데 데이터베이스나 하이퍼바이저는 파일이 아니라 블록 장치를 원한다. 자기 파일시스템을 직접 만들고 캐시와 쓰기 순서를 스스로 관리하려는 것이다. 디스크를 서버마다 꽂으면 용량이 서버에 갇힌다. 그래서 디스크를 한곳(스토리지 장비)에 모으고, 그중 일부를 잘라 서버에 블록 그대로 빌려주는 구조가 SAN 이고, 그 운반을 이더넷과 TCP 로 하는 것이 iSCSI 다.
어떻게 동작하나
RFC 7143 이 정의하는 용어는 몇 개뿐이다.
| 용어 | 뜻 |
|---|---|
| 이니시에이터(initiator) | 디스크를 쓰는 쪽. 서버 |
| 타깃(target) | 디스크를 내주는 쪽. 스토리지 |
| IQN | 양쪽의 이름. iqn.<연-월>.<뒤집은 도메인>:<고유 이름> 형식 |
| 포털(portal) | 타깃이 듣는 IP 와 포트. 기본 3260/tcp |
| LUN | 타깃 안에서 잘라 낸 논리 디스크 하나 |
리눅스의 이니시에이터는 open-iscsi 이고 명령은 iscsiadm 하나다. 흐름은 세 단계다. 발견(discovery) — iscsiadm -m discovery -t sendtargets -p <포털> 이 포털에 어떤 타깃이 있는지 묻고, 답을 로컬 노드 기록으로 저장한다. 로그인 — iscsiadm -m node -T <IQN> -p <포털> --login 이 세션을 맺고, 그 순간 커널에 새 SCSI 디스크가 나타난다. 사용 — 그 디스크는 lsblk 의 TRAN 열에 iscsi 로 보이고, 이름이 부팅마다 바뀔 수 있으므로 /dev/disk/by-path/ip-<포털>-iscsi-<IQN>-lun-<번호> 같은 고정 경로나 파일시스템 UUID 로 가리킨다. 노드 기록의 node.startup 을 automatic 으로 두면 서비스가 뜰 때 자동으로 로그인한다.
리눅스 커널에는 타깃 쪽도 들어 있다. LIO 라고 부르고, targetcli 로 설정한다. 백스토어(파일이나 블록 장치) → iSCSI 타깃(IQN) → TPG 아래의 LUN·ACL·포털 순서로 트리를 채우고, saveconfig 로 설정을 파일에 남긴다. ACL 은 "이 IQN 의 이니시에이터만 이 LUN 을 본다" 는 규칙이다. IQN 은 누구나 자기 것이라고 주장할 수 있는 이름이므로, 실제 운영에서는 CHAP 로 비밀값 확인을 더하고, 스토리지 트래픽을 별도 VLAN 이나 전용 망에 둔다.
마운트 순서. 로컬 디스크는 부팅 초반에 있지만 iSCSI 디스크는 네트워크가 올라오고 로그인이 끝나야 생긴다. systemd.mount(5) 는 이 경우 fstab 옵션에 _netdev 를 붙이라고 설명한다. 파일시스템 종류만으로는 네트워크 장치인지 알 수 없기 때문이다. 이 옵션이 없으면 systemd 가 네트워크보다 먼저 마운트를 시도하고, 장치가 없어 기다리다 부팅이 느려지거나 멈춘다.
멀티패스. SAN 은 대개 경로를 둘 이상 둔다. 서버의 NIC 두 장이 서로 다른 스위치를 거쳐 스토리지의 컨트롤러 두 개에 닿는다. 그러면 같은 LUN 이 서버에 /dev/sdb 와 /dev/sdc 두 번 보인다. 두 장치에 따로 파일시스템을 마운트하면 같은 디스크에 두 곳에서 쓰는 셈이라 데이터가 망가진다. dm-multipath 는 두 장치가 같은 LUN(같은 WWID)임을 알아보고 하나의 /dev/mapper/mpathX 로 묶는다. 한 경로가 끊기면 다른 경로로 I/O 를 넘기고(failover), 설정에 따라 두 경로를 함께 쓰기도 한다. multipath -ll 이 경로마다 active·failed 상태를 보여 준다.
현장에서 만나는 모습
"재부팅했더니 서버가 emergency 셸에 멈췄다" 의 단골 원인이 _netdev 없는 iSCSI fstab 줄이다. 장치가 아직 없으니 마운트를 기다리다 시간이 초과되고, 그 마운트에 의존하는 서비스까지 줄줄이 멈춘다. 새 LUN 을 붙이는 작업 계획서에는 fstab 줄과 함께 "재부팅 후 자동 로그인·마운트 확인" 이 들어간다.
멀티패스 없이 경로가 둘인 LUN 을 쓰는 것도 흔한 사고다. lsblk 에 같은 크기 디스크가 두 개 보이면 멀티패스를 먼저 의심한다. 스토리지 팀이 "LUN 하나 드렸어요" 라고 했는데 디스크가 둘 보인다면 거의 확실하다. 그리고 멀티패스 장치는 /dev/sdX 가 아니라 /dev/mapper/ 아래 이름으로 쓴다.
증설 요청도 자주 온다. 스토리지에서 LUN 을 키워도 서버는 모른다. SCSI 장치를 다시 읽게(rescan) 하고, 멀티패스라면 맵 크기를 갱신하고, 그 위의 PV·LV·파일시스템을 차례로 늘린다. 앞 모듈에서 본 "층마다 따로 늘린다" 가 한 층 더 깊어진 것이다.
이 모듈 뒤에
이 모듈은 읽기와 퀴즈로 마치고, 손으로 해 보는 것은 다음 모듈에서 성능 측정과 함께 한다. 같은 VM 안에 LIO 타깃을 세워 LUN 을 내주고, 그 LUN 에 로그인해 _netdev 로 마운트한 뒤, 그 위에서 fio 로 I/O 를 잰다. 멀티패스는 경로가 하나뿐인 실습 환경에서는 흉내만 낼 수 있어 개념으로 다룬다.