OpenStack组件——cinder存储服务
1.cinder 介绍
1)理解 Block Storage
操作系统获得存储空间的方式一般有两种:
(1)通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区、格式化、创建文件系统;或者直接使用裸硬盘存储数据(数据库)
(2)通过 NFS、CIFS 等 协议,mount 远程的文件系统
第一种裸硬盘的方式叫做 Block Storage(块存储),每个裸硬盘通常也称作 Volume(卷) 第二种叫做文件系统存储。NAS 和 NFS 服务器,以及各种分布式文件系统提供的都是这种存储。
2)理解 Block Storage Service
Block Storage Servicet 提供对 volume 从创建到删除整个生命周期的管理。从 instance 的角度看,挂载的每一个 Volume 都是一块硬盘。OpenStack 提供 Block Storage Service 的是 Cinder,其具体功能是:
(1)提供 REST API 使用户能够查询和管理 volume、volume snapshot 以及 volume type
(2)提供 scheduler 调度 volume 创建请求,合理优化存储资源的分配
(3)通过 driver 架构支持多种 back-end(后端)存储方式,包括 LVM,NFS,Ceph 和其他诸如 EMC、IBM 等商业存储产品和方案
3)Cinder 架构
下图是 cinder
的逻辑架构图
Cinder 包含如下几个组件
(1)cinder-api
接收 API 请求, 调用 cinder-volume 。是整个 Cinder 组件的门户,所有 cinder 的请求都首先由 cinder-api 处理。cinder-api 向外界暴露若干 HTTP REST API 接口。在 keystone 中我们可以查询 cinder-api 的 endponits。
客户端可以将请求发送到
endponits 指定的地址,向 cinder-api 请求操作。 当然,作为最终用户的我们不会直接发送 Rest API 请求。OpenStack CLI,Dashboard 和其他需要跟 Cinder 交换的组件会使用这些 API。
cinder-api 对接收到的 HTTP API 请求会做如下处理:
a)检查客户端传人的参数是否合法有效
b)调用 cinder 其他子服务的处理客户端请求
c)将 cinder 其他子服务返回的结果序列号并返回给客户端
cinder-api 接受哪些请求呢?简单的说,只要是 Volume 生命周期相关的操作,cinder-api 都可以响应。大部分操作都可以在 Dashboard 上看到。
(2)cinder-volume
管理 volume
的服务,与 volume provider 协调工作,管理 volume 的生命周期。运行 cinder-volume 服务的节点被称作为存储节点。
cinder-volume 在存储节点上运行,OpenStack 对 Volume 的操作,最后都是交给 cinder-volume 来完成的。cinder-volume 自身并不管理真正的存储设备,存储设备是由 volume provider 管理的。cinder-volume 与 volume provider 一起实现 volume 生命周期的管理。
a)通过 Driver 架构支持多种 Volume Provider
接着的问题是:现在市面上有这么多块存储产品和方案(volume provider),cinder-volume 如何与它们配合呢?
通过的 Driver
架构。 cinder-volume 为这些 volume provider 定义了统一的接口,volume provider 只需要实现这些接口,就可以 Driver 的形式即插即用到 OpenStack 系统中。
b)定期向 OpenStack 报告计算节点的状态
cinder-volume 会定期向 Cinder 报告存储节点的空闲容量来做筛选启动volume
c)实现 volume 生命周期管理
Cinder 对 volume 的生命周期的管理最终都是通过 cinder-volume 完成的,包括 volume 的 create、extend、attach、snapshot、delete 等。
(3)cinder-scheduler
scheduler 通过调度算法选择最合适的存储节点创建 volume。 创建 Volume 时,cinder-scheduler
会基于容量、Volume Type 等条件选择出最合适的存储节点,然后让其创建 Volume
(4)volume provider
数据的存储设备,为 volume
提供物理存储空间。 cinder-volume 支持多种 volume provider,每种 volume provider 通过自己的 driver 与cinder-volume 协调工作。
(5)Message Queue
Cinder 各个子服务通过消息队列实现进程间通信和相互协作。因为有了消息队列,子服务之间实现了解耦,这种松散的结构也是分布式系统的重要特征。
(6)Database Cinder
有一些数据需要存放到数据库中,一般使用 MySQL。数据库是安装在控制节点上的,比如在我们的实验环境中,可以访问名称为“cinder”的数据库。
4)物理部署方案
Cinder 的服务会部署在两类节点上,控制节点和存储节点。我们来看看控制节点 controller 上都运行了哪些 cinder-* 子服务。
cinder-api 和 cinder-scheduler 部署在控制节点上,这个很合理。
至于
cinder-volume 也在控制节点上可能有些同学就会迷糊了:cinder-volume 不是应该部署在存储节点上吗?
要回答这个问题,首先要搞清楚一个事实: OpenStack 是分布式系统,其每个子服务都可以部署在任何地方,只要网络能够连通。无论是哪个节点,只要上面运行了 cinder-volume,它就是一个存储节点,当然,该节点上也可以运行其他
OpenStack服务。
cinder-volume 是一顶存储节点帽子,cinder-api 是一顶控制节点帽子。在我们的环境中,devstack-controller
同时戴上了这两顶帽子,所以它既是控制节点,又是存储节点。当然,我们也可以用一个专门的节点来运行 cinder-volume。
这再一次展示了
OpenStack 分布式架构部署上的灵活性: 可以将所有服务都放在一台物理机上,用作一个 All-in-One 的测试环境;而在生产环境中可以将服务部署在多台物理机上,获得更好的性能和高可用。
RabbitMQ 和 MySQL 通常放在控制节点上。另外,也可以用 cinder service list 查看 cinder-* 子服务都分布在哪些节点上
还有一个问题:volume
provider 放在那里?
一般来讲,volume
provider 是独立的。cinder-volume 使用 driver 与 volume provider 通信并协调工作。所以只需要将 driver 与 cinder-volume 放到一起就可以了。在 cinder-volume 的源代码目录下有很多 driver,支持不同的 volume provider。
后面我们会以 LVM 和 NFS 这两种 volume provider 为例讨论 cinder-volume 的使用,其他 volume provider 可以查看 OpenStack 的 configuration 文档。
2. Cinder 的设计思想:
1)从 volume 创建流程看 cinder-* 子服务如何协同工作
对于 Cinder
学习来说,Volume 创建是一个非常好的场景,涉及各个 cinder-* 子服务,下面是流程图:
(1)客户(可以是 OpenStack 最终用户,也可以是其他程序)向 API(cinder-api)发送请求:“帮我创建一个 volume”
(2)API 对请求做一些必要处理后,向 Messaging(RabbitMQ)发送了一条消息:“让 Scheduler 创建一个 volume”
(3)Scheduler(cinder-scheduler)从 Messaging 获取到 API 发给它的消息,然后执行调度算法,从若干计存储点中选出节点 A
(4)Scheduler 向 Messaging 发送了一条消息:“让存储节点 A 创建这个 volume”
(5)存储节点 A 的 Volume(cinder-volume)从 Messaging 中获取到 Scheduler 发给它的消息,然后通过 driver 在 volume provider 上创建 volume。
2)Cinder 的设计思想
Cinder 延续了 Nova 的以及其他组件的设计思想。
(1)API 前端服务
cinder-api 作为 Cinder 组件对外的唯一窗口,向客户暴露 Cinder 能够提供的功能,当客户需要执行 volume 相关的操作,能且只能向 cinder-api 发送 REST 请求。这里的客户包括终端用户、命令行和
OpenStack 其他组件。
设计 API 前端服务的好处在于:
a)对外提供统一接口,隐藏实现细节
b)API 提供 REST 标准调用服务,便于与第三方系统集成
c)可以通过运行多个 API 服务实例轻松实现 API 的高可用,比如运行多个 cinder-api 进程
(2)Scheduler 调度服务
Cinder 可以有多个存储节点,当需要创建 volume 时,cinder-scheduler 会根据存储节点的属性和资源使用情况选择一个最合适的节点来创建 volume。
调度服务就好比是一个开发团队中的项目经理,当接到新的开发任务时,项目经理会根据任务的难度,每个团队成员目前的工作负荷和技能水平,将任务分配给最合适的开发人员。
(3)Worker 工作服务
调度服务只管分配任务,真正执行任务的是 Worker 工作服务。
在 Cinder
中,这个 Worker 就是 cinder-volume 了。这种 Scheduler 和 Worker 之间职能上的划分使得 OpenStack 非常容易扩展:当存储资源不够时可以增加存储节点(增加 Worker)。 当客户的请求量太大调度不过来时,可以增加 Scheduler。
(4)Driver 框架
OpenStack 作为开放的 Infrastracture as a Service 云操作系统,支持业界各种优秀的技术,这些技术可能是开源免费的,也可能是商业收费的。
这种开放的架构使得
OpenStack 保持技术上的先进性,具有很强的竞争力,同时又不会造成厂商锁定(Lock-in)。 那 OpenStack 的这种开放性体现在哪里呢?一个重要的方面就是采用基于 Driver
的框架。
以 Cinder
为例,存储节点支持多种 volume provider,包括 LVM, NFS, Ceph, GlusterFS,以及 EMC, IBM 等商业存储系统。 cinder-volume 为这些 volume provider 定义了统一的 driver 接口,volume provider 只需要实现这些接口,就可以 driver 的形式即插即用到 OpenStack 中。下面是 cinder driver 的架构示意图:
在
cinder-volume 的配置文件 /etc/cinder/cinder.conf 中 volume_driver 配置项设置该存储节点使用哪种 volume provider 的 driver,下面的示例表示使用的是 LVM。
3.cinder服务搭建
1)环境准备
(1)数据库准备
create database cinder;
grant all privileges on cinder.* to 'cinder'@'localhost' identified by 'CINDER_DBPASS';
grant all privileges on cinder.* to 'cinder'@'%' identified by 'CINDER_DBPASS';
(2)创建用户、服务
创建cinder用户
openstack user create --domain default --password=cinder cinder
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| domain_id | default |
| enabled | True |
| id | b8b3fd44f25341b79da80dcaf5fd8383 |
| name | cinder |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
将cinder用户设置为admin角色
openstack role add --project service --user cinder admin
创建volume服务
openstack service create --name cinderv2 --description "OpenStack Block Storage" volumev2
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | OpenStack Block Storage |
| enabled | True |
| id | b193feeee389457cad58453c12f42453 |
| name | cinderv2 |
| type | volumev2 |
+-------------+----------------------------------+ openstack service create --name cinderv3 --description "OpenStack Block Storage" volumev3
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | OpenStack Block Storage |
| enabled | True |
| id | b2438b20776946ce918c1b54a36f3a22 |
| name | cinderv3 |
| type | volumev3 |
+-------------+----------------------------------+
(3)创建cinder服务endpoint
openstack endpoint create --region RegionOne volumev2 public http://node1:8776/v2/%\(project_id\)s
+--------------+-------------------------------------+
| Field | Value |
+--------------+-------------------------------------+
| enabled | True |
| id | a84ae2d530d84f1988c478e46290f3df |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | b193feeee389457cad58453c12f42453 |
| service_name | cinderv2 |
| service_type | volumev2 |
| url | http://node1:8776/v2/%(project_id)s |
+--------------+-------------------------------------+ openstack endpoint create --region RegionOne volumev2 internal http://node1:8776/v2/%\(project_id\)s
+--------------+-------------------------------------+
| Field | Value |
+--------------+-------------------------------------+
| enabled | True |
| id | c8494d0ec1864f54a263cfe9d00b1167 |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | b193feeee389457cad58453c12f42453 |
| service_name | cinderv2 |
| service_type | volumev2 |
| url | http://node1:8776/v2/%(project_id)s |
+--------------+-------------------------------------+ openstack endpoint create --region RegionOne volumev2 admin http://node1:8776/v2/%\(project_id\)s
+--------------+-------------------------------------+
| Field | Value |
+--------------+-------------------------------------+
| enabled | True |
| id | 0cb2154bbcf14f57be74a50fbc86d231 |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | b193feeee389457cad58453c12f42453 |
| service_name | cinderv2 |
| service_type | volumev2 |
| url | http://node1:8776/v2/%(project_id)s |
+--------------+-------------------------------------+ openstack endpoint create --region RegionOne volumev3 public http://node1:8776/v3/%\(project_id\)s
+--------------+-------------------------------------+
| Field | Value |
+--------------+-------------------------------------+
| enabled | True |
| id | 3193d7e2959b41158df1a4780065bf34 |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | b2438b20776946ce918c1b54a36f3a22 |
| service_name | cinderv3 |
| service_type | volumev3 |
| url | http://node1:8776/v3/%(project_id)s |
+--------------+-------------------------------------+ openstack endpoint create --region RegionOne volumev2 internal http://node1:8776/v3/%\(project_id\)s
+--------------+-------------------------------------+
| Field | Value |
+--------------+-------------------------------------+
| enabled | True |
| id | 864b120ab68645f19d286200d7b5be2d |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | b193feeee389457cad58453c12f42453 |
| service_name | cinderv2 |
| service_type | volumev2 |
| url | http://node1:8776/v3/%(project_id)s |
+--------------+-------------------------------------+ openstack endpoint create --region RegionOne volumev2 admin http://node1:8776/v3/%\(project_id\)s
+--------------+-------------------------------------+
| Field | Value |
+--------------+-------------------------------------+
| enabled | True |
| id | 08499c458d0b43e783def7b0d2a625c3 |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | b193feeee389457cad58453c12f42453 |
| service_name | cinderv2 |
| service_type | volumev2 |
| url | http://node1:8776/v3/%(project_id)s |
+--------------+-------------------------------------+
2)配置控制节点
(1)安装相关软件
yum install openstack-cinder -y
(2)修改配置文件
vim /etc/cinder/cinder.conf [DEFAULT]
my_ip = 192.168.52.101
#glance_api_servers = http://node1:9292
auth_strategy = keystone
#enabled_backends = lvm
transport_url = rabbit://openstack:admin@node1
...
[database]
connection = mysql+pymysql://cinder:CINDER_DBPASS@node1/cinder
...
[keystone_authtoken]
auth_uri = http://node1:5000
auth_url = http://node1:35357
memcached_servers = node1: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
...
(3)同步数据库
su -s /bin/sh -c "cinder-manage db sync" cinder
(4)配置compute使用块存储服务
vim /etc/nova/nova.conf [cinder]
os_region_name=RegionOne
(5)启动服务
systemctl start openstack-cinder-api.service openstack-cinder-scheduler.service
systemctl enable openstack-cinder-api.service openstack-cinder-scheduler.service
3)准备存储节点环境
(1)安装软件包
yum install lvm2 -y
(2)添加一块硬盘并设置为SATA接口
pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created. vgcreate cinder-vol /dev/sdb
Volume group "cinder-vol" successfully created 修改配置文件
vim /etc/lvm/lvm.conf
devices {
...
filter = [ "a/sdb/", "r/.*/"]
...
(3)启动服务
systemctl enable lvm2-lvmetad.service
systemctl start lvm2-lvmetad.service
4)配置存储节点
(1)安装相关软件包
yum install openstack-cinder targetcli python-keystone
(2)修改配置文件
vim /etc/cinder/cinder.conf [DEFAULT]
my_ip = 192.168.52.101
glance_api_servers = http://node1:9292
auth_strategy = keystone
enabled_backends = lvm
transport_url = rabbit://openstack:admin@node1
...
[database]
connection = mysql+pymysql://cinder:CINDER_DBPASS@node1/cinder
...
[keystone_authtoken]
auth_uri = http://node1:5000
auth_url = http://node1:35357
memcached_servers = node1: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
...
[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-vol
volumes_dir = $state_path/volumes
iscsi_protocol = iscsi
iscsi_helper = lioadm
iscsi_ip_address = 192.168.52.103
(3)启动服务
systemctl restart openstack-nova-api.service systemctl enable openstack-cinder-api.service openstack-cinder-scheduler.service
systemctl start openstack-cinder-api.service openstack-cinder-scheduler.service
OpenStack组件——cinder存储服务的更多相关文章
- OpenStack核心组件-cinder存储服务
1. cinder 介绍 Block Storage 操作系统获得存储空间的方式一般有两种: 1) 通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区.格式化.创建文 ...
- openstack核心组件--cinder存储服务(6)
一.cinder 介绍: 理解 Block Storage 操作系统获得存储空间的方式一般有两种: 通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区.格式化.创建文件系 ...
- openstack核心组件——cinder存储服务(11)
一.cinder 介绍: 理解 Block Storage 操作系统获得存储空间的方式一般有两种: 通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区.格式化.创建文件系 ...
- 云计算openstack核心组件——cinder存储服务(11)
一.cinder 介绍: 理解 Block Storage 操作系统获得存储空间的方式一般有两种: 通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区.格式化.创建文件系 ...
- 云计算OpenStack核心组件---cinder存储服务(10)
一.cinder介绍 1.Block Storage 操作系统获得存储空间的方式一般有两种: (1)通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区.格式化.创建文件系统: ...
- CentOS7安装OpenStack(Rocky版)-09.安装Cinder存储服务组件(控制节点)
本文分享openstack的Cinder存储服务组件,cinder服务可以提供云磁盘(卷),类似阿里云云盘 ----------------------- 完美的分隔线 -------------- ...
- openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一
openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...
- openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 三
openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...
- openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 二
openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...
随机推荐
- Python3之正则表达式详解
正则表达式 本节我们看一下正则表达式的相关用法,正则表达式是处理字符串的强大的工具,它有自己特定的语法结构,有了它,实现字符串的检索.替换.匹配验证都不在话下. 当然对于爬虫来说,有了它,我们从HTM ...
- 小程序上传base64的图片,可上传多张
微信小程序上传图片转化为base64格式 clickimage: function(e) { var index = e.currentTarget.dataset.index; var count ...
- Educational Codeforces Round 26 [ D. Round Subset ] [ E. Vasya's Function ] [ F. Prefix Sums ]
PROBLEM D - Round Subset 题 OvO http://codeforces.com/contest/837/problem/D 837D 解 DP, dp[i][j]代表已经选择 ...
- luogu 1072 Hankson 的趣味题 唯一分解定理+线性筛
貌似是比大多数题解优的 $O(n^2logn)$ ~ Code: #include <bits/stdc++.h> #define N 50004 #define setIO(s) fre ...
- 打开图像文件失败汇总:“Could not load image... ...0x## 0x##”错误
造冰箱的熊猫@cnblogs 2018/12/15 在Ubuntu上使用Image Viewer打开图片文件时,有时会遇到“Could not load image '001.jpg'. Error ...
- 线段树初步——转载自ljc20020730
线段树初步 线段树模板1:https://www.luogu.org/problem/show?pid=3372 线段树模板2:https://www.luogu.org/problem/show ...
- 存储映射--mmap
存储映射 使一个磁盘文件与存储空间中的一个缓冲区相映射. 当从缓冲区中取数据,就相当于读文件中的相应字节. 将数据存入缓冲区,则相应的字节就自动写入文件. 使用这种方法,首先应通知内核,将一个指定文件 ...
- 关于lower_bound()和upper_bound()
关于lower_bound()和upper_bound(): 参考:关于lower_bound( )和upper_bound( )的常见用法 注意:查找的数组必须要是排好序的.因为,它们查找的方式也是 ...
- 学习日记6、easyui datagrid 新增一行,编辑行,结束编辑和删除行操作记录
1.新增一行并进入编辑状态 var index=$('#Numbers').datagrid('appendRow', { CardInformation: '开户行', CardNumber: '银 ...
- LeetCode---Sort && Segment Tree && Greedy
307. Range Sum Query - Mutable 思路:利用线段树,注意数据结构的设计以及建树过程利用线段树,注意数据结构的设计以及建树过程 public class NumArray { ...