重温 RAID

1987年 UC Berkeley 的几个人发明了 RAID 这个词。在他们 1988年的论文里,提出了 5种 RAID 。其实在他们论文之前就有专利或者产品已经实现了他们的说法。之后 RAID 的正式名称就是代表: Redundant Array of Independent Disks。

RAID 提供的冗余,说白了很简单,就是提供一个多余的磁盘,写一个校验位,最简单的办法就是 XOR ,但是对于 RAID6 (采用两个分开的校验位) 而言,需要采用 Galois field 或者 Reed–Solomon error correction

RAID 的冗余标准目前由 Storage Networking Industry Association (SNIA) 定义。

1. RAID 0 就是纯粹的条带化,没有提供冗余,优点就是吞吐率通过磁盘数量倍增。
2. RAID 1就是镜像,没有条带,没有校验。读性能有提升,但是写性能有下降。
3. RAID 2:根据比特位条带化,采用汉明编码做校验,放到指定的磁盘上,过去使用比较多,现在已经没有使用的了。
4. RAID 3: 根据字节条带化,把校验位写到指定的磁盘,属于不常用的方法了。
5. RAID 4: 基于块做条带,并写到指定的校验盘,之前 NetApp 有较多采用这个技术,但是现在被专有的 RAID-DP 技术取代, DP 就是Double Parity。
6. RAID 5: 基于数据块条带化,并把校验位分布到不同的磁盘上,RAID 5 的实现需要至少3块磁盘,如果一块磁盘损坏,后面的数据读写需要到剩下的磁盘整盘读写才可以,因此磁盘的重构,会造成性能下降,甚至导致原先正常的磁盘损坏掉。2012年8月,Dell 提出避免使用 RAID 5 的建议,而是使用 RAID 50。
7. RAID 6:基于数据块的条带化,采用两份分布的校验,可以容忍两个磁盘同时损坏,至少需要 4块磁盘。

嵌套 RAID 技术:(中间的加号可以去掉)
1. RAID 0 + 1:先条带再镜像,问题是如果有磁盘损坏,系统就变成了 RAID 0,重建窗口会很长。
2. RAID 1 + 0:从已经镜像的磁盘创建条带。

其他值得一提的 RAID Z,就是 ZFS 实现的方式在 Solaris ZFS上非常靠谱,有时间细写。



NAS 系统两种主要的协议:CIFS,NFS

昨天解释 《ZeroConf,服务自发现介绍》时,提到了微软的 SMB(Server Message Block)服务,而实际上 CIFS(Common Internet File System)就是 SMB 的改进版本。Windows 里面的文件共享其实就是使用了 SMB或者说 CIFS。
CIFS 是 SMB 的另一个说法(方言)而已。

SMB 主流的版本有: 2.0/2.1/3.0/3.0.2/3.1.1 ,昨天的文章讲到 NetBIOS 名称解析使用 UDP 的 137/138,或者 TCP 的 137/139 端口,SMB 实际上在传输层直接使用 TCP 445 端口,无需开启其他端口。

1983年 IBM 的 Barry Feigenbaum  设计了 SMB,主要目的是把 DOS 21h 中断的本地文件存取转换为网络文件系统。微软后来做了比较大的修改,把 SMB 协议和 LAN Manager 产品(1990年和 3COM 一起用于开发 OS/2),合并发布到 1992年的 Windows for Workgroups

Windows 2003以及旧的 NAS 设备采用 SMB1/CIFS,这个版本的协议非常低效,导致了后面出现了 WAN 加速器产品,著名的公司有: Riverbed, SIlver Peak, Cisco。1996年, Sun 公司发布了 WebNFS,同年,微软把 SMB 改名为 CIFS,并支持软连接,硬链接,更大的文件长度,支持直接使用 445端口通信,而无需 NetBIOS。

2006年,微软发布 Windows Vista,同时更新了 SMB 到 2.0 版本。Samba 3.6 开始完全只是 SMB2。苹果也把原先的 Apple Filling Protocal 移植到了 SMB2,后来采用并放弃了 Samba,用了自己的 SMBX。

SMB2.1 在 Windows 7 和 Server 2008R2 上启用,做了一些性能改进,引入了加锁机制。 SMB3.0(原先名称为 SMB2.2)从 Windows 8和 Server 2012 开始引入,大大加强了性能和功能,特别是在虚拟数据中心情形下。 SMB3.0.2是在 Windows 8.1 和 Server 2012R2 上开始引入的,可以禁用安全问题频发的 SMB1。 SMB3.1.1从 Windows 10 和 Server 2016开始引入,支持 AES 128 GCM 加密,实现了预认证机制,并强制安全握手。

SMB/CIFS 主要实现的技术产品:
1. Samba:1991年, Andrew Tridgell 开始设计 Samba,采用逆向工程实现 SMB/CIFS。成为风靡非 Windows 系统的 SMB 客户端和服务端,实现和 Windows 平台的互操作。从 2003年, Samba 3 开始, Samba 提供了文件和打印机服务可以和 Windows NT 4.0 域整合的功能,可以作为 PDC。 Samba 4 可以作为活动目录的域控制器或成员服务器。
2. NQ:一家以色列公司提供的 SMB 客户端和服务端的实现。
3. MoSMB:仅仅提供 SMB2.x 和 SMB3.x 的 Linux/Unix 实现,专有软件
4. Tuxera SMB:支持到 SMB3.1.1,可以通过内核或者用户态实现,专有软件
5. Likewise:2012年被 EMC Isilon 收购,用于 NAS 网关,NAS 缓冲的安全存取
6. CIFSD:开源的 SMB 内核实现方式

下面来讲一下 WebDAV(Web Distributed Authoring and Versioning
目的就是通过 http 协议,实现 Web 发布的版本管理,或者说,直接通过 Web 写作。主要的就是基于 HTTP 的扩展,实现了 COPY/LOCK/MKCOL/MOVE/PROPFIND/PROPPATCH/UNLOCK 等动词。大多数流行的 Web 服务器都支持 WebDAV ,例如 Apache/IIS/Nginx/lighttpd 等,客户端的支持有: git, Linux 上有 Gvfs/KIO等, macOS 有CalDAV/CardDAV,Windows自带的 Explorer 以及 微软 Office。

接下来讲一下 NFS,这个在 NAS 产品以及现代 Linux 环境里面经常用到,也是经常遇到问题的 网络文件系统。

NFS 最早由 Sun 公司于 1984年开发,主要有 2,3,4三个版本。版本2最早于89年3月发布在 RFC 1094 上,通过 UDP 实现虚拟文件系统,可以用于 DOSVAX/VMS,受限于 32位操作系统,只能读取最多 2GB 的文件。
NFSv3,发布于 1995年6月, RFC1813,增加了 64位的支持,支持异步写,增加了 TCP支持, 使得 NFS 在 WAN 网络环境下更加可靠,并允许数据包的传送长度不再受限于 UDP的 8KB。

NFSv4,发布于2000年12月 RFC3010,并于 2013年 4月修改到 RFC3530,再于 2015年3月修改到 RFC 7530。受 AFS(Andrew File System)以及 SMB 的影响,提升了性能,加强了安全特性。 v4.1提供了集群服务器部署并行存取,v4.2 发布于 2016年12月,提供了服务器端克隆,稀疏文件,空间保留,应用数据块(Application Data Block),以及 sec_label 标签,增加了两个新的 pNFS 操作。v4 相比于之前版本最大的优势在于只需要一个 IP 端口: 2049。

本来想扯一下 iSCSI 的, 那个是属于 SAN 的协议,且听下回分解。

NAS 的硬件厂商就不写了, 但是软件的必须提一下 FreeNAS,有兴趣的可以自己研究一下 FreeNAS。