繼研究了Neutron以後,繼續Nova的外圍研究之旅。本站是研究塊存儲服務Cinder。html
0。驗證環境node
環境包括:python
一、一個controller節點,運行nova-api, nova-scheduler, cinder-api, cinder-scheduler, mysql, rabbitmqmysql
二、一個Nova compute節點,運行一個虛機git
三、三個cinder volume節點,每一個節點使用LVMISCSIDriver來使用本地存儲github
4. 建立一個volume type,設置 volume_backend_name = lvmbackend算法
cinder.conf 在 block1上 enabled_backends = lvmdriver-b1 [lvmdriver-b1] volume_group = cinder-volumes volume_driver = cinder.volume.drivers.lvm.LVMISCSIDriver volume_backend_name = lvmbackend cinder.conf 在 block2上 enabled_backends = lvmdriver-b21,lvmdriver-b22 storage_availability_zone=az1 [lvmdriver-b21] iscsi_ip_address = 10.0.1.29 volume_group = cinder-volumes1 volume_driver = cinder.volume.drivers.lvm.LVMISCSIDriver volume_backend_name = lvmbackend [lvmdriver-b22] volume_group = cinder-volumes2 volume_driver = cinder.volume.drivers.lvm.LVMISCSIDriver volume_backend_name = lvmbackend cinder.conf 在 block3上
enabled_backends = lvmdrier-network [lvmdriver-network] volume_group = system volume_driver = cinder.volume.drivers.lvm.LVMISCSIDriver volume_backend_name = lvmbackend
關於幾個小問題的說明:sql
cinder的service以下:數據庫
root@controller:/home/s1# cinder service-list +------------------+---------------------------+------+---------+-------+----------------------------+-----------------+ | Binary | Host | Zone | Status | State | Updated_at | Disabled Reason | +------------------+---------------------------+------+---------+-------+----------------------------+-----------------+ | cinder-backup | controller | nova | enabled | up | 2015-01-11T16:36:00.000000 | None | | cinder-scheduler | controller | nova | enabled | up | 2015-01-11T16:36:01.000000 | None | | cinder-volume | block1@lvmdriver-b1 | nova | enabled | up | 2015-01-11T16:36:08.000000 | None | | cinder-volume | block2@lvmdriver-b21 | az1 | enabled | up | 2015-01-11T16:36:06.000000 | None | | cinder-volume | block2@lvmdriver-b22 | az1 | enabled | up | 2015-01-11T16:36:05.000000 | None | | cinder-volume | network@lvmdriver-network | nova | enabled | up | 2015-01-11T16:36:02.000000 | None | +------------------+---------------------------+------+---------+-------+----------------------------+-----------------+
說明:後端
1 |
卷操做 |
建立卷 |
2 |
從已有卷建立卷 (克隆) |
|
3 |
擴展卷 |
|
4 |
刪除卷 |
|
5 |
卷-虛機操做 |
掛載捲到虛機 |
6 |
分離虛機卷 |
|
7 |
卷-快照操做 |
建立卷的快照 |
8 |
從已有卷快照建立卷 |
|
9 |
刪除快照 |
|
10 |
卷-鏡像操做 |
從鏡像建立卷 |
11 |
從卷建立鏡像 |
上圖說明:
root@compute1:/home/s1# cat /etc/iscsi/initiatorname.iscsi InitiatorName=iqn.1993-08.org.debian:01:8d794081cd6a
root@compute1:/home/s1# iscsiadm -m session tcp: [10] 192.168.1.24:3260,1 iqn.2010-10.org.openstack:volume-5cfc715d-a7b3-47b4-bded-44c0a228360c tcp: [11] 192.168.1.19:3260,1 iqn.2010-10.org.openstack:volume-4039eb07-90eb-4a92-8fd3-e3514cb4969b tcp: [14] 192.168.1.29:3260,1 iqn.2010-10.org.openstack:volume-3f204086-609e-449f-90a1-3a0d2c92c525 tcp: [16] 10.0.1.29:3260,1 iqn.2010-10.org.openstack:volume-1b7f6669-06db-474e-bf78-4feea529be5b tcp: [6] 192.168.1.24:3260,1 iqn.2010-10.org.openstack:volume-39363c5f-cf3c-4461-af83-00314839f05a tcp: [9] 192.168.1.24:3260,1 iqn.2010-10.org.openstack:volume-a0a7ccb3-8864-4fd0-aee2-0e20d43ba8dd
每一個target的詳細信息:
tgtadm --lld iscsi --op show --mode target Target 1: iqn.2010-10.org.openstack:volume-136354c3-5920-46b9-a930-52c055c53295 System information: Driver: iscsi State: ready I_T nexus information: I_T nexus: 2 Initiator: iqn.1993-08.org.debian:01:8d794081cd6a alias: compute1 Connection: 0 IP Address: 192.168.1.15 LUN information: LUN: 0 Type: controller SCSI ID: IET 00010000 SCSI SN: beaf10 Size: 0 MB, Block size: 1 Online: Yes Removable media: No Prevent removal: No Readonly: No SWP: No Thin-provisioning: No Backing store type: null Backing store path: None Backing store flags: LUN: 1 Type: disk SCSI ID: IET 00010001 SCSI SN: beaf11 Size: 1074 MB, Block size: 512 Online: Yes Removable media: No Prevent removal: No Readonly: No SWP: No Thin-provisioning: No Backing store type: rdwr Backing store path: /dev/cinder-volumes/volume-136354c3-5920-46b9-a930-52c055c53295 Backing store flags: Account information: s6KdhjSUrU2meEyxPTDZ ACL information: ALL
上圖說明:
下面講講幾個比較有意思的操做。
兩步走:
多種可能的狀況:
關於RPC: cinder內部各組件之間使用基於RabbitMQ的RPC通訊。cinder-scheduler和cinder-volume分別 會 建立RPC鏈接,啓動消費者線程,而後等待隊列消息。當輪詢查詢到消息到達後,建立線程處理相關消息。
主要服務接口, 負責接受和處理外界的API請求,並將請求放入RabbitMQ隊列,交由後端執行。
cinder-api提供兩個版本的REST API:V1提供Volume,Vloume type,Snapshot操做的API;V2增長了QoS,Limits,Backup操做的API。
除了V1和V2文檔列出來的API外,一些volume的操做須要經過POST + action的方式實現,好比extend volume:
POST http://controller:8776/v1/fa2046aaead44a698de8268f94759fc1/volumes/8e87490c-fa18-4cff-b10e-27645c2a7b99/action
Action body: {"os-extend": {"new_size": 2}}
此類操做有:
cinder-api service 的啓動過程分析見 探索 OpenStack 之(11):cinder-api Service 啓動過程分析 以及 WSGI / Paste deploy / Router 等介紹 (2015-02-04 16:01)
cinder-scheduler的用途是在多backend環境中決定新建volume的放置host:
0。 首先判斷host的狀態,只有service狀態爲up的host纔會被考慮。
1。建立volume的時候,根據filter和weight算法選出最優的host來建立volume。
2。遷移volume的時候,根據filter和weight算法來判斷目的host是否是符合要求。
若是選出一個host,則使用RPC調用cinder-volume來執行volume操做。
爲了維護host的狀態,cinder-scheduler接受定時的host上cinder-volume狀態上報:
2015-01-12 02:02:56.688 828 DEBUG cinder.scheduler.host_manager [req-403ef666-5551-4f31-a130-7bcad8e9d1ec - - - - -] Received volume service update from block2@lvmdriver-b21: {u'pools': [{u'pool_name': u'lvmbackend', u'QoS_support': False, u'allocated_capacity_gb': 1, u'free_capacity_gb': 3.34, u'location_info': u'LVMVolumeDriver:block2:cinder-volumes1:default:0', u'total_capacity_gb': 5.34, u'reserved_percentage': 0}], u'driver_version': u'2.0.0', u'vendor_name': u'Open Source', u'volume_backend_name': u'lvmbackend', u'storage_protocol': u'iSCSI'} update_service_capabilities /usr/lib/python2.7/dist-packages/cinder/scheduler/host_manager.py:434
默認的filter包括 AvailabilityZoneFilter,CapacityFilter,CapabilitiesFilter。其中:
通過以上Filter的過濾,cinder-scheduler會獲得符合條件的host列表,而後進入weighting環節,根據weighting算法選出最優的host。獲得空列表則報No valid host was found錯誤。
cinder.conf中,scheduler_default_filters不設置的話,cinder-scheduler默認會使用這三個filter。
CapacityWeigher:有最大可以使用空間的host勝出。可設置capacity_weight_multiplier爲負值來反轉算法,其默認值爲1
ChanceWeigher:隨機從過濾出的host中選擇一個host
通過此步驟,cinder-scheduler將獲得一個weighted_hosts列表,它將會選擇第一個host作爲volume的目的host,把它加到retry_hosts列表中,而後經過RPC調用上面的cinder-volume來建立volume。
cinder.conf中,scheduler_default_weighers不設置的話,cinder-scheduler默認使用 CapacityWeigher。
用戶能夠在cinder.conf中使用scheduler_max_attempts來配置volume建立失敗時候的重試次數,默認次數爲3,值爲1則表示不使用重試機制。
# Maximum number of attempts to schedule an volume (integer value)
#scheduler_max_attempts=3
cinder-sheduler和cinder-volume之間會傳遞當前是重試次數。若是volume建立失敗,cinder-volume會經過RPC從新調用cinder-scheduler去建立volume,cinder-scheduler會檢查當前的重試次數是否是超過最大可重試次數。若是沒超過,它會選擇下一個可使用的host去從新建立volume。若是在規定的重試次數內仍然沒法建立volume,那麼會報No valid host was found錯誤。
好比下面的重試過程:
cinder-volume:
Attempt to create a volume by efficiently copying image to volume. If both source and target are backed by gpfs storage and the source image is in raw format move the image to create a volume using either gpfs clone operation or with a file copy. If the image format is not raw, convert it to raw at the volume path.
b。若driver的clone-image方法不成功,則執行Cinder的默認方法:(1)建立一個raw的volume,設置其狀態爲downloading (2)將image下載並拷貝到該volume。具體方法每一個driver能夠自行實現,Cinder也提供默認實現。
c。拷貝image的metadata到volume的metadata。
a。獲取snapshot
b。Cinder不提供默認實現方式,它調用各driver的create_volume_from_snapshot方法建立volume。以IBM SVC爲例,它會在SVC存儲上建立snapshot的一個拷貝。
c。若是snapshot是bootable的話,須要拷貝它的metadata到新的volume上。
a。獲取源volume
b。Cinder不提供默認實現方式,它須要調用各driver的create_cloned_volume方法來建立volume。以IBM SVC爲例,它會在存儲上建立源volume的一個拷貝。
c。若是源volume是bootable的話,須要拷貝它的metadata到新的volume上。
默認的話,cinder-volume會調用各driver建立一個原始的volume。