从PowerVM,KVM到Docker:存储池的配置与调优---第一篇(第1子篇)
作者说明:
针对虚拟化中存储池的配置,笔者将书写一个系列作品,介绍从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 就是一个默认的存储池。
$lssp
Pool Size(mb) Free(mb) Alloc Size(mb) BDs Type
rootvg 139776 114688 256 0 LVPOOL
$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 通路,例如:
# 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 达到的效果是相同的,命令行使用下面两者之一即可:
mkvg -vg weixinyuvgpool hdisk10
或者
mksp -f weixinyuvgpool hdisk10
$mksp -f weixinyuvgpool hdisk10
weixinyuvgpool
通过上面的命令,名为 weixinyu 的 storage pool 就创建成功了,里面有一块磁盘,hdisk10。
查看 storage pool,已经创建成功:
$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
$lspv |grep -i weixinyuvgpool
hdisk10 00f6b486cfe49436 weixinyuvgpool active
在默认的 rootvg storage pool 中创建一个 lv:
$mklv -lv lvtest1 rootvg 10G
lvtest1
确认被映射 VIOC 的 VSCSI 设备:
$lsdev -vpd|grep vhost
vhost0 U8233.E8B.06B486P-V6-C11
Virtual SCSI Server Adapter
然后新创建将 lv 映射给 VIOC:
$mkvdev -vdev lvtest1 -vadapter vhost0 -devStoragePoolTestStoragePoolTestAvailable
在 VIOC 上用 cfgmgr 扫描后,可以识别到新增加的磁盘。
# bootinfo -s hdisk4
10240
基于文件的 Storage Pool
基于文件的 Storage Pool 必须创建在基于一个卷组的父存储池之上。
创建基于文件的 storage pool 命令如下:
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,可以扫描出现新创建的磁盘设备。
- TensorFlow从0到1 - 6 - 解锁梯度下降算法
- linux下join命令的用法
- [编程经验] 我是如何半自动抓取素材公社图片的
- linux 便捷使用防火墙控制端口访问
- 洛谷 P3802 小魔女帕琪
- 【前沿】见人识面,TensorFlow实现人脸性别/年龄识别
- TensorFlow从0到1 - 1 - Hello, TensorFlow!
- iOS自动布局——Masonry详解
- BZOJ 3450: Tyvj1952 Easy
- [编程经验] TensorFlow实现线性支持向量机SVM
- TensorFlow从0到1 - 2 - TensorFlow核心编程
- BZOJ 4318: OSU!
- 讨厌算法的程序员 5 - 合并算法
- 洛谷 P2679 子串
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 排障集锦:九九八十一难之第十四难!------------- 安装magent时make编译报错
- 【Rust日报】2020-09-06 Evil_DLL 用来测试注入方法的DLL
- 【Rust日报】2020-09-05 微软在c++静态分析工具实现了一些rust的安全规则
- 一起来玩玩WebGL
- 自研网关:多项目的swagger聚合功能
- Prometheus 如何做到“活学活用”,大牛总结的避坑指南
- 文档驱动 —— 表单组件(一):表单元素组件 优点缺点选择文本类的Inputcheck 多选value的类型问题
- Vue3.0源码结构分析
- 【每周一库】- cached - 缓存结构型、辅助函数记忆化
- meta生成器 —— 表单元素组件 meta表单代码meta的模板data变幻
- 不用写代码也能做表单 —— 加载meta即可 菜单表单加载json运行效果。ModelAbout
- 从0到1,手把手教你入门 etcd
- 数据结构:手把手带你了解 ”图“ 所有知识!(含DFS、BFS)
- 设计模式之单例模式
- AndroidStudio创建JNI 工程与调用