1 云主机使用网络存储 io 流程
对于一个云服务环境,大致会有网络节点,存储节点,计算节点,控制节点,其中虚拟云主机在计算节点工作,而虚拟云主机(qemu 虚机)使用的存储一般通过 ceph,drbd,mulitpch,iscsi 使其在存储节点存储。
(1)计算节点云主机访问本地 /dev/vda,/dev/vdb … 块设备,实际访问的是 dm-mulitpath 管理的计算节点的 /dev/dm-0…1,2,3 设备。
/dev/vda
-> virtio_blk
-> virtio_pci
-> 虚拟主机(qemu vhost)
-> 本地节点 tcm_vhost
-> target_core_mod
-> target_core_iblock/target_core_pscsi
-> 计算节点 /dev/dm-0
(2)/dev/dm-0 实际由 iscsi 客户端管理的 /dev/sda 和 /dev/sdb 聚合而成,可实现故障路径切换,io 负载均衡等能力,实际 io 数据会通过 iscsi_tcp(如果是 fc 服务,则是走光纤通道)到达存储节点的 /dev/drbd0。如果主路径故障,通路不同则会由 multipath 切换到备用路径(这里是/dev/sdb),等待恢复后切换回主路径(回到/dev/sda)。这里假设走的主路径:
/dev/dm-0
-> /dev/sda
-> iscsi_tcp/fc
-> 到达存储节点 iscsi_target_mod/tcm_fc
-> target_core_mod
-> target_core_iblock/target_core_pscsi
-> /dev/drbd0 (drbd 模块)
(3)存储节点的/dev/drbd0由 drbd 内核模块配置,实现块数据拷贝同步到后端存储设备。后端存储设备为/dev/alcache0,该设备实际是一块高速 SSD 设备(如 nvme),实现数据的高速缓存。
(4)/dev/alcache0由 bcache 配置管理,实际对应后端存储为/dev/rbd0。bcache 实现将 nvme 作为高速缓存将数据同步到 /dev/rbd0 中。
(5)/dev/rbd0 设备由 ceph rbd 管理,该模块提供了分布式存储管理能力,如 io 调度等,通过 rbd,数据 io 会实际到达 HHD 等大容量存储设备。
/dev/rbd0
-> rbd 模块(ceph 网络协议转发数据)
-> ceph rbd 管理(分布式存储管理实际物理磁盘)
2 multipath 介绍
可以看到上述路径中在计算节点使用了 mutlipath 聚合路径来实现负载均衡和路径切换等。
用户态工具相关:
启动脚本
/usr/lib/systemd/system/multipathd.service
udev 命令规则
/usr/lib/udev/rules.d/11-dm-mpath.rules
/usr/lib/udev/rules.d/62-multipath.rules
用户工具
/usr/sbin/multipathd 守护进程,监听系统中路径状态的变化,并做相应的处理。
/usr/sbin/mpathpersist SCSI PR命令工具,主要用于隔离。
/usr/sbin/mpathconf 修改多路径配置
/usr/sbin/kpartx DeviceMapper虚拟设备创建工具
/usr/sbin/multipath 多路径命令工具
查看 device mapper 映射表
[wings-client@fedora sections]$ sudo dmsetup table
mpatha: 0 41940992 multipath 1 queue_if_no_path 1 alua 1 1 service-time 0 2 2 8:0 1 1 8:16 1 1
[wings-client@fedora sections]$ ll /dev/sd*
brw-rw----. 1 root disk 8, 0 10月16日 15:29 /dev/sda
brw-rw----. 1 root disk 8, 16 10月16日 15:29 /dev/sdb
查看被映射的多路径设备
[wings-client@fedora sections]$ ll /dev/dm-*
brw-rw----. 1 root disk 253, 0 10月16日 15:29 /dev/dm-0
[wings-client@fedora sections]$
多路径创建的 dm 设备的主设备号都是 253。
查看设备的 wwid
[wings-client@fedora sections]$ lsscsi -i
[0:0:0:0] cd/dvd QEMU QEMU DVD-ROM 2.5+ /dev/sr0 -
[6:0:0:0] disk LIO-ORG block1 4.0 /dev/sdb 3600140554012e51273044299221f2903
[7:0:0:0] disk LIO-ORG block1 4.0 /dev/sda 3600140554012e51273044299221f2903
[wings-client@fedora sections]$
同一个设备的两条路径,以及被映射的新设备的 wwid 相同
查看当前多路径信息
[wings-client@fedora sections]$ sudo multipath -ll
mpatha (3600140554012e51273044299221f2903) dm-0 LIO-ORG,block1
size=20G features='1 queue_if_no_path' hwhandler='1 alua' wp=rw
`-+- policy='service-time 0' prio=50 status=active
|- 7:0:0:0 sda 8:0 active ready running
`- 6:0:0:0 sdb 8:16 active ready running
[wings-client@fedora sections]$
多路径软件读取/etc/multipath.conf文件,并根据 wwid 将相同设备聚合成一个虚拟设备。
内核中 dm-multipath 源码实现主要在linux/drivers/md/dm-*中。
dm-multipath 模块属于 md 模块的一个后端部分。
md 是多个设备的内核 RAID 实现,其中 dm 是设备映射器实现,允许将一个设备映射到另一个设备(一个或者多个)上,这可用作创建在/dev/mapper 目录中访问的虚拟设备(映射设备)。该设备的所有 IO 都将映射到其他设备。
RAID 控制器
RAID控制器是一种硬件设备或软件程序,用于管理计算机或存储阵列中的硬盘驱动器(HDD)/固态硬盘(SSD),以便它们能如逻辑部件一样工作,各施其职。RAID控制器的功能既可以由硬件也可以由软件来实现。硬件RAID一般用于处理大量数据的RAID模式。随着处理器的能力的不断增强,软件RAID功能已经成为可能,不过当处理大量数据时CPU仍然会显得力不从心。一般的中高档服务器多使用硬件RAID控制器,但是由于硬件RAID控制器的价格昂贵,导致系统成本大大增加。而随着处理器的性能快速发展,使得软件RAID的解决方法得到人们的重视。在这里,我们使用的是软件RAID。
在Linux系统中目前以MD (Multiple Devices)虚拟块设备的方式实现软件RAID,利用多个底层的块设备虚拟出一个新的虚拟块设备,并且利用条带化(stripping)技术将数据块均匀分布到多个磁盘上来提高虚拟设备的读写性能,利用不同的数据冗余算法来保护用户数据不会因为某个块设备的故障而完全丢失,而且还能在设备被替换后将丢失的数据恢复到新的设备上。
MD (Multiple Devices)框架
Multiple Devices虚拟块设备(利用底层多个块设备虚拟出一个新的虚拟块设备)。目前MD支持linear, multipath, raid0 (stripping), raid1 (mirror), raid4, raid5, raid6, raid10等不同的冗余级别和组成方式,当然也能支持多个RAID阵列的层叠组成raid1+0, raid5+1等类型的阵列。
dm 整体框架大致如下:

这里主要关心 multipath 部分。
内核选中 DM_MULTIPATH 即可启用 multipath 相关内核支持。
DM_MULTIPATH_QL 和 DM_MULTIPATH_ST 为两种可选的路径选择算法。
dm-mpath.c是多路径驱动的核心,负责初始化相关数据结构,以及向 mapping/target interface 注册 dm 的 target type 回调。
dm-selector.c是负责管理路径选择算法的苦函数。
dm-round-robin.c是必备的路径选择算法:在一条路径上完成指定的 IO 次数后就切换到下一条路径,不断循环。
另外两种是可选算法,见上述 Kconfig:
1)dm-service-time.c算法:根据路径的吞吐量以及完成的字节数选择负载较轻的路径。
2)dm-queue-length.c算法:根据正在处理的 IO 个数较少的路径。
dm-mapth.c核心:
/*-----------------------------------------------------------------
* Module setup
*---------------------------------------------------------------*/
static struct

本文介绍了云主机使用网络存储的IO流程,包括计算节点云主机访问块设备,数据通过iscsi等到达存储节点,经多层配置最终到达大容量存储设备。还详细介绍了multipath,包括用户态工具、内核实现、路径选择算法等,以及Linux系统中软件RAID的相关内容。
最低0.47元/天 解锁文章
5463

被折叠的 条评论
为什么被折叠?



