OpenStack Nova 的存储管理

OpenStack Nova 创建出来的 instance 不是所有的类型都有存储的,比如 m1.tiny: Memory: 512MB, VCPUS: 1, Storage: 0GB, FlavorID: 1, Swap: 0MB, RXTX Quota: 0GB, RXTX Cap: 0MB 的存储就是 0,也就是说关闭 m1.tiny 类型的 instance 后所有数据都会丢失。OpenStack Nova 使用 nova-volume 服务来管理存储,可以把这种服务看成云计算时代的 USB,可以随时 attach 到 instance 上做额外存储,其实现和 Amazon 的 Elastic Block Storage (EBS) 不同,nova-volume 提供的是一种基于 Linux LVM 的 iSCSI 解决方案。

Nova-volume 需要一个单独的分区做 LVM,如果系统上没有多余的分区做 LVM 的话可以用一个文件来充当硬盘,当然这种方法只能自己测试玩玩,应用到生产环境最好还是用物理硬盘上的分区做 LVM.

新建一个文件来做 LVM:

# dd if=/dev/zero of=/home/vpsee/nova-volumes.img bs=1M seek=100000 count=0
# losetup -f nova-volumes.img

# losetup -a
/dev/loop0: [fb00]:24120015 (/home/vpsee/nova-volumes.img)

# vgcreate nova-volumes /dev/loop0
  No physical volume label read from /dev/loop0
  Physical volume "/dev/loop0" successfully created
  Volume group "nova-volumes" successfully created

# pvscan 
  PV /dev/sda5    VG node01         lvm2 [465.52 GiB / 48.00 MiB free]
  PV /dev/loop0   VG nova-volumes   lvm2 [97.65 GiB / 77.65 GiB free]
  Total: 2 [563.17 GiB] / in use: 2 [563.17 GiB] / in no VG: 0 [0   ]

默认情况下 iscsitarget 软件包安装后并没有自动启动,所以需要手动配置和启动 iscsitarget 服务:

# vi /etc/default/iscsitarget
ISCSITARGET_ENABLE=true

# service iscsitarget start
 * Starting iSCSI enterprise target service

新建一个大小为 10GB 的 volume,检查一下是否创建成功(available),并把刚创建的 volume 附加到正在运行的 instance 上,附加成功后再次检查 volume 的状态就变成 in-use 了:

# euca-create-volume -s 10 -z nova
VOLUME	vol-00000003	10	creating (mycloud, None, None, None)	2011-08-30T13:20:04Z

# euca-describe-volumes 
VOLUME	vol-00000003	 10		nova	available (mycloud, node01, None, None)	2011-08-30T13:20:04Z

# euca-describe-instances 
RESERVATION	r-i5927300	mycloud	default
INSTANCE	i-00000031	ami-00000006	172.16.39.224	172.16.39.224	running	mykey.priv (mycloud, node01)	0		m1.tiny	2011-08-26T07:12:57Z	nova		

# euca-attach-volume -i i-00000031 -d /dev/vdb vol-00000003
VOLUME	vol-00000003

# euca-describe-volumes 
VOLUME	vol-00000003	 10		nova	in-use (mycloud, node01, i-00000031[node01], /dev/vdb)	2011-08-30T13:20:04Z

如果想从运行的 instance 上卸载 volume 的话用 euca-detach-volume,卸载成功的话就会看到 volume 的状态又变回 available 了:

# euca-detach-volume vol-00000003
VOLUME	vol-00000003

# euca-describe-volumes 
VOLUME	vol-00000003	 10		nova	available (mycloud, node01, None, None)	2011-08-30T13:20:04Z

评论 (11 Comments)

  1. 呃,找不到留言板,所以只有留言在这里了。
    呃,有没有想过做一个类似于LNMP一件安装包的东西呢?我想,凭借你的技术,搞出来的东西一定很成熟。
    另外,看到你推出了代维服务,真的很厉害。

  2. @vpsee 请问Swift就只能用普通主机来做吗?
    我看到
    Hardware: OpenStack Object Storage specifically is designed to run on commodity hardware. At Rackspace, our storage servers are currently running fairly generic 4U servers with 24 2T SATA drives and 8 cores of processing power. RAID on the storage drives is not required and not recommended. Swift’s disk usage pattern is the worst case possible for RAID, and performance degrades very quickly using RAID 5 or 6.
    需要用存储的话,有啥推荐设备吗?存储一般都是raid的。。。难道后面用存储,性能就下降很多吗?

  3. @babo
    OpenStack Object Storage (Swift) 是分布式存储系统,本身就有扩展和容灾的能力,不需要 RAID 也不推荐 RAID.

  4. 这里举例是tiny的那种flavor,没有分配存储,但是我df了下发现还是有2G的空间,如果这种实例重启或者是关机了,里面的数据会丢失么?

  5. @aufemercury
    tiny 没有存储,small 开始有,关机后数据全部丢失。

  6. 也就是说实现关机或者重启后还要有数据的就要使用swift了是么?attach volume?

  7. @aufemercury
    需要 nova-volume.

  8. 尝试了通过Dashboard创建volume但是一直处于creating状态无法结束
    vgdisplay的结果是这样的
    — Volume group —
    VG Name nova-volume
    System ID
    Format lvm2
    Metadata Areas 1
    Metadata Sequence No 1
    VG Access read/write
    VG Status resizable
    MAX LV 0
    Cur LV 0
    Open LV 0
    Max PV 0
    Cur PV 1
    Act PV 1
    VG Size 648.93 GiB
    PE Size 4.00 MiB
    Total PE 166127
    Alloc PE / Size 0 / 0
    Free PE / Size 166127 / 648.93 GiB
    VG UUID KOYcny-JEVR-1Sbv-m3bJ-a9CP-wNIb-GEHwfS

    不知道问题出在哪里

  9. @vpsee
    或许和iscsitarget服务有关?

  10. 运行euca-describe-instances 
    提示UnknownError: An unknown error has occurred. Please try your request again.

  11. nova-volume和openstack-swift都是存储,有什么异同?

发表评论