一隧期、cinder 介紹:
理解 Block Storage
操作系統(tǒng)獲得存儲空間的方式一般有兩種:
通過某種協(xié)議(SAS,SCSI,SAN,iSCSI 等)掛接裸硬盤激才,然后分區(qū)、格式化、創(chuàng)建文件系統(tǒng)绊诲;或者直接使用裸硬盤存儲數(shù)據(jù)(數(shù)據(jù)庫)
通過 NFS、CIFS 等 協(xié)議褪贵,mount 遠程的文件系統(tǒng)
第一種裸硬盤的方式叫做 Block Storage(塊存儲)掂之,每個裸硬盤通常也稱作 Volume(卷) 第二種叫做文件系統(tǒng)存儲。NAS 和 NFS 服務器脆丁,以及各種分布式文件系統(tǒng)提供的都是這種存儲世舰。
理解 Block Storage Service
Block Storage Servicet 提供對 volume 從創(chuàng)建到刪除整個生命周期的管理。從 instance 的角度看槽卫,掛載的每一個 Volume 都是一塊硬盤跟压。OpenStack 提供 Block Storage Service 的是 Cinder,其具體功能是:
提供 REST API 使用戶能夠查詢和管理 volume歼培、volume snapshot 以及 volume type
提供 scheduler 調(diào)度 volume 創(chuàng)建請求震蒋,合理優(yōu)化存儲資源的分配
通過 driver 架構(gòu)支持多種 back-end(后端)存儲方式,包括 LVM躲庄,NFS查剖,Ceph 和其他諸如 EMC、IBM 等商業(yè)存儲產(chǎn)品和方案
Cinder 架構(gòu)
下圖是 cinder 的邏輯架構(gòu)圖
Cinder 包含如下幾個組件:
cinder-api
接收 API 請求噪窘, 調(diào)用 cinder-volume 笋庄。是整個 Cinder 組件的門戶,所有 cinder 的請求都首先由 cinder-api 處理倔监。cinder-api 向外界暴露若干 HTTP REST API 接口直砂。在 keystone 中我們可以查詢 cinder-api 的 endponits。
客戶端可以將請求發(fā)送到 endponits 指定的地址丐枉,向 cinder-api 請求操作。 當然掘托,作為最終用戶的我們不會直接發(fā)送 Rest API 請求瘦锹。OpenStack CLI,Dashboard 和其他需要跟 Cinder 交換的組件會使用這些 API。
cinder-api 對接收到的 HTTP API 請求會做如下處理:
1弯院、檢查客戶端傳人的參數(shù)是否合法有效
2辱士、調(diào)用 cinder 其他子服務的處理客戶端請求
3、將 cinder 其他子服務返回的結(jié)果序列號并返回給客戶端
cinder-api 接受哪些請求呢听绳?簡單的說颂碘,只要是 Volume 生命周期相關(guān)的操作,cinder-api 都可以響應椅挣。大部分操作都可以在 Dashboard 上看到头岔。
cinder-volume
管理 volume 的服務,與 volume provider 協(xié)調(diào)工作鼠证,管理 volume 的生命周期峡竣。運行 cinder-volume 服務的節(jié)點被稱作為存儲節(jié)點。
cinder-volume 在存儲節(jié)點上運行量九,OpenStack 對 Volume 的操作适掰,最后都是交給 cinder-volume 來完成的。cinder-volume 自身并不管理真正的存儲設(shè)備荠列,存儲設(shè)備是由 volume provider 管理的类浪。cinder-volume 與 volume provider 一起實現(xiàn) volume 生命周期的管理。
通過 Driver 架構(gòu)支持多種 Volume Provider
接著的問題是:現(xiàn)在市面上有這么多塊存儲產(chǎn)品和方案(volume provider)肌似,cinder-volume 如何與它們配合呢费就?
通過的 Driver 架構(gòu)。 cinder-volume 為這些 volume provider 定義了統(tǒng)一的接口锈嫩,volume provider 只需要實現(xiàn)這些接口受楼,就可以 Driver 的形式即插即用到 OpenStack 系統(tǒng)中。
定期向 OpenStack 報告計算節(jié)點的狀態(tài)
cinder-volume 會定期向 Cinder 報告存儲節(jié)點的空閑容量來做篩選啟動volume
實現(xiàn) volume 生命周期管理
Cinder 對 volume 的生命周期的管理最終都是通過 cinder-volume 完成的呼寸,包括 volume 的 create艳汽、extend、attach对雪、snapshot河狐、delete 等。
cinder-scheduler
scheduler 通過調(diào)度算法選擇最合適的存儲節(jié)點創(chuàng)建 volume瑟捣。 創(chuàng)建 Volume 時馋艺,cinder-scheduler 會基于容量、Volume Type 等條件選擇出最合適的存儲節(jié)點迈套,然后讓其創(chuàng)建 Volume
volume provider
數(shù)據(jù)的存儲設(shè)備捐祠,為 volume 提供物理存儲空間。 cinder-volume 支持多種 volume provider桑李,每種 volume provider 通過自己的 driver 與cinder-volume 協(xié)調(diào)工作踱蛀。
Message Queue
Cinder 各個子服務通過消息隊列實現(xiàn)進程間通信和相互協(xié)作窿给。因為有了消息隊列,子服務之間實現(xiàn)了解耦率拒,這種松散的結(jié)構(gòu)也是分布式系統(tǒng)的重要特征崩泡。
Database Cinder
有一些數(shù)據(jù)需要存放到數(shù)據(jù)庫中,一般使用 MySQL猬膨。數(shù)據(jù)庫是安裝在控制節(jié)點上的枝誊,比如在我們的實驗環(huán)境中竭望,可以訪問名稱為“cinder”的數(shù)據(jù)庫。
物理部署方案
Cinder 的服務會部署在兩類節(jié)點上,控制節(jié)點和存儲節(jié)點止剖。我們來看看控制節(jié)點 controller 上都運行了哪些 cinder-* 子服務亚茬。
cinder-api 和 cinder-scheduler 部署在控制節(jié)點上般渡,這個很合理蚕脏。
至于 cinder-volume 也在控制節(jié)點上可能有些同學就會迷糊了:cinder-volume 不是應該部署在存儲節(jié)點上嗎?
要回答這個問題污它,首先要搞清楚一個事實: OpenStack 是分布式系統(tǒng)剖踊,其每個子服務都可以部署在任何地方,只要網(wǎng)絡(luò)能夠連通衫贬。無論是哪個節(jié)點德澈,只要上面運行了 cinder-volume,它就是一個存儲節(jié)點固惯,當然梆造,該節(jié)點上也可以運行其他 OpenStack服務。
cinder-volume 是一頂存儲節(jié)點帽子葬毫,cinder-api 是一頂控制節(jié)點帽子镇辉。在我們的環(huán)境中,devstack-controller 同時戴上了這兩頂帽子贴捡,所以它既是控制節(jié)點忽肛,又是存儲節(jié)點。當然烂斋,我們也可以用一個專門的節(jié)點來運行 cinder-volume屹逛。
這再一次展示了 OpenStack 分布式架構(gòu)部署上的靈活性: 可以將所有服務都放在一臺物理機上,用作一個 All-in-One 的測試環(huán)境汛骂;而在生產(chǎn)環(huán)境中可以將服務部署在多臺物理機上罕模,獲得更好的性能和高可用。
RabbitMQ 和 MySQL 通常放在控制節(jié)點上帘瞭。另外淑掌,也可以用 cinder service list 查看 cinder-* 子服務都分布在哪些節(jié)點上
還有一個問題:volume provider 放在那里?
一般來講蝶念,volume provider 是獨立的抛腕。cinder-volume 使用 driver 與 volume provider 通信并協(xié)調(diào)工作诈悍。所以只需要將 driver 與 cinder-volume 放到一起就可以了。在 cinder-volume 的源代碼目錄下有很多 driver兽埃,支持不同的 volume provider。
后面我們會以 LVM 和 NFS 這兩種 volume provider 為例討論 cinder-volume 的使用适袜,其他 volume provider 可以查看 OpenStack 的 configuration 文檔柄错。
二、 Cinder 的設(shè)計思想:
從 volume 創(chuàng)建流程看 cinder- 子服務如何協(xié)同工作*
對于 Cinder 學習來說苦酱,Volume 創(chuàng)建是一個非常好的場景售貌,涉及各個 cinder-* 子服務,下面是流程圖:
客戶(可以是 OpenStack 最終用戶疫萤,也可以是其他程序)向 API(cinder-api)發(fā)送請求:“幫我創(chuàng)建一個 volume”
API 對請求做一些必要處理后颂跨,向 Messaging(RabbitMQ)發(fā)送了一條消息:“讓 Scheduler 創(chuàng)建一個 volume”
Scheduler(cinder-scheduler)從 Messaging 獲取到 API 發(fā)給它的消息,然后執(zhí)行調(diào)度算法扯饶,從若干計存儲點中選出節(jié)點 A
Scheduler 向 Messaging 發(fā)送了一條消息:“讓存儲節(jié)點 A 創(chuàng)建這個 volume”
存儲節(jié)點 A 的 Volume(cinder-volume)從 Messaging 中獲取到 Scheduler 發(fā)給它的消息恒削,然后通過 driver 在 volume provider 上創(chuàng)建 volume。
Cinder 的設(shè)計思想
Cinder 延續(xù)了 Nova 的以及其他組件的設(shè)計思想尾序。
API 前端服務
cinder-api 作為 Cinder 組件對外的唯一窗口钓丰,向客戶暴露 Cinder 能夠提供的功能,當客戶需要執(zhí)行 volume 相關(guān)的操作每币,能且只能向 cinder-api 發(fā)送 REST 請求携丁。這里的客戶包括終端用戶、命令行和 OpenStack 其他組件兰怠。
設(shè)計 API 前端服務的好處在于:
對外提供統(tǒng)一接口梦鉴,隱藏實現(xiàn)細節(jié)
API 提供 REST 標準調(diào)用服務,便于與第三方系統(tǒng)集成
可以通過運行多個 API 服務實例輕松實現(xiàn) API 的高可用揭保,比如運行多個 cinder-api 進程
Scheduler 調(diào)度服務
Cinder 可以有多個存儲節(jié)點肥橙,當需要創(chuàng)建 volume 時,cinder-scheduler 會根據(jù)存儲節(jié)點的屬性和資源使用情況選擇一個最合適的節(jié)點來創(chuàng)建 volume掖举。
調(diào)度服務就好比是一個開發(fā)團隊中的項目經(jīng)理快骗,當接到新的開發(fā)任務時,項目經(jīng)理會根據(jù)任務的難度塔次,每個團隊成員目前的工作負荷和技能水平方篮,將任務分配給最合適的開發(fā)人員。
Worker 工作服務
調(diào)度服務只管分配任務励负,真正執(zhí)行任務的是 Worker 工作服務藕溅。
在 Cinder 中,這個 Worker 就是 cinder-volume 了继榆。這種 Scheduler 和 Worker 之間職能上的劃分使得 OpenStack 非常容易擴展:當存儲資源不夠時可以增加存儲節(jié)點(增加 Worker)巾表。 當客戶的請求量太大調(diào)度不過來時汁掠,可以增加 Scheduler。
Driver 框架
OpenStack 作為開放的 Infrastracture as a Service 云操作系統(tǒng)集币,支持業(yè)界各種優(yōu)秀的技術(shù)考阱,這些技術(shù)可能是開源免費的,也可能是商業(yè)收費的鞠苟。
這種開放的架構(gòu)使得 OpenStack 保持技術(shù)上的先進性乞榨,具有很強的競爭力,同時又不會造成廠商鎖定(Lock-in)当娱。 那 OpenStack 的這種開放性體現(xiàn)在哪里呢吃既?一個重要的方面就是采用基于 Driver 的框架。
以 Cinder 為例跨细,存儲節(jié)點支持多種 volume provider鹦倚,包括 LVM, NFS, Ceph, GlusterFS,以及 EMC, IBM 等商業(yè)存儲系統(tǒng)冀惭。 cinder-volume 為這些 volume provider 定義了統(tǒng)一的 driver 接口震叙,volume provider 只需要實現(xiàn)這些接口,就可以 driver 的形式即插即用到 OpenStack 中散休。下面是 cinder driver 的架構(gòu)示意圖:
在 cinder-volume 的配置文件 /etc/cinder/cinder.conf 中 volume_driver 配置項設(shè)置該存儲節(jié)點使用哪種 volume provider 的 driver捐友,下面的示例表示使用的是 LVM。
三溃槐、 Cinder 的配置文件(主要修改信息):
vim /etc/cinder/cinder.conf
[DEFAULT]
本機的IP地址
my_ip = 172.16.254.63
(存儲節(jié)點)glance的主配置程序的地址
glance_api_servers = [http://controller:9292](http://controller:9292/)
認證策略
auth_strategy = keystone
(存儲節(jié)點)打開后端節(jié)點的lvm
enabled_backends = lvm
rabbit消息列隊的用戶和密碼以及控制端ip
transport_url = [rabbit://openstack:admin@controller](rabbit://openstack:admin@controller/)
[backend]
[barbican]
[brcd_fabric_example]
[cisco_fabric_example]
[coordination]
[cors]
[cors.subdomain]
[database]
遠程登錄數(shù)據(jù)庫配置
connection = mysql+[pymysql://cinder:CINDER_DBPASS@controller/cinder](pymysql://cinder:CINDER_DBPASS@controller/cinder)
[fc-zone-manager]
[healthcheck]
[key_manager]
[keystone_authtoken](主控制和存儲都要配置)
keystone外部服務端口地址
auth_uri = [http://controller:5000](http://controller:5000/)
keystone管理服務端口地址
auth_url = [http://controller:35357](http://controller:35357/)
緩存服務端口地址
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = cinder
password = cinder
[matchmaker_redis]
[oslo_concurrency]
lock_path = /var/lib/cinder/tmp
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_messaging_zmq]
[oslo_middleware]
[oslo_policy]
[oslo_reports]
[oslo_versionedobjects]
[profiler]
[ssl]
[lvm](存儲節(jié)點配置)
卷組的驅(qū)動對接方式
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
卷組名匣砖,跟創(chuàng)建的卷組保持一致
volume_group = cinder-vg
卷組的保存位置
volumes_dir = $state_path/volumes
iscsi協(xié)議傳輸數(shù)據(jù)
iscsi_protocol = iscsi
連接方式
iscsi_helper = lioadm
存儲節(jié)點的ip地址
iscsi_ip_address = 172.16.254.63
四、 Cinder 的配置文件(原版)
[DEFAULT]
my_ip = 172.16.254.63
glance_api_servers = [http://controller:9292](http://controller:9292/)
auth_strategy = keystone
enabled_backends = lvm
transport_url = [rabbit://openstack:admin@controller](rabbit://openstack:admin@controller/)
[backend]
[barbican]
[brcd_fabric_example]
[cisco_fabric_example]
[coordination]
[cors]
[cors.subdomain]
[database]
connection = mysql+[pymysql://cinder:CINDER_DBPASS@controller/cinder](pymysql://cinder:CINDER_DBPASS@controller/cinder)
[fc-zone-manager]
[healthcheck]
[key_manager]
[keystone_authtoken]
auth_uri = [http://controller:5000](http://controller:5000/)
auth_url = [http://controller:35357](http://controller:35357/)
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = cinder
password = cinder
[matchmaker_redis]
[oslo_concurrency]
lock_path = /var/lib/cinder/tmp
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_messaging_zmq]
[oslo_middleware]
[oslo_policy]
[oslo_reports]
[oslo_versionedobjects]
[profiler]
[ssl]
[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-vg
volumes_dir = $state_path/volumes
iscsi_protocol = iscsi
iscsi_helper = lioadm
iscsi_ip_address = 172.16.254.63