玩轉 OpenStack(六)Cinder 模塊

Block Storage Service Cinder 作為 OpenStack 的塊存儲服務岸更,為 Instance 提供虛擬磁盤。
操作系統(tǒng)獲得存儲空間的方式一般有兩種:

  • 裸盤的方式叫做Block Storage(塊存儲)朴艰,也叫做 Volume (卷)。一般是通過某種協(xié)議(SAS混移、SCSI祠墅、SAN等)掛載裸盤,然后分區(qū)歌径、格式化毁嗦、創(chuàng)建文件系統(tǒng),或者直接使用裸盤存儲數據(數據庫)回铛。
  • 文件系統(tǒng)存儲狗准。NAS 和 NFS 服務器,以及各種分布式文件系統(tǒng)提供的存儲茵肃。

一腔长、Cinder 架構

Cinder 架構

1. cinder-api

cinder-api 是整個 Cinder 組件的門戶,所有 cinder 的請求都先由 cinder-api 處理验残。
cinder-api 向外界提供若干 HTTP REST API 接口捞附。

cinder-api 對接收到的 HTTP API 請求做如下處理:

  • 檢查客戶端出入的參數是否合法
  • 調用 cinder 其他子服務處理客戶端請求
  • 將 cinder 其他子服務返回的結果,返回給客戶端

cinder-api 只接受和 Volume 生命周期相關的操作胚膊。操作如下圖:


Volume 操作

2. cinder-scheduler

創(chuàng)建 Volume 時故俐,cinder-scheduler 會基于容量、Volume Type 等條件選擇出最適合的存儲節(jié)點紊婉,然后創(chuàng)建 Volume。

/etc/cinder/cinder.conf 文件中辑舷,cinder 通過 scheduler_driver喻犁、scheduler_default_filtersscheduler_default_weighers 三個參數來配置 cinder-scheduler。

(1)Filter scheduler

Filter scheduler 是 cinder-scheduler 默認的調度器。調度過程如下:

  • 通過過濾器(filter)選擇滿足條件的存儲節(jié)點
  • 通過權重計算(weighting)選擇最優(yōu)(權重值最大)的存儲節(jié)點

默認調度器配置如下:

scheduler_driver = cinder.scheduler.filter_scheduler.FilterScheduler

(2)Filter

/etc/cinder/cinder.confscheduler_default_filters 選項指定 file scheduler 使用的 filer肢础,默認值如下:

scheduler_default_filters = AvailabilityZoneFilter,CapacityFilter,CapabilitiesFilter

Filter scheduler 將按照列表中的順序依次過濾还栓。

  • AvailabilityZoneFilter

為了提高容災性和提供隔離服務,可以將存儲節(jié)點和計算節(jié)點劃分到不同的 Availability Zone 中传轰。
例如:把一個機架上的機器劃分到一個 Availability Zone 中剩盒,OpenStack 默認有一個命名為 “Nova” Availability 的 Zone,所有的節(jié)點初始都收放在 “Nova” 中的慨蛙。用戶可以根據需要創(chuàng)建自己的 Availability Zone辽聊,如下圖


Availability Zone 列表頁

在創(chuàng)建 Volume 時,需要指定 Volume 所屬的 Availability Zone期贫,如下圖:


創(chuàng)建 Volume

cinder-scheduler 在做 filtering 時跟匆,會使用 AvailabilityZoneFilter 將不屬于指定 Availability Zone 的存儲節(jié)點過濾掉。

  • CapacityFilter

創(chuàng)建 Volume 時通砍,用戶指定 Volume 的大小玛臂。CapacityFilter 的作用是將存儲空間不能滿足 Volume 創(chuàng)建需求的存儲節(jié)點過濾掉。

  • CapabilitiesFilter

不同的 Volume Provider 有自己的特性(Capabilities)封孙,比如是否支持 thin provision 等迹冤。
在創(chuàng)建 Volume 時,可以通過 Volume Type(卷類型)指定需要的 Capabilities虎忌,如下圖


指定 Capabilities

當然 Capabilities 可以根據需要定義很多個泡徙。如下圖


創(chuàng)建Capabilities

通過 Volume Type(卷類型)的 Extra Specs(擴展規(guī)格)定義 Capabilities。Extra Specs 是 Key-Value 的形式定義的呐籽,如下圖:


擴展規(guī)格

不同的 Volume Provider 支持的 Extra Specs 不同锋勺,查看 Volume Provider 文檔。下圖 Volume Type 只有一個 Extra Specs狡蝶,“volume_backend_name” 這是最重要的庶橱,也是必須的 Extra Specs。


cinder-volume 會在配置文件 /etc/cinder/cinder.conf 中贪惹,設置 volume_backend_name 參數苏章,作用是為存儲節(jié)點的 Volume Provider 命名。這樣奏瞬,CapabilitiesFilter 就可以通過 Volume Type 的 “volume_backend_name” 賽選出指定的 Volume Provider枫绅。

下面是我測試環(huán)境 cinder.conf 中的 volume_backend_name 配置

[lvmdriver-1]
image_volume_cache_enabled = True
lvm_type = default
iscsi_helper = tgtadm
volume_group = stack-volumes-lvmdriver-1
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_backend_name = lvmdriver-1

(3)Weigher

Filter Scheduler 通過 scheduler_default_weighers 指定計算權重的 weigher,默認為 CapacityWeigher

scheduler_default_weighers = CapacityWeigher

CapacityWeigher 基于存儲節(jié)點的空閑容量計算權重硼端,空閑越多權重越大

3. cinder-volume

cinder-volume 在存儲節(jié)點上運行并淋, OpenStack 對 Volume 的操作,最后都交給 cinder-volume 來完成珍昨。

cinder-volume 自身并不管理真正的存儲設備县耽,存儲設備是由 volume provider 管理的句喷。cinder-volume 與 volume provider 一起實現 Volume 生命周期的管理。

  • 通過 Driver 架構支持多種 Volume Provider

可以在 /opt/stack/cinder/cinder/volume/drivers/ 目錄中查看到 OpenStack 源代碼中已經自帶了很多 volume provider 的 Driver兔毙。

root@controller:/opt/stack/cinder/cinder/volume/drivers# cd
root@controller:~# cd /opt/stack/cinder/cinder/volume/drivers
root@controller:/opt/stack/cinder/cinder/volume/drivers# ll
total 1092
drwxr-xr-x 31 stack stack  4096 Feb 23 19:08 ./
drwxr-xr-x  5 stack stack  4096 Feb 23 19:08 ../
-rw-r--r--  1 stack stack 21860 Feb 23 17:17 blockbridge.py
-rw-r--r--  1 stack stack 12524 Feb 23 17:17 block_device.py
-rw-r--r--  1 stack stack 16907 Feb 23 17:17 coho.py
-rw-r--r--  1 stack stack 41951 Feb 23 17:17 drbdmanagedrv.py
-rw-r--r--  1 stack stack 26030 Feb 23 17:17 hgst.py
-rw-r--r--  1 stack stack 18002 Feb 23 17:17 infinidat.py
-rw-r--r--  1 stack stack     0 Feb 23 17:17 __init__.py
-rw-r--r--  1 stack stack 36712 Feb 23 17:17 lvm.py
-rw-r--r--  1 stack stack 25907 Feb 23 17:17 nfs.py
-rw-r--r--  1 stack stack 75815 Feb 23 17:17 nimble.py
-rw-r--r--  1 stack stack 87290 Feb 23 17:17 pure.py
-rw-r--r--  1 stack stack 61860 Feb 23 17:17 qnap.py
-rw-r--r--  1 stack stack 19099 Feb 23 17:17 quobyte.py
-rw-r--r--  1 stack stack 58110 Feb 23 17:17 rbd.py
-rw-r--r--  1 stack stack 62600 Feb 23 17:17 remotefs.py
-rw-r--r--  1 stack stack 28825 Feb 23 17:17 sheepdog.py
-rw-r--r--  1 stack stack 26741 Feb 23 17:17 smbfs.py
-rw-r--r--  1 stack stack 91524 Feb 23 17:17 solidfire.py
-rw-r--r--  1 stack stack 25959 Feb 23 17:17 tegile.py
-rw-r--r--  1 stack stack 39682 Feb 23 17:17 tintri.py
-rw-r--r--  1 stack stack 29320 Feb 23 17:17 vzstorage.py
-rw-r--r--  1 stack stack 69166 Feb 23 17:17 xio.py

存儲節(jié)點在配置文件 /etc/cinder/cinder.confvolume_driver 選項配置使用 driver

volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
  • 定期向 OpenStack 報告計算節(jié)點的狀態(tài)

在 cinder-scheduler 會用到 CapacityFilter 和 CapacityWeigher唾琼,他們都是通過存儲節(jié)點的空間容量來篩選。這個容量信息就是來自 cinder-volume 的定期報告澎剥。

在 cinder-volume 的日志 /opt/stack/logs/c-vol.log 中可以發(fā)現每隔一段時間锡溯,cinder-volume 就會報告一次資源情況。如下圖

資源報告日志

  • Volume 生命周期的管理

Cinder 對 Volume 的生命周期的管理最終是通過 cinder-volume 完成的哑姚。包括 創(chuàng)建祭饭、掛載、快照蜻懦、刪除甜癞、擴展等。

4. cinder-provider

數據的存儲設備宛乃,為 volume 提供物理存儲空間悠咱。
cinder-volume 支持多種 volume provider, 每種 volume provider 通過自己的 driver 與 cinder-volume 協(xié)調工作征炼。

二析既、物理部署方案

1. Cinder 服務

Cinder 服務部署在兩類節(jié)點上,控制節(jié)點和存儲節(jié)點谆奥。

控制節(jié)點中 cinder 服務眼坏。

root@controller:~# ps -e | grep cinder
 7481 pts/19   00:03:25 cinder-api
 7998 pts/20   00:00:42 cinder-schedule
 8490 pts/21   00:03:23 cinder-volume

可以看到 cinder-api 和 cinder-scheduler 部署在控制節(jié)點上,這個是合理的酸些。

cinder-volume 為什么也在控制節(jié)點上宰译?

首先 OpenStack 是一個分布式系統(tǒng),每個子服務都可以部署在任何地方魄懂,只要網絡能夠連通沿侈。

無論哪個節(jié)點,只要上面運行了 cinder-volume 服務市栗,就是一個存儲節(jié)點缀拭,當然也可以運行其他服務。

也可以使用 cinder service-list 查看 cinder 服務分布填帽。

root@controller:~# cinder service-list
+------------------+------------------------+------+---------+-------+----------------------------+-----------------+
| Binary           | Host                   | Zone | Status  | State | Updated_at                 | Disabled Reason |
+------------------+------------------------+------+---------+-------+----------------------------+-----------------+
| cinder-scheduler | controller             | nova | enabled | up    | 2019-03-17T00:54:15.000000 | -               |
| cinder-volume    | controller@lvmdriver-1 | nova | enabled | up    | 2019-03-17T00:54:15.000000 | -               |
+------------------+------------------------+------+---------+-------+----------------------------+-----------------+

2. RabbitMQ 和 MySQL 服務

RabbitMQ 和 MySQL 通常部署在控制節(jié)點上蛛淋。

3. volume provider

一般 volume provider 是獨立的。cinder-volume 使用 driver 與 volume provider 通信并協(xié)調工作篡腌。
所以只需要將 driver 和 cinder-volume 放在一起就可以了褐荷。

三、操作過程

1. LVM Volume Provider

Cinder 將 LVM 作為默認的 volume provider嘹悼。Devstack 安裝之后诚卸, /etc/cinder/cinder.conf 已經配置好了 LVM葵第,

default_volume_type = lvmdriver-1
enabled_backends = lvmdriver-1

[lvmdriver-1]
image_volume_cache_enabled = True
lvm_type = default
iscsi_helper = tgtadm
volume_group = stack-volumes-lvmdriver-1
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_backend_name = lvmdriver-1

配置中定義了名為 “l(fā)vmdriver-1” 的 volume provider绘迁,也稱作 back-end合溺。其 driver 是 LVM,LVM 的 volume group 名為 “stack-volumes-lvmdriver-1”缀台。

/dev/sdb 中手動創(chuàng)建 VG “stack-volumes-lvmdriver-1” 棠赛。
創(chuàng)建 physical volume /dev/sdb

root@controller:~# pvcreate /dev/sdb
  Device /dev/sdb not found (or ignored by filtering).

因為 Linux 的 LVM 默認配置,不允許在 /dev/sdb 上創(chuàng)建 PV膛腐,需要將 sdb 添加到 /etc/lvm/lvm.confglobal_filter中添加 a|sdb|

global_filter = [ "a|sdb|", "a|.*/|" ]
root@controller:/~# pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created

然后創(chuàng)建 VG stack-volumes-lvmdriver-1

root@controller:~# gcreate  stack-volumes-lvmdriver-1 /dev/sdb
   Volume group "vgcreate  stack-volumes-lvmdriver-1 /dev/sdb" successfully created

在 OpenStack Web 的 Volume Type 中可以查看了睛约。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市哲身,隨后出現的幾起案子辩涝,更是在濱河造成了極大的恐慌,老刑警劉巖勘天,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怔揩,死亡現場離奇詭異,居然都是意外死亡脯丝,警方通過查閱死者的電腦和手機商膊,發(fā)現死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宠进,“玉大人晕拆,你說我怎么就攤上這事〔牡牛” “怎么了实幕?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長堤器。 經常有香客問我昆庇,道長,這世上最難降的妖魔是什么吼旧? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任凰锡,我火速辦了婚禮,結果婚禮上圈暗,老公的妹妹穿的比我還像新娘掂为。我一直安慰自己,他們只是感情好员串,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布勇哗。 她就那樣靜靜地躺著,像睡著了一般寸齐。 火紅的嫁衣襯著肌膚如雪欲诺。 梳的紋絲不亂的頭發(fā)上抄谐,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機與錄音扰法,去河邊找鬼蛹含。 笑死,一個胖子當著我的面吹牛塞颁,可吹牛的內容都是我干的浦箱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼祠锣,長吁一口氣:“原來是場噩夢啊……” “哼酷窥!你這毒婦竟也來了?” 一聲冷哼從身側響起伴网,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蓬推,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后澡腾,有當地人在樹林里發(fā)現了一具尸體沸伏,經...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年蛋铆,在試婚紗的時候發(fā)現自己被綠了馋评。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡刺啦,死狀恐怖留特,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情玛瘸,我是刑警寧澤蜕青,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站糊渊,受9級特大地震影響右核,放射性物質發(fā)生泄漏。R本人自食惡果不足惜渺绒,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一贺喝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宗兼,春花似錦躏鱼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至主到,卻和暖如春茶行,著一層夾襖步出監(jiān)牢的瞬間躯概,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工畔师, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留娶靡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓茉唉,卻偏偏與公主長得像固蛾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子度陆,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內容