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

對swift對象存儲的內部原理和相關技術能夠查找對象存儲、一致性哈希等文章,新浪有幾篇技術分享介紹的很好,推薦看一看。
  1、相關概念
  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協議傳輸功能。
  
  
  
  2、OpenStack的存儲服務
  一、存儲組件和服務
  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) 狀態才能夠執行劃分存儲卷的操做,能夠參考下圖。
  
  
  二、存儲結構和機制
  安裝部署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。
  
  
  三、存儲服務的工做流程
  安裝部署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、常見問題和解決方法(已加入OpenStack-Lite-FAQ第3節)
  3.0、建立太多volume或者instance,不能正常運行,怎麼清空數據庫並重置數據庫
  在OneStack項目裏,已經加入了這個腳本工具,能夠自行更改和增刪。鏡像相關的數據在glance數據庫,身份相關的在keystone,nova相關的數據主要對應nova數據庫,包括實例instance表和卷volume表。
  清空nova數據庫./resetStack clear
  而後從新初始化./resetStack

  3.一、OpenStack中建立volume一直在creating,什麼緣由
  

主要由於nova-volume沒有正常啓動,能夠   nova-manage service list
  看看後面的狀態,不是笑臉:-)而是xx。若是沒有啓動,請接着看下一條FAQ(3.2)。

   
  3.二、OpenStack中nova-volume服務不能啓動,什麼緣由


主要由於沒有nova-volumes卷組,或者iscsitarget服務沒有啓動(或者沒有安裝)。
  一、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

  

  二、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.三、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.四、OpenStack中nova-volume執行出現問題,檢查什麼地方
主要由於nova-volume沒有正常啓動或者計算節點沒有能找到target,能夠檢查如下這些問題。
nova-volume是否正常;控制點,詳見問題3.2
tgt是否開啓;服務端
open-iscsi是否安裝和開啓;客戶端
客戶端(計算節點)iscsiadm discovery看看能不能找到存儲服務;
分析nova-volume.log、nova-compute.log和libvirt.log。
  
3.五、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.六、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.七、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 plain    copy   
   
  
  php

  •   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 plain    copy   
   
  
  node

  •   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
  爲了集中這些討論,請訪問原始出處:《OpenStack塊存儲nova-volume相關問題》。若有OpenStack問題和解決,請直接下面回覆,這樣也方便後來人。若有其它問題反饋,Kayven微博留言E-mail)。國內對於OpenStack還處於比較初級的階段,技術研究公開的資料較少,多爲一些安裝部署問題相關的文章,比較深刻的技術分析和比較全面的介紹較少。但願有什麼經驗和觀點,能夠在這裏分享出來供你們討論,也幫助理清本身的思路。
mysql

相關文章
相關標籤/搜索