OpenStack Cinder與各種後端儲存技術的整合敘述與實踐
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,本例只使用了一個。
01.
dd
if
=/dev/zero of=/vol/cinder-volumes bs=
1
count=
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卡方式:
一種方法:
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兩個目錄
1.
$ cat /sys/
class
/fc_host/host1/port_name
2.
0x10000090fa1b825a
wwpn (作用如同MAC地址)
b)
網路卡透過光纖線連線到後端儲存上, 以ibm的svc為例,必須保證連線上了,可以登入svc圖形介面檢視host是不是active的, 或者ssh登入svc,執行命令
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裝置為例:
1.
volume_driver = cinder.volume.drivers.storwize_svc.StorwizeSVCDriver
2.
san_ip =
10.2
.
2.123
3.
san_login = superuser
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 - key gen生成,生成好留下私鑰, 把公鑰放到san裝置上,以後其他host也想連線此儲存裝置時, 可直接使用此私鑰, 不需重複生成。
測試過程,建個volume
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的過程~
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部分配置唯一的不同就是
1.
storwize_svc_connection_protocol = FC ==》 storwize_svc_connection_protocol = iSCSI
測試過程同上,一切ok
4. 使用VMWARE
這個主要是使用vcenter來管理快儲存。cinder這個其實就是封裝了一層, 最終都是呼叫vcenter的儲存管理的功能。就像是一箇中轉一樣,修改cinder.conf中如下配置項
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的共享儲存
1.
10.11
.
0.16
:/var/volume_share
2.
10.11
.
1.178
:/var/volume_share
修改許可權及使用者組
1.
$ chmod
0640
/etc/cinder/share.txt
2.
$ chown root:cinder /etc/cinder/share.txt
第三步:編輯/etc/cinder/cinder.conf
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報了錯:
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
如果是off,做以下設定
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:去以下網址下載包, 例如
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上察看儲存池狀態
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, 說多了,哈哈
2.
[root
@kvm
-
10
-
11
-
-
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>
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的叢集儲存
1.
10.11
.
1.178
:/cfs
修改許可權及使用者組
1.
$ chmod
0640
/etc/cinder/share.conf
2.
$ chown root:cinder /etc/cinder/share.conf
cinder.conf 配置
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
1.
[root
@chen
~]#
for
i in api scheduler volume;
do
sudo service openstack-cinder-${i} restart; done
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,以其中一個為例:
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操作。
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.
+----------+--------------------------------------+
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.
+--------------------------------------+----------------+--------------------+------+-------------+----------+--------------------------------------+
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9950964/viewspace-2640796/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- OpenStack Cinder元件支援的塊儲存裝置表元件
- 大資料開發的儲存技術探索與實踐大資料
- 後端技術雜談4:Elasticsearch與solr入門實踐後端ElasticsearchSolr
- 後端技術雜談3:Lucene基礎原理與實踐後端
- 雲端計算管理平臺之OpenStack塊儲存服務cinder
- openstack pike版使用ceph作後端儲存後端
- 《客戶端儲存技術》讀後感客戶端
- 後端技術雜談7:OpenStack的基石KVM後端
- 基於 SmartX 分散式儲存的 iSCSI 與兩種 NVMe-oF 技術與效能對比分散式
- 後臺開發 -- 核心技術與應用實踐
- OCR技術發展綜述與達觀資料的實踐經驗
- EMQ X 與 HStreamDB 整合實踐:通過規則引擎實現資料儲存MQ
- EMQ X 與 HStreamDB 整合實踐:透過規則引擎實現資料儲存MQ
- Ceph儲存後端ObjectStore架構和技術演進後端Object架構
- 各種儲存效能瓶頸場景的分析與最佳化手段
- Android的3種資料儲存技術(一)File儲存Android
- 後端技術雜談8:OpenStack架構設計後端架構
- 前後端分離的思考與實踐(三)後端
- 前後端分離的思考與實踐(四)後端
- 前後端分離的思考與實踐(五)後端
- 前後端分離的思考與實踐(六)後端
- 大模型儲存實踐:效能、成本與多雲大模型
- 資料庫儲存與索引技術(三)LSM樹實現案例資料庫索引
- 後臺開發:核心技術與應用實踐 -- C++C++
- 《客戶端儲存技術》總結客戶端
- 表格儲存技術方案實踐及客戶案例分享
- 基於OpenStack+Docker設計與實現CI/CD——基於Docker技術的CI&CD實踐Docker
- 美團智慧客服核心技術與實踐
- 大話儲存——磁碟原理與技術筆記(一)筆記
- kubernetes儲存類與PV與PVC關係及實踐
- DIY技術資訊抓取工具的實踐與研究
- 雲原生技術領域的探索與實踐
- 後臺開發-核心技術與應用實踐--TCP協議TCP協議
- 每天5分鐘複習OpenStack(十三)儲存快取技術Bcache快取
- 基於 SmartX 分散式儲存的 RDMA 與 TCP/IP 技術與效能對比分散式TCP
- Oracle的表空間的儲存管理與最佳化技術Oracle
- 社交軟體紅包技術解密(十二):解密抖音春節紅包背後的技術設計與實踐解密
- 儲存結構的種類與比較