OpenStack选用哪种后端存储系统比较好?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenStack选用哪种后端存储系统比较好?相关的知识,希望对你有一定的参考价值。

和openstack融合度较好的就是ceph,国内大多数云环境都使用ceph作为openstack的唯一后端存储。国内使用ceph开发出分布式存储系统的厂商有深圳元核云、北京xsky等,性能都还不错的。 参考技术A

Cinder项目为管理快设备而生,它最重要的地方就是如何做到和各种存储后端就到完美适配,用好后端存储的功能,本文为Cinder 多种后端存储(LVM, FC+SAN, iSCSI+SAN, NFS, VMWARE, Glusterfs)的场景总结, 以防自己将来忘记,欢迎交流, 共同成长

1.LVM

开始OpenStack Cinder实践之旅的入门存储, cinder.conf 什么都不配,默认就是使用LVM, LVM的原理

先把分区用pvcreate做成物理卷, 再把多个物理卷做成一个卷组,然后创建volume的时候就通过lvcreate分配lvm逻辑卷。

做部署时,用dd在当前目录创建一个设定大小(本例中为10G)的文件(cinder-volumes),然后通过losetup命令把他影射为loop device(虚拟快设备),然后基于这个快设备建立逻辑卷, 然后就是建立vg, 建立vg的时候可以一次包含多个pv,本例只使用了一个。


dd if=/dev/zero of=/vol/cinder-volumes bs=1 count=0 seek=10G# Mount the file.loopdev=`losetup -f`losetup $loopdev /vol/cinder-volumes# Initialize as a physical volume.pvcreate $loopdev# Create the volume group.vgcreate cinder-volumes $loopdev# Verify the volume has been created correctly.pvscan

建立好volume group后,使用cinder.conf的初始配置即可,  注意多节点时要配置好iscsi_ip_address为提供存储服务节点的管理ip

重启cinder-volume服务

就可以进行正常的volume创建,挂载,卸载等等操作了

question1:LVM如何实现挂载?

创建很简单,通过lvcreate命令即可,挂载稍微复杂点, 先要把卷export为scsi存储目标设备(target,会有个lun ID),  然后通过linux scsi initiator软件实现到目标设备的连接,这里用到两个软件,scsi tagert管理软件(这个里面有多种如Tgt,Lio,Iet,ISERTgt,默认使用Tgt, 都是为装有SCSI initiator的操作系统提供块级scsi存储)与linux scsi initiator,所以两次操作分别对应命令为tgtadm与iscsiadm。

2. FC(Fibre Channel) +SAN 设备

要求:a) 计算节点所在的机器一定要有HBA卡(光纤网卡),
查看host上有无HBA卡方式:

一种方法:   

$ lspci20:00.0 Fibre Channel: Emulex Corporation Zephyr-X LightPulse Fibre Channel Host Adapter (rev 02)20:00.1 Fibre Channel: Emulex Corporation Zephyr-X LightPulse Fibre Channel Host Adapter (rev 02
二种方法:

可以查看/sys/class/fc_host/

当有两块光纤网卡,则有host1 与host2两个目录                   $ cat /sys/class/fc_host/host1/port_name0x10000090fa1b825a wwpn (作用如同MAC地址)
b) 网卡通过光纤线连接到后端存储上, 以ibm的svc为例,必须保证连接上了,可以登录svc图形界面查看host是不是active的, 或者ssh登录svc,运行命令
ww_2145:SVC:superuser>svcinfo lsfabric -delim ! -wwpn "10000090fa1b825a"10000090FA1B825A!0A0C00!3!node_165008!500507680130DBEA!2!0A0500!active!x3560m4-06MFZF1!!Host
这样才能保证做卷的挂载与卸载时没有问题
下面是实践,以Storwize设备为例:
volume_driver = cinder.volume.drivers.storwize_svc.StorwizeSVCDriversan_ip = 10.2.2.123san_login = superuser#san_password = passw0rdsan_private_key = /svc_rsastorwize_svc_volpool_name = DS3524_DiskArray1storwize_svc_connection_protocol = FC

san_password 与san_private_key可以二选一,推荐san_private_key 方式,这个私钥文件用ssh-keygen生成,生成好留下私钥, 把公钥放到san设备上,以后其他host也想连接此存储设备时, 可直接使用此私钥, 不需重复生成。

测试过程,建个volume

[root@localhost ~]#  cinder create --display-name test55 1[root@localhost ~]#  nova volume-list+--------------------------------------+-----------+--------------+------+-------------+-------------+| ID                                   | Status    | Display Name | Size | Volume Type | Attached to |+--------------------------------------+-----------+--------------+------+-------------+-------------+| 24f7e457-f71a-43ce-9ca6-4454fbcfa31f | available | test55       | 1    | None        |             |+--------------------------------------+-----------+--------------+------+-------------+-------------+
用以下instance来进行attach挂载虚拟硬盘, 省了boot instance的过程~
[root@localhost ~]#  nova list+--------------------------------------+-----------+--------------+------+-------------+-------------+| 77d7293f-7a20-4f36-ac86-95f4c24b29ae | test2 | ACTIVE | -          | Running     | net_local=10.0.1.5 |+--------------------------------------+-------+--------+------------+-------------+--------------------+[root@localhost ~]# nova volume-attach 77d7293f-7a20-4f36-ac86-95f4c24b29ae 24f7e457-f71a-43ce-9ca6-4454fbcfa31f+----------+--------------------------------------+| Property | Value                                |+----------+--------------------------------------+| device   | /dev/vdb                             || id       | 24f7e457-f71a-43ce-9ca6-4454fbcfa31f || serverId | 77d7293f-7a20-4f36-ac86-95f4c24b29ae || volumeId | 24f7e457-f71a-43ce-9ca6-4454fbcfa31f |+----------+--------------------------------------+[root@localhost ~]# cinder list+--------------------------------------+-----------+--------------+------+-------------+----------+--------------------------------------+|                  ID                  |   Status  | Display Name | Size | Volume Type | Bootable |             Attached to              |+--------------------------------------+-----------+--------------+------+-------------+----------+--------------------------------------+| 24f7e457-f71a-43ce-9ca6-4454fbcfa31f |   in-use  |    test55    |  1   |     None    |  false   | 77d7293f-7a20-4f36-ac86-95f4c24b29ae |+--------------------------------------+-----------+--------------+------+-------------+-------------+

3. iSCSI+SAN 设备   

这个是通过TCP/IP 协议来连接存储设备的,只需要保证存储服务节点能够ping通san ip和计算机点能ping存储设备上的iSCSI node ip即可。

以ibm的svc或者v7000为例。
与FC部分配置唯一的不同就是
storwize_svc_connection_protocol = FC ==》 storwize_svc_connection_protocol = iSCSI
测试过程同上,一切ok

4. 使用VMWARE

这个主要是使用vcenter来管理快存储。cinder这个其实就是封装了一层, 最终都是调用vcenter的存储管理的功能。就像是一个中转一样,修改cinder.conf中如下配置项

volume_driver = cinder.volume.drivers.vmware.vmdk.VMwareVcVmdkDrivervmware_host_ip = $VCENTER_HOST_IPvmware_host_username = $VCENTER_HOST_USERNAMEvmware_host_password = $VCENTER_HOST_PASSWORDvmware_wsdl_location = $WSDL_LOCATION# VIM Service WSDL Location# example, 'file:///home/SDK5.5/SDK/vsphere-ws/wsdl/vim25/vimService.wsdl

测试过程同2,一切即ok。

5.NFS

非常普遍的一种网络文件系统,原理可google,直接开始cinder中的实践  

第一步: 规划好NFS存储server端, 分别分布在那些节点,那些目录,这里在两个节点做规划,作为nfs server端,10.11.0.16:/var/volume_share和10.11.1.178:/var/volume_share,在这两台机器上建好目录/var/volume_share, 并export为nfs存储,在两个节点上启动nfs服务


第二步:建立/etc/cinder/share.txt,内容如下, 告知可以被mount的共享存储            10.11.0.16:/var/volume_share10.11.1.178:/var/volume_share
修改权限及用户组              $ chmod 0640 /etc/cinder/share.txt$ chown root:cinder /etc/cinder/share.txt
第三步:编辑/etc/cinder/cinder.conf              volume_driver=cinder.volume.drivers.nfs.NfsDrivernfs_shares_config=/etc/cinder/shares.txtnfs_mount_point_base=$state_path/mnt
重启cinder-volume服务,ok了,测试过程和2一样。

有一次变更环境,voluem-attach报了错:
2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     connector)2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher   File "/usr/lib/python2.6/site-packages/nova/openstack/common/excutils.py", line 68, in __exit__2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     six.reraise(self.type_, self.value, self.tb)2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher   File "/usr/lib/python2.6/site-packages/nova/virt/block_device.py", line 239, in attach2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     device_type=self['device_type'], encryption=encryption)2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher   File "/usr/lib/python2.6/site-packages/nova/virt/libvirt/driver.py", line 1263, in attach_volume2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     disk_dev)2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher   File "/usr/lib/python2.6/site-packages/nova/openstack/common/excutils.py", line 68, in __exit__2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     six.reraise(self.type_, self.value, self.tb)2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher   File "/usr/lib/python2.6/site-packages/nova/virt/libvirt/driver.py", line 1250, in attach_volume2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     virt_dom.attachDeviceFlags(conf.to_xml(), flags)2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher   File "/usr/lib/python2.6/site-packages/eventlet/tpool.py", line 179, in doit2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     result = proxy_call(self._autowrap, f, *args, **kwargs)2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher   File "/usr/lib/python2.6/site-packages/eventlet/tpool.py", line 139, in proxy_call2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     rv = execute(f,*args,**kwargs)2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher   File "/usr/lib/python2.6/site-packages/eventlet/tpool.py", line 77, in tworker2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     rv = meth(*args,**kwargs)2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher   File "/usr/lib64/python2.6/site-packages/libvirt.py", line 419, in attachDeviceFlags2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     if ret == -1: raise libvirtError ('virDomainAttachDeviceFlags() failed', dom=self)2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher libvirtError: internal error unable to execute QEMU command '__com.redhat_drive_add': Device 'drive-virtio-disk1' could not be initialized

这个错来自libvirt,做以下设置即可,先察看virt_use_nfs是off还是on
$ /usr/sbin/getsebool virt_use_nfs
如果是off,做以下设置 
$ /usr/sbin/setsebool -P virt_use_nfs on

6.GlusterFS      

写这么多, 觉得这个是比较好的,难怪redhat会收购它, 有眼光啊,它为分布式文件系统,可扩展到几个PB数量级的集群文件系统。可以把多个不同类型的存储块通过Infiniband RDMA或者TCP/IP汇聚成一个大的并行网络文件系统。

简单总结自己体会到的它的两个特性
1.横向扩展能力强, 可以把不同节点的brick server组合起来,形成大的并行网络文件系统
2.可以做软RAID,通过条带技术[stripe] 和镜像卷[replica], 提高并发读写速度和容灾能力

下面提供一个cinder+glusterfs实践全过程, 穿插叙述glusterfs的优良特性的说明和使用

第一步:首先安装部署好gluterfs server环境:

本例中使用10.11.0.16和10.11.1.178作为连个节点,首先要在它们上装包

两种方式:yum源 or RPM 包

1:yum -y install glusterfs glusterfs-fuse glusterfs-server
2:去以下网址下载包, 例如http://download.gluster.org/pub/gluster/glusterfs/3.5/3.5.0/RHEL/epel-6.5/x86_64/
glusterfs-3.5.0-2.el6.x86_64.rpm         glusterfs-fuse-3.5.0-2.el6.x86_64.rpm    glusterfs-server-3.5.0-2.el6.x86_64.rpm
glusterfs-cli-3.5.0-2.el6.x86_64.rpm     glusterfs-libs-3.5.0-2.el6.x86_64.rpm  

我下载了3.5版本的,利用rpm的方式安装上。

装好之后,规划好多节点上的brick server,本例中将在10.11.1.178 和10.11.0.16上分别建立/var/data_cinder和/var/data_cinder2目录,并在10.11.1.178上建立存储集群cfs。

1.启动10.11.1.178和10.11.0.16上的glusterd服务

[root@chen ~]# /etc/init.d/glusterd start

2.在10.11.1.178上察看存储池状态
[root@kvm-10-11-1-178 ~]# gluster peer probe 10.11.0.16[root@kvm-10-11-1-178 ~]# gluster peer probe 10.11.1.178 #本地也可以不执行
3.创建存储集群
用法:$ gluster volume create <NEW-VOLNAME> [stripe <COUNT>] [replica <COUNT>] [transport <tcp|rdma|tcp,rdma>] <NEW-BRICK>?<vg_name>... [force]
stripe 条带,类似做RAID0, 提高读写性能的,
replica 顾名思义,镜像,类似于做RAID1, 数据会成镜像的写

stripe+ replica 可以做RAID10,此时stripe COUNT * replica  COUNT =brick-server  COUNT, 说多了,哈哈

[root@kvm-10-11-0-16 var]# mkdir data_cinder[root@kvm-10-11-0-16 var]# mkdir data_cinder2[root@kvm-10-11-1-178 var]# mkdir data_cinder[root@kvm-10-11-1-178 var]# mkdir data_cinder2[root@kvm-10-11-1-178 var]# gluster volume create cfs stripe 2 replica 2 10.11.0.16:/var/data_cinder2 10.11.1.178:/var/data_cinder 10.11.0.16:/var/data_cinder 10.11.1.178:/var/data_cinder2 forcevolume create: cfs: success: please start the volume to access data

openstack-ocata-镜像服务

一、  镜像服务概述
  镜像服务(glance)使用户能够发现、登记,并检索虚拟机镜像。它提供了一个REST API,使您可以查询虚拟机镜像元数据和检索一个实际的形象。可以存储虚拟机镜像通过镜像服务在不同的位置,从简单的像OpenStack对象存储的文件系统对象存储系统。
为简单起见,本指南描述了图像服务使用文件配置后端,上传并存储在控制器上的一个目录节点托管服务形象。默认情况下,这个目录是/var/lib/glance/images/. 在继续之前,确保控制器节点至少有几个gb的可用空间在这个目录中。记住,由于文件后端通常是本地控制器节点,它不是通常适用于多节点部署。 要求其他后端信息,请参阅配置参考。
  OpenStack形象服务中心“基础架构即服务”(IaaS)所示的概念架构。它接受API请求服务器磁盘或镜像,从终端用户和元数据定义或OpenStack计算组件。它还支持存储的磁盘或服务器图像在不同的存储库类型,包括OpenStack对象存储。 周期性过程运行在OpenStack镜像缓存服务支持。通过集群复制服务确保一致性和可用性。其他周期性过程包括审计、更新和收割。
  Openstack镜像服务包括以下组件:
  1. glance-api
    用于接收API的镜像发现,调用,检索,存储。
  2. glance-registry(镜像注册)
    用于镜像储存、处理、检索元数据。元数据包括大小和类型。
    (注册服务是内部openstack镜像服务使用的,不对外公开。)
  3. database
    用于存储镜像数据库,大多数部署使用mysql或SQLite。
  4. storage repository for image files(镜像文件存储库)
    支持各种存储库类型包括普通文件系统(或任何文件系统安装在glance-api控制器节点),对象存储,RADOS block devices(可靠的分布式存储系统 块存储),VMware存储和HTTP。请注意,某些存储库将只支持只读的用法。
  5. metadata definition service
    通用的API供应商、管理员、服务和用户有效地定义自己的自定义元数据。此元数据可用于不同类型的资源,比如images, artifacts, volumes, flavors, and aggregates。定义包括新属性的关键,描述,约束和它可以关联到的资源类型。
二、 安装和配置
  在控制节点上安装镜像,为了简单起见镜像存储在本地。
  1. 先决条件
    在安装和配置镜像服务之前,必须创建一个数据库、数据凭证、api端点。
    ① 创建数据库(mysql的root密码是centos)
      mysql -u root –p
      create database glance;
      创建用户glance并赋予其访问数据库glance的读写权限。
      grant all privileges on glance.* to \'glance\'@\'localhost\' identified by \'glance\';
      grant all privileges on glance.* to \'glance\'@\'%\' identified by \'glance\';
    ② 运行刚才创建的.admin-openrc
      . admin-openrc
    ③ 要创建服务的凭证,完成以下步骤:
      创建glance 用户:
        openstack user create --domain default --password-prompt glance

        

      增加admin 角色到glance用户和service 项目:
        openstack role add --project service --user glance admin
      创建glance服务实体
        openstack service create --name glance --description "Openstack Image" image

         

    ④  创建镜像服务API端点:
      openstack endpoint create --region RegionOne image public http://controller:9292

      

     openstack endpoint create --region RegionOne image internal http://controller:9292

      

      openstack endpoint create --region RegionOne image admin http://controller:9292

      

  2. 安装和配置完成
    ① 安装openstack-glance
      yum install openstack-glance
    ② 编辑/etc/glance/glance-api.conf配置文件:
      在[database]下添加connection
        connect = mysql+pymysql://glance:glance@controller/glance
      在[keystone_authtoken] 和 [paste_deploy]下配置身份服务访问(修改及添加):
        [keystone_authtoken]
        auth_uri = http://controller:5000
        auth_url = http://controller:35357
        memcached_servers = controller:11211
        auth_type = password
        project_domain_name = default
        user_domain_name = default
        project_name = service
        username = glance
        password = glance
        [paste_deploy]
        flavor = keystone

      在[glance_store]配置本地文件系统存储和镜像文件位置:
        [glance_store]
        stores = file,http
        default_store = file
        filesystem_store_datadir = /var/lib/glance/images/
    ③ 编辑/etc/glance/glance-registry.conf文件:
      在[database]配置数据库访问:
      connection =mysql+pymysql://glance:GLANCE_DBPASS@controller/glance
      在[keystone_authtoken] 和 [paste_deploy]下配置身份服务访问(修改及添加):
        [keystone_authtoken]
        auth_uri = http://controller:5000
        auth_url = http://controller:35357
        memcached_servers = controller:11211
        auth_type = password
        project_domain_name = default
        user_domain_name = default
        project_name = service
        username = glance
        password = glance

        [paste_deploy]
        flavor = keystone
    ④ 填充镜像服务数据库:
      Su –s /bin/sh –c “glance-manage db_sync” glance (忽略任何输出内容)

        3. 完成安装

    启动镜像服务和设置开机启动:
    systemctl enable openstack-glance-api.service openstack-glance-registry.service
    systemctl start openstack-glance-api.service openstack-glance-registry.service
三、 校验操作
  使用CirrOS验证操作镜像的服务,一个小Linux映像,可以帮助你测试你的OpenStack部署。
  在控制节点上执行以下操作。
    1. 源admin环境配置
      . admin-openrc
    2. 下载源镜像
      wget http://download.cirros-cloud.net/0.3.5/cirros-0.3.5-x86_64-disk.img
    3. 上传镜像到镜像服务器使用QCOW2磁盘格式,bare容器格式,公共可见 所有的项目都可以访问。
      (cirros-0.3.5-x86_64-disk.img要在执行命令当前目录下)
      openstack image create "cirros" --file cirros-0.3.5-x86_64-disk.img --disk-format qcow2 --container-format bare --public

      

    4. 验证镜像是否上传成功
      openstack image list

      

  镜像服务安装完成!

以上是关于OpenStack选用哪种后端存储系统比较好?的主要内容,如果未能解决你的问题,请参考以下文章

Openstack Cinder使用NetApp NFS作为后端存储

Ceph 基础知识和基础架构认识

Linux里面ceph是啥?

Openstack使用NFS作为后端存储

openstack学习-理解存储管理

openstack中nfs最为nova的后端存储