玩转 OpenStack(六)Cinder 模块

Block Storage Service Cinder 作为 OpenStack 的块存储服务,为 Instance 提供虚拟磁盘。
操作系统获得存储空间的方式一般有两种:

  • 裸盘的方式叫做Block Storage(块存储),也叫做 Volume (卷)。一般是通过某种协议(SAS、SCSI、SAN等)挂载裸盘,然后分区、格式化、创建文件系统,或者直接使用裸盘存储数据(数据库)。
  • 文件系统存储。NAS 和 NFS 服务器,以及各种分布式文件系统提供的存储。

一、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

创建 Volume 时,cinder-scheduler 会基于容量、Volume Type 等条件选择出最适合的存储节点,然后创建 Volume。

/etc/cinder/cinder.conf 文件中,cinder 通过 scheduler_driverscheduler_default_filtersscheduler_default_weighers 三个参数来配置 cinder-scheduler。

(1)Filter scheduler

Filter scheduler 是 cinder-scheduler 默认的调度器。调度过程如下:

  • 通过过滤器(filter)选择满足条件的存储节点
  • 通过权重计算(weighting)选择最优(权重值最大)的存储节点

默认调度器配置如下:

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

为了提高容灾性和提供隔离服务,可以将存储节点和计算节点划分到不同的 Availability Zone 中。
例如:把一个机架上的机器划分到一个 Availability Zone 中,OpenStack 默认有一个命名为 “Nova” Availability 的 Zone,所有的节点初始都收放在 “Nova” 中的。用户可以根据需要创建自己的 Availability Zone,如下图


Availability Zone 列表页

在创建 Volume 时,需要指定 Volume 所属的 Availability Zone,如下图:


创建 Volume

cinder-scheduler 在做 filtering 时,会使用 AvailabilityZoneFilter 将不属于指定 Availability Zone 的存储节点过滤掉。

  • CapacityFilter

创建 Volume 时,用户指定 Volume 的大小。CapacityFilter 的作用是将存储空间不能满足 Volume 创建需求的存储节点过滤掉。

  • CapabilitiesFilter

不同的 Volume Provider 有自己的特性(Capabilities),比如是否支持 thin provision 等。
在创建 Volume 时,可以通过 Volume Type(卷类型)指定需要的 Capabilities,如下图


指定 Capabilities

当然 Capabilities 可以根据需要定义很多个。如下图


创建Capabilities

通过 Volume Type(卷类型)的 Extra Specs(扩展规格)定义 Capabilities。Extra Specs 是 Key-Value 的形式定义的,如下图:


扩展规格

不同的 Volume Provider 支持的 Extra Specs 不同,查看 Volume Provider 文档。下图 Volume Type 只有一个 Extra Specs,“volume_backend_name” 这是最重要的,也是必须的 Extra Specs。


cinder-volume 会在配置文件 /etc/cinder/cinder.conf 中,设置 volume_backend_name 参数,作用是为存储节点的 Volume Provider 命名。这样,CapabilitiesFilter 就可以通过 Volume Type 的 “volume_backend_name” 赛选出指定的 Volume Provider。

下面是我测试环境 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 基于存储节点的空闲容量计算权重,空闲越多权重越大

3. cinder-volume

cinder-volume 在存储节点上运行, 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

存储节点在配置文件 /etc/cinder/cinder.confvolume_driver 选项配置使用 driver

volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
  • 定期向 OpenStack 报告计算节点的状态

在 cinder-scheduler 会用到 CapacityFilter 和 CapacityWeigher,他们都是通过存储节点的空间容量来筛选。这个容量信息就是来自 cinder-volume 的定期报告。

在 cinder-volume 的日志 /opt/stack/logs/c-vol.log 中可以发现每隔一段时间,cinder-volume 就会报告一次资源情况。如下图

资源报告日志

  • Volume 生命周期的管理

Cinder 对 Volume 的生命周期的管理最终是通过 cinder-volume 完成的。包括 创建、挂载、快照、删除、扩展等。

4. cinder-provider

数据的存储设备,为 volume 提供物理存储空间。
cinder-volume 支持多种 volume provider, 每种 volume provider 通过自己的 driver 与 cinder-volume 协调工作。

二、物理部署方案

1. Cinder 服务

Cinder 服务部署在两类节点上,控制节点和存储节点。

控制节点中 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 部署在控制节点上,这个是合理的。

cinder-volume 为什么也在控制节点上?

首先 OpenStack 是一个分布式系统,每个子服务都可以部署在任何地方,只要网络能够连通。

无论哪个节点,只要上面运行了 cinder-volume 服务,就是一个存储节点,当然也可以运行其他服务。

也可以使用 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 通常部署在控制节点上。

3. volume provider

一般 volume provider 是独立的。cinder-volume 使用 driver 与 volume provider 通信并协调工作。
所以只需要将 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

配置中定义了名为 “lvmdriver-1” 的 volume provider,也称作 back-end。其 driver 是 LVM,LVM 的 volume group 名为 “stack-volumes-lvmdriver-1”。

/dev/sdb 中手动创建 VG “stack-volumes-lvmdriver-1” 。
创建 physical volume /dev/sdb

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

因为 Linux 的 LVM 默认配置,不允许在 /dev/sdb 上创建 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

然后创建 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阅读 229,001评论 6 537
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,786评论 3 423
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 176,986评论 0 381
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,204评论 1 315
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,964评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,354评论 1 324
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,410评论 3 444
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,554评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,106评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,918评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,093评论 1 371
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,648评论 5 362
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,342评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,755评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,009评论 1 289
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,839评论 3 395
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,107评论 2 375

推荐阅读更多精彩内容