-
1.理解塊存儲服務
操作系統獲得存儲空間的方式一般有兩種:
通過某種協議(SAS,SCSI,SAN,iSCSI 等)掛接裸硬盤,然后分區、格式化、創建文件系統;或者直接使用裸硬盤存儲數據(數據庫)
通過 NFS、CIFS 等 協議,mount 遠程的文件系統
第一種裸硬盤的方式叫做 Block Storage(塊存儲),每個裸硬盤通常也稱作 Volume(卷)
第二種叫做文件系統存儲。NAS 和 NFS 服務器,以及各種分布式文件系統提供的都是這種存儲。
OpenStack 提供 Block Storage Service 的是 Cinder,其具體功能是:
①提供 REST API 使用戶能夠查詢和管理 volume、volume snapshot 以及 volume type
②提供 scheduler 調度 volume 創建請求,合理優化存儲資源的分配
③通過 driver 架構支持多種 back-end(后端)存儲方式,包括 LVM,NFS,Ceph,GlusterFS
-
2.Cinder 架構以及塊存儲服務組件介紹
Cinder邏輯架構圖:
cinder不是一個存儲軟件,而是屬於管理存儲軟件。塊存儲服務通常包含下列組件:
cinder-api: 接受API請求,調用 cinder-volume 執行操作。
cinder-volume:與塊存儲服務和例如“cinder scheduler”的進程進行交互
cinder-scheduler守護進程:scheduler 通過調度算法選擇最合適的存儲節點創建 volume,和nova-scheduler類似
cinder-backup daemon:備份進程
消息隊列:Cinder 各個子服務通過消息隊列實現進程間通信和相互協作。因為有了消息隊列,子服務之間實現了解耦,這種松散的結構也是分布式系統的重要特征。
Database:Cinder 有一些數據需要存放到數據庫中,一般使用 MySQL。數據庫是安裝在控制節點上的,比如實驗環境中,可以訪問名稱為“cinder”的數據庫。
-
3.物理部署方案
Cinder 的服務會部署在兩類節點上,控制節點和存儲節點。
查看當前計算節點cinder的相關服務
[root@linux-node1 ~]# ps -e |grep cinder 1150 ? 01:19:09 cinder-api 2025 ? 00:02:15 cinder-api 3357 ? 00:17:16 cinder-schedule 24069 ? 00:27:01 cinder-volume 24089 ? 00:04:19 cinder-volume
cinder-api和cinder-schedule都部署在控制節點上,這無可厚非,思考:但是cinder-volume是否應該部署在存儲節點上呢?
實際上,OpenStack是一個分布式系統,其每個組件的子服務都可以部署在任何節點上,只需要網絡可通,這也表明了OpenStack的靈活性。無論哪個節點,只要運行了cinder-volume,它就是一個存儲節點。同時,存儲節點也可以部署其他組件的子服務。
-
4.安裝組件並配置
(1)安裝軟件包
[root@linux-node1 ~]# yum install -y openstack-cinder
(2)修改配置:/etc/cinder/cinder.conf
[root@linux-node1 ~]# vim /etc/cinder/cinder.conf [database] <==配置數據庫訪問 connection = mysql+pymysql://cinder:cinder@192.168.56.11/cinder [DEFAULT] transport_url = rabbit://openstack:openstack@192.168.56.11 <==配置RabbitMQ消息隊列訪問權限 auth_strategy = keystone <==啟動用keystoen認證 [keystone_authtoken] <==配置認證服務訪問 auth_uri = http://192.168.56.11:5000 auth_url = http://192.168.56.11:35357 memcached_servers = 192.168.56.11:11211 auth_type = password project_domain_name = default user_domain_name = default project_name = service username = cinder password = cinder [oslo_concurrency] <==配置鎖路徑 lock_path = /var/lib/cinder/tmp 查看配置: [root@linux-node1 ~]# grep "^[a-z]" /etc/cinder/cinder.conf auth_strategy = keystone transport_url = rabbit://openstack:openstack@192.168.56.11 connection = mysql+pymysql://cinder:cinder@192.168.56.11/cinder auth_uri = http://192.168.56.11:5000 auth_url = http://192.168.56.11:35357 memcached_servers = 192.168.56.11:11211 auth_type = password project_domain_name = default user_domain_name = default project_name = service username = cinder password = cinder lock_path = /var/lib/cinder/tmp
-
5.初始化塊存儲服務的數據庫,並驗證
[root@linux-node1 ~]# su -s /bin/sh -c "cinder-manage db sync" cinder [root@linux-node1 ~]# mysql -h 192.168.56.11 -ucinder -pcinder -e "use cinder;show tables;"
-
6.配置計算服務以使用塊設備存儲
[root@linux-node1 ~]# vim /etc/nova/nova.conf
[cinder]
os_region_name=RegionOne
-
7.完成安裝
[root@linux-node1 ~]# systemctl restart openstack-nova-api.service [root@linux-node1 ~]# systemctl enable openstack-cinder-api.service openstack-cinder-scheduler.service [root@linux-node1 ~]# systemctl start openstack-cinder-api.service openstack-cinder-scheduler.service
-
8.創建cinder和cinderv2服務實體
[root@linux-node1 ~]# openstack service create --name cinder \ > --description "OpenStack Block Storage" volume +-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | OpenStack Block Storage | | enabled | True | | id | c63c93beff014724b036a811e2b0d591 | | name | cinder | | type | volume | +-------------+----------------------------------+ [root@linux-node1 ~]# openstack service create --name cinderv2 \ > --description "OpenStack Block Storage" volumev2 +-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | OpenStack Block Storage | | enabled | True | | id | 6829915c1f9745409ca9bda364fe26c4 | | name | cinderv2 | | type | volumev2 | +-------------+----------------------------------+
-
9.創建塊設備存儲服務的API入口點
[root@linux-node1 ~]# openstack endpoint create --region RegionOne \ volume public http://192.168.56.11:8776/v1/%\(tenant_id\)s [root@linux-node1 ~]# openstack endpoint create --region RegionOne \ volume internal http://192.168.56.11:8776/v1/%\(tenant_id\)s [root@linux-node1 ~]# openstack endpoint create --region RegionOne \ volume admin http://192.168.56.11:8776/v1/%\(tenant_id\)s [root@linux-node1 ~]# openstack endpoint create --region RegionOne \ volumev2 public http://192.168.56.11:8776/v2/%\(tenant_id\)s [root@linux-node1 ~]# openstack endpoint create --region RegionOne \ volumev2 internal http://192.168.56.11:8776/v2/%\(tenant_id\)s [root@linux-node1 ~]# openstack endpoint create --region RegionOne \ volumev2 admin http://192.168.56.11:8776/v2/%\(tenant_id\)s [root@linux-node1 ~]# openstack service list +----------------------------------+----------+----------+ | ID | Name | Type | +----------------------------------+----------+----------+ | 18b41a6647e84ef68c5df6058c2f4eab | glance | image | | 436e446b475a46fa978349211d6c64eb | keystone | identity | | 613a3d7e61574fdbb7c330f6892a1b50 | neutron | network | | 6829915c1f9745409ca9bda364fe26c4 | cinderv2 | volumev2 | | 7347593df9034e369d27caf8f0240470 | nova | compute | | c63c93beff014724b036a811e2b0d591 | cinder | volume | +----------------------------------+----------+----------+ [root@linux-node1 ~]# openstack endpoint list +----------------------------------+-----------+--------------+--------------+---------+-----------+----------------------------------------------+ | ID | Region | Service Name | Service Type | Enabled | Interface | URL | +----------------------------------+-----------+--------------+--------------+---------+-----------+----------------------------------------------+ | 0ae3e6275b4c4c20a7e8619909726bd4 | RegionOne | cinder | volume | True | internal | http://192.168.56.11:8776/v1/%(tenant_id)s | | 1fba971a2dc6424eaa06ef61c910e739 | RegionOne | cinder | volume | True | admin | http://192.168.56.11:8776/v1/%(tenant_id)s | | 20222ecb6eeb4f378035e79c47810b08 | RegionOne | keystone | identity | True | public | http://192.168.56.11:5000/v3/ | | 45fd632b46684fdca9782a1e23b91f8c | RegionOne | glance | image | True | admin | http://192.168.56.11:9292 | | 64f9ee02b5d0489598f31e164d40e6df | RegionOne | nova | compute | True | public | http://192.168.56.11:8774/v2.1/%(tenant_id)s | | 6cc75ee06e5245059e106e89e1643a92 | RegionOne | keystone | identity | True | internal | http://192.168.56.11:35357/v3/ | | 77f141dede894dea877d505b60e60de7 | RegionOne | nova | compute | True | internal | http://192.168.56.11:8774/v2.1/%(tenant_id)s | | 7883d0f227a54ac5a0db3ad3a02606df | RegionOne | nova | compute | True | admin | http://192.168.56.11:8774/v2.1/%(tenant_id)s | | 7c7b33e8c2ac431aa7380ceeac80fb37 | RegionOne | keystone | identity | True | admin | http://192.168.56.11:35357/v3/ | | 84e4273b741148e2a2d9c71d2c62da1e | RegionOne | cinder | volume | True | public | http://192.168.56.11:8776/v1/%(tenant_id)s | | abd82401a31d453ca2e28fc17816fd6c | RegionOne | neutron | network | True | public | http://192.168.56.11:9696 | | af72b7e0d3824c1e82663d06c1bd0205 | RegionOne | glance | image | True | internal | http://192.168.56.11:9292 | | cb6a870ba8a543ee882afe4b07d3c087 | RegionOne | neutron | network | True | admin | http://192.168.56.11:9696 | | e27bccfa73984db889f9373f288b4c67 | RegionOne | cinderv2 | volumev2 | True | internal | http://192.168.56.11:8776/v2/%(tenant_id)s | | e3a7e437be8a4cf1968c82ceca932d57 | RegionOne | glance | image | True | public | http://192.168.56.11:9292 | | e54250bd44384b15b5bbf1bb6eb34337 | RegionOne | cinderv2 | volumev2 | True | admin | http://192.168.56.11:8776/v2/%(tenant_id)s | | eba3e70ff0a44ab28898169f4807145f | RegionOne | cinderv2 | volumev2 | True | public | http://192.168.56.11:8776/v2/%(tenant_id)s | | f5c7dad4452840d788ed59c905efb3e7 | RegionOne | neutron | network | True | internal | http://192.168.56.11:9696 | +----------------------------------+-----------+--------------+--------------+---------+-----------+----------------
-
10.cinder-scheduler的調度
創建 Volume 時,cinder-scheduler 會基於容量、Volume Type 等條件選擇出最合適的存儲節點,然后讓其創建 Volume。
Filter scheduler 是 cinder-scheduler 默認的調度器。
scheduler_driver = cinder.scheduler.filter_scheduler.FilterScheduler
scheduler 調度過程如下:
通過過濾器(filter)選擇滿足條件的存儲節點(運行 cinder-volume)
通過權重計算(weighting)選擇最優(權重值最大)的存儲節點。