云计算存储虚拟化技术-openstack-cinder

简介: 云计算存储虚拟化技术-openstack-cinder

简介

存储虚拟化技术 是一种 在 物理 存储 介质 上 , 二次进行 存储 分配的 技术.

比如 lvm 以及 常见的 分区 也是 一种 简单 的 存储 虚拟化.

一块 物理磁盘 分成了 两块 进行使用, 或者 10 块 磁盘 聚合成 1 块 存储磁盘.

用来 满足 不同用户的 不同需求.


特点

区别于 cpu 以及 内存 , 由于 当前(2021年) 网卡 速度 在 100m-1000g/s 之间, 所以 cpu 与 内存 是 无法 进行 跨节点的 虚拟化的, 即便 强行实现 ,性能 也 十分低下,

但是 普通 磁盘 速度 远小于 网卡 速度, 以 较新的 nvme 为例, 2-4g/s. 并且 同一个 主机 可能 插有 数十块 存储磁盘. 所以 存储 介质的 虚拟化 , 可以 通过 网络 进行 聚合. 结合上 元数据的 查找 优化, 以及 利用 内存 缓存 热点数据. 都 十分 具有前景.


cinder 是什么

openstack 的 存储 插件, cinder 并没有 自己实现 所有的 存储 能力, 而是 借用 不同的 接口 实现了 自身的 存储 能力.

比如 调用 lvm 进行 本地的 虚拟机 磁盘存储,直接 利用 本地的 磁盘 存储能力.

或者 调用 rbd 依托于 ceph 进行 存储。


cinder 服务 构成

api, scheduler, volume, backup,服务 构成。

可以通过 systemctl status 查看 相应 服务 状态,

配置 文件 /etc/cinder

数据 目录 /var/lib/cinder

日志 目录 /var/log/cinder

可以 通过 8776 请求 方式 调用,

也可以 通过 cinderclient 项目 提供的 cinder 命令行 cli 工具 调用。


以创建 volume 为例 分析 cinder 代码

命令行 -> api -> api-server

可以直接 命令行 也可以 api

创建 大概 过程

  1. v2/volume/api create
  2. cinder/volume/api create
  3. scheduler_rpcapi


函数调用顺序

  1. web 或者 cinderclint 提交 volume_create 请求
  2. 请求 会被 url 到 api 映射到以下函数

/root/cinder/cinder/volume/api.py:218 def create

def create(self, context, size, name, description, snapshot=None,

image_id=None, volume_type=None, metadata=None,

availability_zone=None, source_volume=None,

scheduler_hints=None,

source_replica=None, consistencygroup=None,

cgsnapshot=None, multiattach=False, source_cg=None):


3.参数检查
其中检查参数的 格式合法性, 也会检查 资源存量 是否足够。

# 参数检查内容很多,列举一个
if size and (not strutils.is_int_like(size) or int(size) <= 0):
    msg = _('Invalid volume size provided for create request: %s '
            '(size argument must be an integer (or string '
            'representation of an integer) and greater '
            'than zero).') % size
    raise exception.InvalidInput(reason=msg)
  1. 通过之后,创建 sched_rpcapi volume_rpcapi flow_engine

其中 /root/cinder/cinder/volume/rpcapi.py:35 volume_rpcapi 中有更加详细的创建过程

sched_rpcapi = (self.scheduler_rpcapi if (not cgsnapshot and
                not source_cg) else None)
volume_rpcapi = (self.volume_rpcapi if (not cgsnapshot and
                  not source_cg) else None)
flow_engine = create_volume.get_flow(self.db,
                                      self.image_service,
                                      availability_zones,
                                      create_what,
                                      sched_rpcapi,
                                      volume_rpcapi)
  1. 执行 flow_engine 创建 volume
# Attaching this listener will capture all of the notifications that
# taskflow sends out and redirect them to a more useful log for
# cinders debugging (or error reporting) usage.
with flow_utils.DynamicLogListener(flow_engine, logger=LOG):
    flow_engine.run()
    vref = flow_engine.storage.fetch('volume')
    LOG.info(_LI("Volume created successfully."), resource=vref)
    return vref
  1. 返回 vref ,volume 对象的ref(引用对象)

volume_rpc_api 创建 volume 过程

def create_volume(self, ctxt, volume, host, request_spec,
                  filter_properties, allow_reschedule=True):
    request_spec_p = jsonutils.to_primitive(request_spec)
    msg_args = {'volume_id': volume.id, 'request_spec': request_spec_p,
                'filter_properties': filter_properties,
                'allow_reschedule': allow_reschedule}
    if self.client.can_send_version('2.0'):
        version = '2.0'
        msg_args['volume'] = volume
    elif self.client.can_send_version('1.32'):
        version = '1.32'
        msg_args['volume'] = volume
    else:
        version = '1.24'
    cctxt = self._get_cctxt(host, version)
    request_spec_p = jsonutils.to_primitive(request_spec)
    """Invoke a method and return immediately. See RPCClient.cast()."""
    cctxt.cast(ctxt, 'create_volume', **msg_args)
# 实际上 到此为止 创建服务就是 cctxt 向消息队列提供了一个任务
-->
self.transport._send(self.target, ctxt, msg, retry=self.retry)

判断 list 或者 map 中是否 有哪些键名

# Check that the required keys are present, return an error if they
# are not.
required_keys = set(['ref', 'host'])
missing_keys = list(required_keys - set(volume.keys()))
if missing_keys:
    # 代表 这些 键名 不全部存在
    msg = _("The following elements are required: %s") % \
        ', '.join(missing_keys)
    raise exc.HTTPBadRequest(explanation=msg)
相关文章
|
2月前
|
存储 数据管理 数据库
拥抱变革:我的云计算技术感悟之旅
在信息技术不断进步的今天,云计算已经成为推动企业数字化转型的重要力量。本文将分享个人在学习和实践云计算技术过程中的一些体会与感悟。文章不仅探讨了云计算的基本概念和架构,还深入分析了云服务模型以及迁移到云端时面临的挑战。此外,通过实际案例来阐述如何有效利用云计算资源,以及如何优化云策略以提升业务连续性和灵活性。本篇文章旨在为那些渴望了解并掌握云计算精粹的技术人员提供一些实用的建议和启示。
|
15天前
|
存储 云计算 数据安全/隐私保护
拥抱变革:我的云计算技术感悟
【4月更文挑战第27天】 在数字化的浪潮中,我经历了从怀疑到接受,再到深度依赖云计算的过程。这篇文章将分享我个人的技术感悟,探讨如何通过学习和适应云计算技术,提升工作效率,应对快速变化的市场需求。
|
4天前
|
存储 消息中间件 Cloud Native
AutoMQ:充分挖掘云计算技术红利,免除下云烦恼
AutoMQ 通过深度用云,以云原生的能力重构了 Apache Kafka,创造了 10 倍的成本优势。相较于Kafka,AutoMQ的共享存储架构使得在分区迁移、节点动态扩缩容、流量自动重平衡等运维方面的耗时指标得到了数百倍的优化。今天,这篇文章,主要是立足于阿里云,盘点 AutoMQ 深度使用的云原生技术,以及分别用这些技术解决什么样的实际问题。
|
12天前
|
存储 边缘计算 弹性计算
云计算技术与服务
云计算技术与服务
84 1
|
13天前
|
Kubernetes 云计算 虚拟化
云计算开发与部署:技术与实践的深度融合
云计算开发与部署:技术与实践的深度融合
31 2
|
13天前
|
存储 大数据 云计算
云计算:技术与应用的融合之美
云计算:技术与应用的融合之美
27 0
|
14天前
|
安全 Devops 虚拟化
【专栏】虚拟化技术与云计算平台 OpenStack:硬件虚拟化、操作系统级虚拟化和容器化
【4月更文挑战第28天】本文探讨虚拟化技术原理,如硬件虚拟化、操作系统级虚拟化和容器化,以及开源云计算平台OpenStack如何利用这些技术提供优势。OpenStack支持多种虚拟化技术,具备开源灵活性、多租户架构、可扩展性、插件式设计和成本效益。未来,OpenStack将在容器化、DevOps、跨云策略和安全合规性方面发挥更大作用,助力企业数字化转型。
|
15天前
|
机器学习/深度学习 人工智能 安全
拥抱变革:我的云计算技术感悟之旅
【4月更文挑战第27天】 在信息技术不断演进的今天,我体会到了云计算作为一种颠覆性技术的强大动力。本文将分享我在学习和应用云计算技术过程中的一些深刻体会和实践经验。从最初的怀疑到后来的全面接受,我见证了云计算如何帮助企业降低成本、提高效率并加速创新。文章还将探讨云计算的未来趋势以及作为技术人员如何持续适应这一不断变化的技术环境。
|
17天前
|
存储 人工智能 安全
云计算:探索技术的云端变革
云计算:探索技术的云端变革
115 0
|
17天前
|
存储 分布式计算 Cloud Native
云计算:技术革命与代码实践
云计算:技术革命与代码实践
60 1

相关实验场景

更多