作者说明:
针对虚拟化中存储池的配置,笔者将书写一个系列作品,介绍从PowerVM到KVM再到Docker中存储池的配置与调优。似乎看起来三种技术没有什么关联性,但IT技术本质上实现原理一致的地方很多。理解了PowerVM,理解X86虚拟化不存在障碍,理解了Wpar,去理解docker的原理也不会太困难。
具体而言, 第一篇引用我在2013年的作品,介绍PowerVM中存储池的配置和调优,由于公众号字数限制,将分为三个子篇阐述。第二篇将讲述在KVM中,存储池的配置和调优。第三篇将讲述在Docker中,存储持久化层的配置和调优。
前言
在 PowerVM 的发展史上,Shared Storage Pool 并不是一个全新的概念。但是由于之前版本的 PowerVM 中 SSP 的功能不是十分强大,所以用的不是很多。相比之下,Storage Pool 使用的非常广泛,常见于各类配置手册中,由于命名类似,不少工程师将 Storage Pool 与 Shared Storage Pool 混淆。为了彻底解释清楚这两个技术的区别以及配置方法,本文在前面将会介绍 Storage Pool 的概念、配置方法以及 Storage Pool 和 Shared Storage Pool 的区别。
Storage Pool 的概念和管理
在介绍 Shard Storage Pool 之前,需要先讲一下 Storage Pool 的概念。
Storage Pool 是一个存储池的概念,它有两种实现方式,基于文件和基于卷组。Storage Pool 可以由 VIOS 上的本地 SAS 盘或者存储映射过来的存储 LUN 进行创建。在存储池中,通过创建虚拟盘(有瘦体和胖体两种,相关概念本文后续会有详细介绍),通过 VIOS 和 VIOC 之间创建的 VSCSI 通路,将虚拟盘映射给 VIOC,向 VIOC 提供系统盘或者数据盘。一个 Storage Pool 只能由一个 VIOS 管理,不能被多个 VIOS 管理。而不能被多个 VIOS 管理,这点是 Storage Pool 和 Shared Storage Pool 最大的区别之一。
基于卷组方式的 Storage Pool 实际上是创建一个卷组,然后在卷组中创建逻辑卷并且映射给 VIOC。在 VIOS 系统装完以后,rootvg 就是一个默认的存储池。
代码语言:javascript复制 $lssp
Pool Size(mb) Free(mb) Alloc Size(mb) BDs Type
rootvg 139776 114688 256 0 LVPOOL
代码语言:javascript复制 $lspv |grep -i rootvg
hdisk11 00f6b486cfe494d1 rootvg active
我们可以在这个存储池中创建虚拟盘,通过 VSCSI 的方式将其映射给 VIOC,作为 VIOC 的系统盘,有关具体的配置方法,本文后续会有详细说明。
常见的 VSCSI 高可用方案
在目前现有的 VSCSI 高可用方案中,通常有两种。一种是将一个存储的 LUN 映射给两个(多个)VIOS,然后两个(多个)VIOS 以 PV 的方式,将这个 LUN 映射给一个 VIOC,VIOC 则通过 MPIO,实现磁盘的路径聚合,从而实现 VSCSI 高可用。这种高可用的实现方式可以参照下示意图:
图 1.VSCSI 高可用方案 1
在上图的配置方式中,在 VIOC 上用 lspath 进行查看,可以看到一个磁盘对应多个 VSCSI 通路,例如:
代码语言:javascript复制 # lspath |grep -i hdisk0
Enabled hdisk0 vscsi0
Enabled hdisk0 vscsi1
默认情况下,磁盘 I/O 优先从 Vscsi 优先级高的 VSCSI 通路走(默认情况下两条路径优先级相同,都是 1)当一个 VIOS 出现问题,所有的磁盘 I/O 将会切换到第二个 VIOS 的 VSCSI 上,从而实现 VSCSI 的高可用。
如果打算用 Storage Pool 实现高可用,那么在两个 VIOS 上分别创建两个 Storage Pool(可以是 VIOS 本地盘或者存储磁盘),然后创建一个虚拟盘(可以基于 lv 或者文件,通常是基于 lv 的方式),映射给 VIOC,VIOC 通过镜像的方式,将两个 VIOS 影映射过来的两个虚拟盘做成镜像,以实现 VSCSI 高可用。)这种高可用的实现方式可以参照下面示意图:
图 2.VSCSI 高可用方案 2
在上图中,任意一个 VIOS 出现宕机,都只会是 VIOC 上的一个磁盘出现问题,由于 VIOC 端 hdisk 磁盘做了镜像,因此不会引起业务中断和数据丢失。
基于卷组的 Storage Pool
创建基于卷组的 Storage Pool 和在 VIOS 上直接创建一个 vg 达到的效果是相同的,命令行使用下面两者之一即可:
代码语言:javascript复制mkvg -vg weixinyuvgpool hdisk10
或者
代码语言:javascript复制mksp -f weixinyuvgpool hdisk10
$mksp -f weixinyuvgpool hdisk10
weixinyuvgpool
通过上面的命令,名为 weixinyu 的 storage pool 就创建成功了,里面有一块磁盘,hdisk10。
查看 storage pool,已经创建成功:
代码语言:javascript复制 $lssp
Pool Size(mb) Free(mb) Alloc Size(mb) BDs Type
rootvg 139776 88832 256 4 LVPOOL
weixinyuvgpool 139904 139904 128 0 LVPOOL
filestoragepool 1016 985 256 1 FBPOOL
weixinyu 244 243 256 0 FBPOOL
代码语言:javascript复制 $lspv |grep -i weixinyuvgpool
hdisk10 00f6b486cfe49436 weixinyuvgpool active
在默认的 rootvg storage pool 中创建一个 lv:
代码语言:javascript复制$mklv -lv lvtest1 rootvg 10G
lvtest1
确认被映射 VIOC 的 VSCSI 设备:
代码语言:javascript复制 $lsdev -vpd|grep vhost
vhost0 U8233.E8B.06B486P-V6-C11
Virtual SCSI Server Adapter
然后新创建将 lv 映射给 VIOC:
代码语言:javascript复制$mkvdev -vdev lvtest1 -vadapter vhost0 -devStoragePoolTestStoragePoolTestAvailable
在 VIOC 上用 cfgmgr 扫描后,可以识别到新增加的磁盘。
代码语言:javascript复制 # bootinfo -s hdisk4
10240
基于文件的 Storage Pool
基于文件的 Storage Pool 必须创建在基于一个卷组的父存储池之上。
创建基于文件的 storage pool 命令如下:
代码语言:javascript复制mksp -fb weixinyufilebase -sp rootvg -size 1000M
也可用通过 VIOS 上的 cfgassist 命令进行创建:
进行确认,名为 file base storage 的 storage pool 已经创建成功: $lssp Pool Size(mb) Free(mb) Alloc Size(mb) BDs Type rootvg 139776 100352 256 3 LVPOOL filestoragepool 1016 1015 256 0 FBPOOL 然后查看 rootvg 中的 lv 设备: $lsvg -lv rootvg |grep -i file filestoragepool jfs2 4 4 1 open/syncd /var/vio/storagepools/filestoragepool # df -g |grep -i filestoragepool /dev/filestoragepool 1.00 0.99 1% 4 1% /var/vio/storagepools/filestoragepool 可以看到,基于文件的存储池实际上是 rootvg 的一个文件系统。 下面,我们在基于文件的存储池中创建一个基于文件的虚拟盘,并且映射给 VIOC: $mkbdsp -sp filestoragepool 30m -bd weixinyufile1 -vadapter vhost0 Creating file "weixinyufile1" in storage pool "filestoragepool". Assigning file "weixinyufile1" as a backing device. vtscsi5 Available weixinyufile1 在 VIOS 上查看 VSCSI 映射关系: $lsmap -all |grep -i weixinyufile1 Backing device /var/vio/storagepools/filestoragepool/weixinyufile1 新创建的基于文件的虚拟盘,就是基于文件的 storage pool 中的一个文件: # cd /var/vio/storagepools/filestoragepool # ls -al total 61448 drwxr-xr-x 3 root system 256 Jan 14 19:24 . drwxr-xr-x 4 root staff 256 Jan 14 18:49 .. -rw-r--r-- 1 root staff 176 Jan 14 19:24 .weixinyufile1 drwxr-xr-x 2 root system 256 Jan 14 18:49 lost found -rw-r--r-- 1 root staff 31457280 Jan 14 19:24weixinyufile1
Storage Pool 简单的管理方法
Storage Pool 和虚拟盘的配置除了使用命令行的方式 , 还有比较简单的维护方法。如果仅仅是创建、查看、扩容、减小容量的话,可以使用 VIOS 中的 cfgassist 工具或者使用 HMC 管理。
我们先看一下 cfgassist 工具管理:
在 VIOS 上执行 cfgassist-Storage Pool。
在界面中,我们可以查看 Storage Pool 中的内容、创建 Storage Pool、修改 Storage Pool(增加或者减小 Storage Pool 的空间)。但需要注意的是,通过 cfgassist 工具,只能创建 Storage Pool,而不能创建“虚拟盘”。 第二个方法是,通过 HMC,对 Storage Pool 进行创建和配置。使用这个方法的好处是除了可以创建和维护 Storage Pool,还可以创建和映射虚拟盘: 首先登陆 HMC,选择一台装有 VIOS 的 Power 服务器,点击“虚拟资源”中的“虚拟存储器管理”
图 3.HMC 上的虚拟资源管理
在接下来的界面中,选择要创建 Storage Pool 的 VIOS(此处也说明一个 storage pool 只能基于一个 VIOS),点击“查询”:
图 4. 点击“查询”
我们可以看到已有的存储池,即 VIOS 上的 rootvg:
图 5. 查看存储池
接下来,点击“创建虚拟盘”,并且映射给 VIOC:
图 6.HMC 上创建虚拟盘
我们可以看到,创建虚拟盘的时候,我们除了可以看到默认的 Storage Pool,还可以看到 Shared Storage Pool(也就是说,在 SSP cluster 创建以后,后续的 SSP 的管理也可以由 HMC 界面进行管理)
图 7. 创建虚拟盘
我们选择 rootvg Storage Pool 中的空间,映射给 weixinyuvioc。点击“确认”
图 8. 创建虚拟盘
虚拟盘已经识别到,并且映射给了 weixinyuvioc1 分区:
图 9. 虚拟盘创建并且映射成功
从上图中可以看到,虚拟盘已经创建成功,并且映射给了指定的 VIOC。
在 VIOC 上执行 cfgmgr,可以扫描出现新创建的磁盘设备。