歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> OpenStack塊存儲nova-volume工作機制和相關問題

OpenStack塊存儲nova-volume工作機制和相關問題

日期:2017/2/27 16:02:23   编辑:Linux教程
一、相關概念
LVM存儲常用術語
物理存儲介質(Physical Media):物理存儲設備,如磁盤或者磁盤上的分區,是存儲系統的最底層實體。

物理卷(PV,Physical Volume):硬盤分區或從邏輯上與硬盤分區具有同樣功能的設備(如 RAID),是 LVM 的基本存儲邏輯塊;和基本的物理存儲介質(如分、磁盤等)不同的是含有 LVM 管理參數。

卷組(VG,Volume Group):LVM 中的最高抽象層,由一個或多個物理卷(PV)組成。一個邏輯卷管理系統中可以擁有多個卷組。

邏輯卷(LV,Logical Volume):邏輯卷(LV)在卷組上建立,相當於非 LVM 系統中的分區。每個邏輯卷屬於它所在的卷組。

VGDA(卷組描述符區域) :和非 LVM 系統將包含分區信息的元數據保存在位於分區起始位置的分區表中一樣,邏輯卷以及卷組相關的元數據被保存在位於物理卷起始處的 VGDA 中。VGDA 包括以下內容:PV 描述符、VG 描述符、LV 描述符、和一些 PE 描述符。系統啟動 LVM 時激活 VG,並將 VGDA 加載至內存,來識別 LV 的實際物理存儲位置。當系統進行 I/O 操作時,就會根據 VGDA 建立的映射機制來訪問實際的物理位置。

存儲類型
通常來講,所有磁盤陣列都是基於Block塊的模式,所有的NAS產品都是文件級存儲,而對象存儲(Object-based Storage)是一種新的網絡存儲架構,它基於對象存儲技術。

iSCSI協議
將SCSI命令封裝在IP包中,建立會話通過TCP/IP網絡傳輸。iSCSI協議定義了在TCP/IP 網絡發送、接收 block(數據塊)級的存儲數據的規則和方法。發送端將SCSI命令和數據封裝到TCP/IP包中再通過網絡轉發,接收端收到 TCP/IP包之後,將其還原為SCSI命令和數據並執行,完成之後將返回的SCSI命令和數據再封裝到 TCP/IP包中再傳送回發送端。而整個過程在用戶看來,使用遠端的存儲設備就象訪問本地的SCSI設備一樣簡單。

iscsi-target server
iSCSI有多種存儲架構,但是由於PC架構的成本低,同時技術越來越成熟,基於PC架構的iSCSI存儲設備應用廣泛。iSCSI Target軟件安裝在PC服務器上,使普通的PC服務器轉變成一台iSCSI存儲設備,並通過PC服務器的以太網卡對外提供基於iSCSI數據傳輸協議的服務。

iscsi-initiator
Initiator軟件可以將以太網卡虛擬為iSCSI卡,接受和發送iSCSI數據報文,從而實現主機和iSCSI設備之間的iSCSI協議和TCP/IP協議傳輸功能。

二、OpenStack的存儲服務
1、存儲組件和服務
OpenStack創建出來的實例是沒有永久存儲的,關閉實例後數據都會丟失,所以需要存儲卷來保存每個instance的數據。這項工作由nova-volume實現,提供類似亞馬遜EBS的塊存儲服務。其中,nova-volume專門管理卷的創建、刪除、掛載等,這些卷基於lvm管理,使用iscsi提供服務,並通過libvirt與虛擬機交互。

lvm提供卷組和邏輯卷管理。首先需要創建一個名為nova-volumes的卷組,不然nova-volume不能正常工作。因為nova-volume所有的創建、刪除volume都是針對這個卷組裡的邏輯卷。創建volume時nova-volume會調用lvm的命令lvcreate創建邏輯卷。

iscsi提供多個節點間的存儲服務。創建volume時計算節點還會創建iscsi IQN,計算節點與iscsi服務器間建立iscsi會話;掛載時實例就擁有了這個邏輯卷;然後使用virsh命令把這個邏輯卷掛載到實例作為它的一塊存儲設備。

libvirt是一組與多種虛擬機交互的管理工具集。它支持虛擬機KVM/QEMU、Xen、virtual Box、vmware ESX、Hyper-V等。為了使虛擬機獲得更強大的後端存儲能力,libvirt 提供了對各種存儲介質的支持,包括本地文件系統,網絡文件系統,iSCSI,LVM 等多種後端存儲系統。libvirt 中的存儲管理獨立於虛擬機管理。也就是存儲池和存儲卷的操作獨立於虛擬機的操作存在,因此進行存儲管理時,不需要有虛擬機的存在,可以當虛擬機需要存儲資源時再進行分配,非常靈活。

存儲卷是一種可以分配給虛擬機使用的存儲設備,在OpenStack中就是邏輯卷volume。在虛擬機中與一個掛載點對應,而物理上可以是一個虛擬機磁盤文件或一個真實的磁盤分區,從卷組nova-volumes中分出來的。

存儲池是一種可以從中生成存儲卷的存儲資源,後端可以支持目錄池、本地文件系統池、邏輯卷池、磁盤卷池、iSCSI 卷池等,在OpenStack中就是邏輯卷組nova-volumes。

存儲卷從存儲池中劃分出來,存儲卷分配給虛擬機成為可用的存儲設備。存儲池在 libvirt 中分配的 id 標志著它成為 libvirt 可管理的對象,生成卷組 vg(volume group,OpenStack中必須nova-volumes) 就有了可劃分存儲卷的存儲池,狀態為活躍 (active) 狀態才可以執行劃分存儲卷的操作,可以參考下圖。

CentOS+LVM+Celerra iSCSI配置詳解



2、存儲結構和機制
安裝部署OpenStack時,安裝了lvm,安裝了libvirt,還安裝了tgt和open-iscsi。
在nova.conf設置存儲管理工具為tgtadm,使用tgt管理target。iscsi target管理工具很多,iscsitarget軟件是其中一中。
服務器,tgt提供服務,tgtadm命令查詢、創建和刪除target。
客戶端,open-iscsi提供服務,iscsiadm命令查詢、登錄和登出target。建立會話,斷開會話。
數據庫,volume的位置、狀態等信息會存到數據庫,在onestack安裝時,選擇mysql,同時安裝了phpmyadmin,可以通過web界面訪問管理。

nova-volume安裝在控制節點,這個物理主機提供volume的創建、刪除、掛載等管理功能。
open-iscsi安裝在計算節點,提供計算節點上的實例和服務端的target之間的會話管理。
所以在一個all-in-one的部署結構裡,物理主機既是server又是client。

在OpenStack的安裝過程中,最後nova.conf這個配置文件設置了target管理程序tgtadm,所以使用tgt來提供target服務;iscsi_prefix指明了查找iscsitarget的ip段,可以設為完整的tgt所在的主機ip,或者前綴,可以使用iscsi_ip_addres=192.168.139.50設置指定的ip

這樣nova會自動使用iscsiadm從這個ip進行discovery,類似執行命令

iscsiadm -m discovery -t sendtargets -p IP:port

所以每次實例啟動時,通過已有的映射掛載這個設備,也就是nova-volumes裡的一個邏輯卷,或者說一個iscsi target。這樣就可以像普通磁盤設備、物理卷、磁盤分區一樣使用這個掛載的volume。

3、存儲服務的工作流程
安裝部署OpenStack時,安裝了lvm,安裝了libvirt,還安裝了tgt和open-iscsi。
1)lvm創建卷組(VG),在OpenStack中就是邏輯卷組nova-volumes,也就是OpenStack裡只能使用這個卷組名。沒有這個名字的卷組,nova-volume將不會正常啟動,這也會導致nova-compute不能正常啟動。

查看卷組vgdisplay

查看哪些nova服務沒有正常啟動nova-manage service list

2)如果沒有nova-volumes卷組,創建這個卷組。這需要一個或者多個物理卷,可以擴展卷組。
pvcreate /dev/sdb3
vgcreate nova-volumes /dev/sdb3
vgextend nova-volumes /dev/sdb4

3)如果沒有物理設備,可以使用文件代替,一般實驗用。
$ dd if=/dev/zero of=/opt/nova-volumes.img bs=1M seek=100000 count=0
$ losetup -f /opt/nova-volumes.img
$ losetup -a
$ vgcreate nova-volumes /dev/loop0

4)創建nova-volumes卷組後,需要重啟nova-volume服務

5)確保tgt服務開啟,並且tgt監聽3260端口。
lsof | grep 3260

6)以上都正常服務,在客戶端(計算節點,或者裝了all-in-one的主機)。確保open-iscsi這個客戶端軟件正常工作。

7)nova volume-create創建volume,可以使用nova命令或者在web進行。
如果創建成功,可以在客戶端通過iscsiadm命令查看會話,以及查看服務端的target。
iscsiadm -m session
iscsiadm -m discovery -t sendtargets -p IP:port

在服務端,可以查看target
tgtadm --lld iscsi --op show --mode target

8)創建volume成功,下面可以attach到某個實例。
如果attach不成功,檢查日志;
如果一直attaching,請看下面問題和解決方法3.7

9)進入實例,可以fdisk -l看到新掛載的volume。

三、常見問題和解決方法
3.0、創建太多volume或者instance,不能正常運行,怎麼清空數據庫並重置數據庫

在OneStack項目裡,已經加入了這個腳本工具,可以自行更改和增刪。鏡像相關的數據在glance數據庫,身份相關的在keystone,nova相關的數據主要對應nova數據庫,包括實例instance表和卷volume表。

清空nova數據庫./resetStack clear
然後重新初始化./resetStack

3.1、OpenStack中創建volume一直在creating,什麼原因
主要因為nova-volume沒有正常啟動,可以
nova-manage service list

看看後面的狀態,不是笑臉:-)而是xx。如果沒有啟動,請接著看下一條FAQ(3.2)。

3.2、OpenStack中nova-volume服務不能啟動,什麼原因
主要因為沒有nova-volumes卷組,或者iscsitarget服務沒有啟動(或者沒有安裝)。

1、vgdisplay
沒有nova-volumes卷組,可以創建卷組和磁盤
$ dd if=/dev/zero of=/opt/nova-volumes.img bs=1M seek=100000 count=0
$ losetup -f /opt/nova-volumes.img
$ losetup -a
$ vgcreate nova-volumes /dev/loop0

記著啟動nova-volume然後創建volume,否則下面仍然不能創建
$ service nova-volume restart
$ nova volume-create --display_name "volume1" 10

2、service tgt status
由於nova.conf設置tgtadm管理,在控制節點(nova-volume所在的物理節點)使用tgt提供target服務,通過tgtadm管理。
1)沒有安裝tgt,或者沒有正常啟動tgt,可以apt安裝(可以用iscsitarget,對於inet管理工具,對應iscsitarget iscsitarget-dkms,需要sed -i -e 's/false/true/' /etc/default/iscsitarget是服務可以工作)

然後執行以下命令安裝和設置為可以啟動
apt-get install -y tgt
service tgt start
service nova-volume restart

lsof | grep 3260可以查看端口是否監聽

2)如果既沒有nova-volumes卷組,也沒有安裝tgt,切忌保證這兩者都存在,並且nova.conf設置正確,然後重啟nova-volume,再創建volume
有人安裝tgt並啟動後就create,結果nova-volume並沒有啟動,所以問題依然存在;
有人創建nova-volumes,也沒有重啟nova-volume,也不能正常工作。

3.3、OpenStack中創建volume一直在creating,怎麼停掉(stop
主要因為nova-volume沒有正常啟動,即使現在啟動了還會停留在這個狀態。
需要手動更改數據庫裡相關狀態信息,從creating改為deleted然後刪掉。

對於這個沒有創建成功的volume,可以直接更改數據庫改為deleted,注意nova volume-delete會提示找不到。
如果不能創建某些卷,並且提示存在這種volume,比如lvdisplay查到這個邏輯卷,需要lvremove;如果tgt中可以看到這個target,需要使用tgtadm刪除
tgtadm --op delete --lld=iscsi --mode=target --tid=1

3.4、OpenStack中nova-volume執行出現問題,檢查什麼地方
主要因為nova-volume沒有正常啟動或者計算節點沒有能找到target,可以檢查以下這些問題。
nova-volume是否正常;控制點,詳見問題3.2
tgt是否開啟;服務端
open-iscsi是否安裝和開啟;客戶端
客戶端(計算節點)iscsiadm discovery看看能不能找到存儲服務;
分析nova-volume.log、nova-compute.log和libvirt.log。

3.5、OpenStack中tgt管理target
控制節點查看target
tgtadm --lld iscsi --op show --mode target
建立target
sudo tgtadm --op new --lld=iscsi --mode=target --tid=1 --targetname=iqn.2010-10.org.openstack:volume-00000001

3.6、OpenStack中計算節點管理volume
查看建立的session
sudo iscsiadm -m session
手動發現target
sudo iscsiadm -m discovery -t sendtargets -p IP:port
登入登出
sudo iscsiadm -m node -T targetname(iqn.2010-10.org.openstack:volume-00000004) -p 10.200.200.4:3260 --login
sudo iscsiadm -m node -T targetname(iqn.2010-10.org.openstack:volume-00000004) -p 10.200.200.4:3260 --logout
sudo iscsiadm -m node -o [delete|new|update] -T targetname

如果使用命令
sudo iscsiadm -m discovery -t sendtargets -p compute_node
報以下錯誤
iscsiadm: Connection to Discovery Address 192.168.139.50 closed
iscsiadm: Login I/O error, failed to receive a PDU
這是因為沒有找到target,可以create一個volume,此時會建立一個卷,建立一個target。

3.7、OpenStack中掛載volume一直阻塞停留在attaching,什麼原因,怎麼解決
在volume-create成功創建volume後,掛載到實例,如果遇到什麼提示都沒有nova volume-attach後仍然為available,那麼是你的掛載有問題,比如使用的設備名/dev/vdc已經使用了,需要檢查日志。

更多的問題是,nova volume-attach一直attaching,刪不掉也掛不上。這時候,nova-manage service list你會發現nova-compute已經停止,如果以上所描述的問題(nova-volume沒有正常工作)都不存在,那麼需要你更改OpenStack源代碼了,這是OpenStack的一個bug。

1)對於這個沒有掛載成功的volume,可以直接更改數據庫改為available,或者使用nova-manage volume delete來通過數據庫刪除這個volume,注意nova volume-delete會刪不掉。

2)對於這個bug,需要更改以下兩處源代碼:
vi /usr/share/pyshared/nova/virt/libvirt/connection.py
把virt_dom.attachDevice(xml)這一行改為
[plain] view plaincopy
LOG.info("attaching device with virsh")
device_path = connection_info['data']['device_path']
utils.execute('virsh', "attach-disk", instance_name, device_path, mount_device, run_as_root=True )

vi /usr/share/pyshared/nova/rootwrap/compute.py
添加一行
[plain] view plaincopy
filters.CommandFilter("/usr/bin/virsh", "root"),

這樣就行了,注意volume-attach填寫的設備名不能重復,雖然它並不一定使用你指定的設備名作為實例的設備名。
如果很多服務沒有正常工作,可以重啟所有服務
for a in libvirt-bin nova-network nova-compute nova-api nova-objectstore nova-scheduler novnc nova-volume nova-consoleauth; do service "$a" restart; done
Copyright © Linux教程網 All Rights Reserved