OpenStackCinder與各種後端存儲技術的集成敘述與實踐

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,本例只使用了一個。


view sourceprint?

01.dd if=/dev/zero of=/vol/cinder-volumes bs=1 count=0 seek=10G

02.# Mount the file.

03.loopdev=`losetup -f`

04.losetup $loopdev /vol/cinder-volumes

05.# Initialize as a physical volume.

06.pvcreate $loopdev

07.# Create the volume group.

08.vgcreate cinder-volumes $loopdev

09.# Verify the volume has been created correctly.

10.pvscan

建立好volume group後,使用cinder.conf的初始配置即可

重啓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卡方式:

一種方法:

view sourceprint?

1.$ lspci

2.20:00.0 Fibre Channel: Emulex Corporation Zephyr-X LightPulse Fibre Channel Host Adapter (rev 02)

3.20:00.1 Fibre Channel: Emulex Corporation Zephyr-X LightPulse Fibre Channel Host Adapter (rev 02

二種方法:


可以查看/sys/class/fc_host/

當有兩塊光纖網卡,則有host1 與host2兩個目錄

view sourceprint?

1.$ cat /sys/class/fc_host/host1/port_name

2.0x10000090fa1b825a wwpn (作用如同MAC地址)

b) 網卡通過光纖線連接到後端存儲上, 以ibm的svc爲例,必須保證連接上了,可以登錄svc圖形界面查看host是不是active的, 或者ssh登錄svc,運行命令

view sourceprint?

1.ww_2145:SVC:superuser>svcinfo lsfabric -delim ! -wwpn "10000090fa1b825a"

2. 

3.10000090FA1B825A!0A0C00!3!node_165008!500507680130DBEA!2!0A0500!active!x3560m4-06MFZF1!!Host

這樣才能保證做卷的掛載與卸載時沒有問題
下面是實踐,以Storwize設備爲例:

view sourceprint?

1.volume_driver = cinder.volume.drivers.storwize_svc.StorwizeSVCDriver

2.san_ip = 10.2.2.123

3.san_login = superuser

4.#san_pass<a class="keylink" href="http://www.it165.net/edu/ebg/" target="_blank">word</a> = passw0rd

5.san_private_key = /svc_rsa

6.storwize_svc_volpool_name = DS3524_DiskArray1

7.storwize_svc_connection_protocol = FC

san_password 與san_private_key可以二選一,推薦san_private_key 方式,這個私鑰文件用ssh-keygen生成,生成好留下私鑰, 把公鑰放到san設備上,以後其他host也想連接此存儲設備時, 可直接使用此私鑰, 不需重複生成。

測試過程,建個volume

view sourceprint?

1.[root@localhost ~]#  cinder create --display-name test55 1

2.[root@localhost ~]#  nova volume-list

3.+--------------------------------------+-----------+--------------+------+-------------+-------------+

4.| ID                                   | Status    | Display Name | Size | Volume Type | Attached to |

5.+--------------------------------------+-----------+--------------+------+-------------+-------------+

6.| 24f7e457-f71a-43ce-9ca6-4454fbcfa31f | available | test55       | 1    | None        |             |

7.+--------------------------------------+-----------+--------------+------+-------------+-------------+

用以下instance來進行attach掛載虛擬硬盤, 省了boot instance的過程~

view sourceprint?

01.[root@localhost ~]#  nova list

02.+--------------------------------------+-----------+--------------+------+-------------+-------------+

03.| 77d7293f-7a20-4f36-ac86-95f4c24b29ae | test2 | ACTIVE | -          | Running     | net_local=10.0.1.5 |

04.+--------------------------------------+-------+--------+------------+-------------+--------------------+

05.[root@localhost ~]# nova volume-attach 77d7293f-7a20-4f36-ac86-95f4c24b29ae 24f7e457-f71a-43ce-9ca6-4454fbcfa31f

06.+----------+--------------------------------------+

07.| Property | Value                                |

08.+----------+--------------------------------------+

09.| device   | /dev/vdb                             |

10.| id       | 24f7e457-f71a-43ce-9ca6-4454fbcfa31f |

11.| serverId | 77d7293f-7a20-4f36-ac86-95f4c24b29ae |

12.| volumeId | 24f7e457-f71a-43ce-9ca6-4454fbcfa31f |

13.+----------+--------------------------------------+

14.[root@localhost ~]# cinder list

15.+--------------------------------------+-----------+--------------+------+-------------+----------+--------------------------------------+

16.|                  ID                  |   Status  | Display Name | Size | Volume Type | Bootable |             Attached to              |

17.+--------------------------------------+-----------+--------------+------+-------------+----------+--------------------------------------+

18.| 24f7e457-f71a-43ce-9ca6-4454fbcfa31f |   in-use  |    test55    |  1   |     None    |  false   | 77d7293f-7a20-4f36-ac86-95f4c24b29ae |

19.+--------------------------------------+-----------+--------------+------+-------------+-------------+

3. iSCSI+SAN 設備  

這個是通過TCP/IP 協議來連接存儲設備的,只需要保證存儲服務節點能夠ping通san ip和計算機點能ping存儲設備上的iSCSI node ip即可。

以ibm的svc或者v7000爲例。
  與FC部分配置唯一的不同就是

view sourceprint?

1.storwize_svc_connection_protocol = FC ==》 storwize_svc_connection_protocol = iSCSI

測試過程同上,一切ok

4. 使用VMWARE

這個主要是使用vcenter來管理快存儲。cinder這個其實就是封裝了一層, 最終都是調用vcenter的存儲管理的功能。就像是一箇中轉一樣,修改cinder.conf中如下配置項

view sourceprint?

1.volume_driver = cinder.volume.drivers.vmware.vmdk.VMwareVcVmdkDriver

2.vmware_host_ip = $VCENTER_HOST_IP

3.vmware_host_username = $VCENTER_HOST_USERNAME

4.vmware_host_password = $VCENTER_HOST_PASSWORD

5.vmware_wsdl_location = $WSDL_LOCATION

6.# VIM Service WSDL Location

7.# 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的共享存儲

view sourceprint?

1.10.11.0.16:/var/volume_share

2.10.11.1.178:/var/volume_share

修改權限及用戶組

view sourceprint?

1.$ chmod 0640 /etc/cinder/share.txt

2.$ chown root:cinder /etc/cinder/share.txt

第三步:編輯/etc/cinder/cinder.conf

view sourceprint?

1.volume_driver=cinder.volume.drivers.nfs.NfsDriver

2.nfs_shares_config=/etc/cinder/shares.txt

3.nfs_mount_point_base=$state_path/mnt

重啓cinder-volume服務,ok了,測試過程和2一樣。

有一次變更環境,voluem-attach報了錯:

view sourceprint?

01.2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     connector)

02.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__

03.2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     six.reraise(self.type_, self.value, self.tb)

04.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 attach

05.2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     device_type=self['device_type'], encryption=encryption)

06.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_volume

07.2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     disk_dev)

08.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__

09.2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     six.reraise(self.type_, self.value, self.tb)

10.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_volume

11.2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     virt_dom.attachDeviceFlags(conf.to_xml(), flags)

12.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 doit

13.2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     result = proxy_call(self._autowrap, f, *args, **kwargs)

14.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_call

15.2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     rv = execute(f,*args,**kwargs)

16.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 tworker

17.2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     rv = meth(*args,**kwargs)

18.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 attachDeviceFlags

19.2014-06-12 11:41:58.659 19312 TRACE oslo.messaging.rpc.dispatcher     if ret == -1: raise libvirtError ('virDomainAttachDeviceFlags() failed', dom=self)

20.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

view sourceprint?

1.$ /usr/sbin/getsebool virt_use_nfs

如果是off,做以下設置

view sourceprint?

1.$ /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上察看存儲池狀態

view sourceprint?

1.[root@kvm-10-11-1-178 ~]# gluster peer probe 10.11.0.16

2.[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, 說多了,哈哈

view sourceprint?

1.[root@kvm-10-11-0-16 var]# mkdir data_cinder

2.[root@kvm-10-11-0-16 var]# mkdir data_cinder2

3.[root@kvm-10-11-1-178 var]# mkdir data_cinder

4.[root@kvm-10-11-1-178 var]# mkdir data_cinder2

5.[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 force

6.volume create: cfs: success: please start the volume to access data

注意:不要 gluster volume create cfs stripe 2 replica 2 10.11.0.16:/var/data_cinder2 10.11.0.16:/var/data_cinder 10.11.1.178:/var/data_cinder 10.11.1.178:/var/data_cinder2 force, 因爲前兩個是做RAID1, 在同一個節點上就起不到容災能力了。

4. start 存儲集羣
用法:$ gluster  volume start <NEW-VOLNAME>

view sourceprint?

01.[root@kvm-10-11-1-178 var]# gluster volume start cfs

02.volume start: cfs: success

03.[root@kvm-10-11-1-178 ~]# gluster volume info all

04. Volume Name: cfs

05.Type: Striped-Replicate

06.Volume ID: ac614af9-11b8-4ff3-98e6-fe8c3a2568b6

07.Status: Started

08.Number of Bricks: 1 x 2 x 2 = 4

09.Transport-type: tcp

10.Bricks:

11.Brick1: 10.11.0.16:/var/data_cinder2

12.Brick2: 10.11.1.178:/var/data_cinder

13.Brick3: 10.11.0.16:/var/data_cinder

14.Brick4: 10.11.1.178:/var/data_cinder2


第二步:client端,也就是cinder-volume service所在的節點,這端除了glusterfs-server包不用裝,其他都要裝上,這端就和nfs那些一樣了,保證服務啓動時會做好mount。

建立/etc/cinder/share.conf,內容如下, 告知可以被mount的集羣存儲


view sourceprint?

1.10.11.1.178:/cfs

修改權限及用戶組

view sourceprint?

1.$ chmod 0640 /etc/cinder/share.conf

2.$ chown root:cinder /etc/cinder/share.conf

cinder.conf 配置


view sourceprint?

1.glusterfs_shares_config = /etc/cinder/shares.conf

2.glusterfs_mount_point_base = /var/lib/cinder/volumes

3.volume_driver=cinder.volume.drivers.glusterfs.GlusterfsDriver


view sourceprint?

1.[root@chen ~]# for i in api scheduler volume; do sudo service openstack-cinder-${i} restart; done


view sourceprint?

1.[root@chen ~]# cinder create --display-name  chenxiao-glusterfs 1

2.[root@chen ~]# cinder list

3.+--------------------------------------+----------------+--------------------+------+-------------+----------+--------------------------------------+

4.|                  ID                  |     Status     |    Display Name    | Size | Volume Type | Bootable |             Attached to              |

5.+--------------------------------------+----------------+--------------------+------+-------------+----------+--------------------------------------+ 

6.| 866f7084-c624-4c11-a592-8c00fcabfb23 |   available    | chenxiao-glusterfs |  1   |     None    |  false   |                                      |

7.+--------------------------------------+----------------+--------------------+------+-------------+----------+--------------------------------------+

每個brick server上都有此存儲數據的分佈, 都爲512M, 只有1/2G 是因爲做個RAID0, 分佈在四處,總共有2G,是因爲做了RAID1,以其中一個爲例:

view sourceprint?

1.[root@kvm-10-11-1-178 data_cinder]# ls -al

2.總用量 20

3.drwxrwxr-x    3 root cinder      4096 6月  18 20:43 .

4.drwxr-xr-x.  27 root root        4096 6月  18 10:24 ..

5.drw-------  240 root root        4096 6月  18 20:39 .glusterfs

6.-rw-rw-rw-    2 root root   536870912 6月  18 20:39 volume-866f7084-c624-4c11-a592-8c00fcabfb23

boot個instance, 進行attach操作。

view sourceprint?

01.[root@chen data_cinder]# nova volume-attach f5b7527e-2ab8-424c-9842-653bd73e8f26 866f7084-c624-4c11-a592-8c00fcabfb23

02.+----------+--------------------------------------+

03.| Property | Value                                |

04.+----------+--------------------------------------+

05.| device   | /dev/vdd                             |

06.| id       | 866f7084-c624-4c11-a592-8c00fcabfb23 |

07.| serverId | f5b7527e-2ab8-424c-9842-653bd73e8f26 |

08.| volumeId | 866f7084-c624-4c11-a592-8c00fcabfb23 |

09.+----------+--------------------------------------+


view sourceprint?

1.[root@chen data_cinder]# cinder list

2.+--------------------------------------+----------------+--------------------+------+-------------+----------+--------------------------------------+

3.|                  ID                  |     Status     |    Display Name    | Size | Volume Type | Bootable |             Attached to              |

4.+--------------------------------------+----------------+--------------------+------+-------------+----------+--------------------------------------+

5.| 866f7084-c624-4c11-a592-8c00fcabfb23 |     in-use     | chenxiao-glusterfs |  1   |     None    |  false   | f5b7527e-2ab8-424c-9842-653bd73e8f26 |

6.+--------------------------------------+----------------+--------------------+------+-------------+----------+--------------------------------------+


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章