?? openstack+?
字號:
最近有點忙,收到不少郵件或者留言,有些沒有回復,在此致歉。在OpenStack中,出現(xiàn)問題比較多的除了網(wǎng)絡部分,還有存儲部分。對于swift對象存儲的研究和相關(guān)技術(shù)資料已經(jīng)有很多,而塊存儲nova-volume相關(guān)的介紹還少見,其中也有很多問題出現(xiàn)。
下面將對這一部分的一些問題給予介紹,希望大家有好的經(jīng)驗都分享出來,社區(qū)的力量需要每一分子的貢獻。最近這幾篇文章的目錄貼在這里,相關(guān)問題可以直接去查閱對應文章,如果還問很多已經(jīng)在文章里說明的問題我就不回復了。
OneStack:Ubuntu 12.04
(或11.10) 一鍵部署安裝OpenStack云計算平臺,這個介紹了onestack這個一鍵部署的項目;
OpenStack安裝部署管理中常見問題解決方法(OpenStack-Lite-FAQ),這個記錄了一些基本的問題和解決方法;
構(gòu)建OpenStack的高可用性(HA,High
Availability),這部分介紹了高可用性的OpenStack IaaS平臺的一些策略和方案;
OpenStack云平臺的網(wǎng)絡模式及其工作機制,這個詳細分析了網(wǎng)絡原理和工作機制;
OpenStack卷存儲nova-volume相關(guān)問題,由于nova-volume問題較多,單獨寫這一篇,主要介紹塊存儲相關(guān)的問題;
對swift對象存儲的內(nèi)部原理和相關(guān)技術(shù)可以查找對象存儲、一致性哈希等文章,新浪有幾篇技術(shù)分享介紹的很好,推薦看一看。
一、相關(guān)概念
LVM存儲常用術(shù)語
物理存儲介質(zhì)(Physical Media):物理存儲設(shè)備,如磁盤或者磁盤上的分區(qū),是存儲系統(tǒng)的最底層實體。
物理卷(PV,Physical Volume):硬盤分區(qū)或從邏輯上與硬盤分區(qū)具有同樣功能的設(shè)備(如
RAID),是 LVM 的基本存儲邏輯塊;和基本的物理存儲介質(zhì)(如分、磁盤等)不同的是含有 LVM 管理參數(shù)。
卷組(VG,Volume Group):LVM 中的最高抽象層,由一個或多個物理卷(PV)組成。一個邏輯卷管理系統(tǒng)中可以擁有多個卷組。
邏輯卷(LV,Logical Volume):邏輯卷(LV)在卷組上建立,相當于非 LVM 系統(tǒng)中的分區(qū)。每個邏輯卷屬于它所在的卷組。
VGDA(卷組描述符區(qū)域) :和非 LVM 系統(tǒng)將包含分區(qū)信息的元數(shù)據(jù)保存在位于分區(qū)起始位置的分區(qū)表中一樣,邏輯卷以及卷組相關(guān)的元數(shù)據(jù)被保存在位于物理卷起始處的 VGDA 中。VGDA 包括以下內(nèi)容:PV 描述符、VG 描述符、LV 描述符、和一些 PE 描述符。系統(tǒng)啟動 LVM 時激活 VG,并將 VGDA 加載至內(nèi)存,來識別 LV 的實際物理存儲位置。當系統(tǒng)進行 I/O 操作時,就會根據(jù) VGDA 建立的映射機制來訪問實際的物理位置。
存儲類型
通常來講,所有磁盤陣列都是基于Block塊的模式,所有的NAS產(chǎn)品都是文件級存儲,而對象存儲(Object-based Storage)是一種新的網(wǎng)絡存儲架構(gòu),它基于對象存儲技術(shù)。
iSCSI協(xié)議
將SCSI命令封裝在IP包中,建立會話通過TCP/IP網(wǎng)絡傳輸。iSCSI協(xié)議定義了在TCP/IP 網(wǎng)絡發(fā)送、接收 block(數(shù)據(jù)塊)級的存儲數(shù)據(jù)的規(guī)則和方法。發(fā)送端將SCSI命令和數(shù)據(jù)封裝到TCP/IP包中再通過網(wǎng)絡轉(zhuǎn)發(fā),接收端收到 TCP/IP包之后,將其還原為SCSI命令和數(shù)據(jù)并執(zhí)行,完成之后將返回的SCSI命令和數(shù)據(jù)再封裝到
TCP/IP包中再傳送回發(fā)送端。而整個過程在用戶看來,使用遠端的存儲設(shè)備就象訪問本地的SCSI設(shè)備一樣簡單。
iscsi-target server
iSCSI有多種存儲架構(gòu),但是由于PC架構(gòu)的成本低,同時技術(shù)越來越成熟,基于PC架構(gòu)的iSCSI存儲設(shè)備應用廣泛。iSCSI
Target軟件安裝在PC服務器上,使普通的PC服務器轉(zhuǎn)變成一臺iSCSI存儲設(shè)備,并通過PC服務器的以太網(wǎng)卡對外提供基于iSCSI數(shù)據(jù)傳輸協(xié)議的服務。
iscsi-initiator
Initiator軟件可以將以太網(wǎng)卡虛擬為iSCSI卡,接受和發(fā)送iSCSI數(shù)據(jù)報文,從而實現(xiàn)主機和iSCSI設(shè)備之間的iSCSI協(xié)議和TCP/IP協(xié)議傳輸功能。
二、OpenStack的存儲服務
1、存儲組件和服務
OpenStack創(chuàng)建出來的實例是沒有永久存儲的,關(guān)閉實例后數(shù)據(jù)都會丟失,所以需要存儲卷來保存每個instance的數(shù)據(jù)。這項工作由nova-volume實現(xiàn),提供類似亞馬遜EBS的塊存儲服務。其中,nova-volume專門管理卷的創(chuàng)建、刪除、掛載等,這些卷基于lvm管理,使用iscsi提供服務,并通過libvirt與虛擬機交互。
lvm提供卷組和邏輯卷管理。首先需要創(chuàng)建一個名為nova-volumes的卷組,不然nova-volume不能正常工作。因為nova-volume所有的創(chuàng)建、刪除volume都是針對這個卷組里的邏輯卷。創(chuàng)建volume時nova-volume會調(diào)用lvm的命令lvcreate創(chuàng)建邏輯卷。
iscsi提供多個節(jié)點間的存儲服務。創(chuàng)建volume時計算節(jié)點還會創(chuàng)建iscsi IQN,計算節(jié)點與iscsi服務器間建立iscsi會話;掛載時實例就擁有了這個邏輯卷;然后使用virsh命令把這個邏輯卷掛載到實例作為它的一塊存儲設(shè)備。
libvirt是一組與多種虛擬機交互的管理工具集。它支持虛擬機KVM/QEMU、Xen、virtual Box、vmware ESX、Hyper-V等。為了使虛擬機獲得更強大的后端存儲能力,libvirt 提供了對各種存儲介質(zhì)的支持,包括本地文件系統(tǒng),網(wǎng)絡文件系統(tǒng),iSCSI,LVM 等多種后端存儲系統(tǒng)。libvirt
中的存儲管理獨立于虛擬機管理。也就是存儲池和存儲卷的操作獨立于虛擬機的操作存在,因此進行存儲管理時,不需要有虛擬機的存在,可以當虛擬機需要存儲資源時再進行分配,非常靈活。
存儲卷是一種可以分配給虛擬機使用的存儲設(shè)備,在OpenStack中就是邏輯卷volume。在虛擬機中與一個掛載點對應,而物理上可以是一個虛擬機磁盤文件或一個真實的磁盤分區(qū),從卷組nova-volumes中分出來的。
存儲池是一種可以從中生成存儲卷的存儲資源,后端可以支持目錄池、本地文件系統(tǒng)池、邏輯卷池、磁盤卷池、iSCSI 卷池等,在OpenStack中就是邏輯卷組nova-volumes。
存儲卷從存儲池中劃分出來,存儲卷分配給虛擬機成為可用的存儲設(shè)備。存儲池在 libvirt 中分配的 id 標志著它成為 libvirt 可管理的對象,生成卷組 vg(volume group,OpenStack中必須nova-volumes)
就有了可劃分存儲卷的存儲池,狀態(tài)為活躍 (active) 狀態(tài)才可以執(zhí)行劃分存儲卷的操作,可以參考下圖。
2、存儲結(jié)構(gòu)和機制
安裝部署OpenStack時,安裝了lvm,安裝了libvirt,還安裝了tgt和open-iscsi。
在nova.conf設(shè)置存儲管理工具為tgtadm,使用tgt管理target。iscsi
target管理工具很多,iscsitarget軟件是其中一中。
服務器,tgt提供服務,tgtadm命令查詢、創(chuàng)建和刪除target。
客戶端,open-iscsi提供服務,iscsiadm命令查詢、登錄和登出target。建立會話,斷開會話。
數(shù)據(jù)庫,volume的位置、狀態(tài)等信息會存到數(shù)據(jù)庫,在onestack安裝時,選擇mysql,同時安裝了phpmyadmin,可以通過web界面訪問管理。
nova-volume安裝在控制節(jié)點,這個物理主機提供volume的創(chuàng)建、刪除、掛載等管理功能。
open-iscsi安裝在計算節(jié)點,提供計算節(jié)點上的實例和服務端的target之間的會話管理。
所以在一個all-in-one的部署結(jié)構(gòu)里,物理主機既是server又是client。
在OpenStack的安裝過程中,最后nova.conf這個配置文件設(shè)置了target管理程序tgtadm,所以使用tgt來提供target服務;iscsi_prefix指明了查找iscsitarget的ip段,可以設(shè)為完整的tgt所在的主機ip,或者前綴,可以使用iscsi_ip_addres=192.168.139.50設(shè)置指定的ip
這樣nova會自動使用iscsiadm從這個ip進行discovery,類似執(zhí)行命令
iscsiadm
-m discovery -t sendtargets -p IP:port
所以每次實例啟動時,通過已有的映射掛載這個設(shè)備,也就是nova-volumes里的一個邏輯卷,或者說一個iscsi target。這樣就可以像普通磁盤設(shè)備、物理卷、磁盤分區(qū)一樣使用這個掛載的volume。
3、存儲服務的工作流程
安裝部署OpenStack時,安裝了lvm,安裝了libvirt,還安裝了tgt和open-iscsi。
1)lvm創(chuàng)建卷組(VG),在OpenStack中就是邏輯卷組nova-volumes,也就是OpenStack里只能使用這個卷組名。沒有這個名字的卷組,nova-volume將不會正常啟動,這也會導致nova-compute不能正常啟動。
查看卷組vgdisplay
查看哪些nova服務沒有正常啟動nova-manage service list
2)如果沒有nova-volumes卷組,創(chuàng)建這個卷組。這需要一個或者多個物理卷,可以擴展卷組。
pvcreate /dev/sdb3
vgcreate nova-volumes /dev/sdb3
vgextend nova-volumes /dev/sdb4
3)如果沒有物理設(shè)備,可以使用文件代替,一般實驗用。
$
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)創(chuàng)建nova-volumes卷組后,需要重啟nova-volume服務
5)確保tgt服務開啟,并且tgt監(jiān)聽3260端口。
lsof
| grep 3260
6)以上都正常服務,在客戶端(計算節(jié)點,或者裝了all-in-one的主機)。確保open-iscsi這個客戶端軟件正常工作。
7)nova
volume-create創(chuàng)建volume,可以使用nova命令或者在web進行。
如果創(chuàng)建成功,可以在客戶端通過iscsiadm命令查看會話,以及查看服務端的target。
iscsiadm
-m session
iscsiadm
-m discovery -t sendtargets -p IP:port
在服務端,可以查看target
tgtadm
--lld iscsi --op show --mode target
8)創(chuàng)建volume成功,下面可以attach到某個實例。
如果attach不成功,檢查日志;
如果一直attaching,請看下面問題和解決方法3.7
9)進入實例,可以fdisk -l看到新掛載的volume。
三、常見問題和解決方法(已加入OpenStack-Lite-FAQ第3節(jié))
3.0、創(chuàng)建太多volume或者instance,不能正常運行,怎么清空數(shù)據(jù)庫并重置數(shù)據(jù)庫
在OneStack項目里,已經(jīng)加入了這個腳本工具,可以自行更改和增刪。鏡像相關(guān)的數(shù)據(jù)在glance數(shù)據(jù)庫,身份相關(guān)的在keystone,nova相關(guān)的數(shù)據(jù)主要對應nova數(shù)據(jù)庫,包括實例instance表和卷volume表。
清空nova數(shù)據(jù)庫./resetStack clear
然后重新初始化./resetStack
3.1、OpenStack中創(chuàng)建volume一直在creating,什么原因
主要因為nova-volume沒有正常啟動,可以
nova-manage service list
看看后面的狀態(tài),不是笑臉:-)而是xx。如果沒有啟動,請接著看下一條FAQ(3.2)。
3.2、OpenStack中nova-volume服務不能啟動,什么原因
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -