LUN 是跨过网络而来的磁盘 — iSCSI 与多路径
一句话总结
iSCSI 把 SCSI 命令承载在 TCP 之上,把块设备送到网络对面。对服务器来说,它像本地磁盘一样显示为 /dev/sdX,但它下面是网络。因此会多出本地磁盘没有的三件事:挂载顺序(_netdev)、访问控制(ACL、CHAP)、路径冗余(多路径)。
为什么需要它
NFS 共享的是文件。服务器持有文件系统,客户端请求“请读这个文件”。但数据库或虚拟机管理程序(hypervisor)想要的不是文件,而是块设备。它们要自己创建文件系统,自己管理缓存和写入顺序。如果给每台服务器都插上磁盘,容量就被锁在服务器里。于是把磁盘集中到一处(存储设备),再从中切出一部分,以块的形式原样借给服务器,这种架构就是 SAN,而用以太网和 TCP 来承载它,就是 iSCSI。
工作原理
RFC 7143 定义的术语只有几个。
| 术语 | 含义 |
|---|---|
| 发起端(initiator) | 使用磁盘的一方,即服务器 |
| 目标端(target) | 提供磁盘的一方,即存储 |
| IQN | 双方的名称。格式为 iqn.<연-월>.<뒤집은 도메인>:<고유 이름>(占位符依次为年-月、倒写的域名、唯一名称) |
| 门户(portal) | 目标端监听的 IP 和端口。默认 3260/tcp |
| LUN | 目标端内部切出的一个逻辑磁盘 |
Linux 的发起端是 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-<번호>(占位符依次为门户地址、IQN、LUN 编号)这样的固定路径或文件系统 UUID 来指代。把节点记录中的 node.startup 设为 automatic,服务启动时就会自动登录。
Linux 内核里也包含目标端这一侧。它叫 LIO,用 targetcli 配置。按后端存储(backstore,文件或块设备)→ iSCSI 目标端(IQN)→ TPG 之下的 LUN、ACL、门户的顺序填充这棵树,再用 saveconfig 把配置保存到文件。ACL 是“只有这个 IQN 的发起端才能看到这个 LUN”的规则。IQN 是任何人都可以声称属于自己的名称,所以实际生产中要再加上 CHAP 口令校验,并把存储流量放在单独的 VLAN 或专用网络上。
挂载顺序。 本地磁盘在启动初期就存在,但 iSCSI 磁盘要等网络起来并完成登录之后才会出现。systemd.mount(5) 说明,这种情况下应在 fstab 选项中加上 _netdev,因为仅凭文件系统类型无法判断它是不是网络设备。没有这个选项,systemd 会在网络之前就尝试挂载,因设备不存在而一直等待,导致启动变慢甚至卡住。
多路径(multipath)。 SAN 通常设置两条以上路径。服务器的两块网卡经过不同的交换机,连到存储的两个控制器。这样同一个 LUN 会在服务器上以 /dev/sdb 和 /dev/sdc 出现两次。如果在这两个设备上分别挂载文件系统,就等于从两处写同一块磁盘,数据会被破坏。dm-multipath 会识别出两个设备是同一个 LUN(同一个 WWID),并把它们合并成一个 /dev/mapper/mpathX。一条路径中断时,它会把 I/O 切到另一条路径(failover),也可以按配置同时使用两条路径。multipath -ll 会显示每条路径的 active、failed 状态。
在现场相遇的样子
“重启后服务器卡在 emergency shell”的常见原因,就是没有 _netdev 的 iSCSI fstab 行。设备还不存在,所以一直等待挂载直到超时,依赖这个挂载的服务也接连停住。添加新 LUN 的作业计划书里,除了 fstab 行,还会写上“确认重启后自动登录并自动挂载”。
没有多路径却使用有两条路径的 LUN,也是常见的事故。如果 lsblk 中出现两块大小相同的磁盘,首先要怀疑多路径。如果存储团队说“已经给了一个 LUN”,而你看到的却是两块磁盘,那几乎可以确定就是这样。另外,多路径设备要用 /dev/mapper/ 下的名称,而不是 /dev/sdX。
扩容请求也经常出现。在存储上把 LUN 调大,服务器并不知道。需要让 SCSI 设备重新读取(rescan),如果是多路径,还要更新映射大小,再依次扩展其上的 PV、LV 和文件系统。这是前面模块中看过的“逐层分别扩展”又深了一层。
本模块之后
本模块以阅读和测验结束,动手操作放到下一个模块,与性能测量一起完成。在同一台 VM 内搭建 LIO 目标端来提供 LUN,登录该 LUN 并用 _netdev 挂载,然后在其上用 fio 测量 I/O。多路径在只有一条路径的实验环境中只能模拟,所以作为概念讲解。