Trove 扩展文件系统支持

目前 Trove 仅支持在客户机实例上使用单个卷,并且该卷必须是块设备。此规范概述了支持客户机上多种卷的提案,包括块设备和文件系统。

Launchpad 蓝图:https://blueprints.launchpad.net/trove/+spec/extended-filesystems

问题描述

在当前实现中,在实例创建期间,任务管理器会分配一个 cinder 卷,并在准备阶段通知客户机。然后,客户机格式化该卷并将其挂载为用于存储数据库数据的卷。

需要额外功能

  • 某些数据存储需要多个卷

  • 客户机应支持块设备和预格式化的文件系统

提议的变更

为了支持此新功能,任务管理器将向客户机传递一个卷集合,每个卷都标记了其类型和预期用途。任务管理器将负责配置要附加到客户机的卷类型,以及如何使用 Cinder 或 Nova 预置这些卷;客户机将负责准备块设备(如果需要),并将设备连接到客户机操作系统上的文件系统。

配置

将使用三个配置值来帮助将卷附加到实例。

cg_volumes

任务管理器配置文件 taskmanager.conf 的 DEFAULT 部分中的全局 cg_volumes 配置设置将包含支持一致性组的 volume_types 列表。在未来的功能开发中,只有支持一致性组的 volume_types 才能用于快照和备份。

cg_volumes = NETAPP,SCALEIO

对于 Openstack 分配的卷,cg_volumes 设置的值应与以下部分中的 provider_type 参数相对应。

guest_device_type

全局 guest_device_type 配置设置描述了客户机实例应如何处理任务管理器提供的设备。

cfg.DictOpt('guest_device_type',
            help="Dictionary of device types with help",
    default={
        'block_ext4': "Block storage to be formatted and managed by guest",
        'shared': "Shared storage, typically NFS, to be mounted as is"
    }
)

available_volume_kind

每个数据存储的 available_volume_kind 配置设置配置了特定数据存储可用的 volume_kinds

cfg.DictOpt('available_volume_kind',
            help="Dictionary of available volume types with help",
    default={
        'data': "Storage volume for the database",
        'binlog': "Volume to hold binary logs for the database",
        'user_log': "Volume to hold user and error logs"
    }
)

在初始实现中,此设置将用于防止启动集群中的多个实例,然后发现选择了不合适的卷配置。

/etc/trove/guest.conf

将在客户机上引入一个新的 olso 配置文件。此文件将由 DIB 元素安装到客户机镜像中,并将包含特定于客户机上安装的操作系统和数据库软件的配置选项。

device_type 配置设置描述了客户机实例在挂载卷之前应如何准备卷,以及任何其他特定于设备的配置。

volume_mapping 配置设置配置了客户机应如何处理提供的卷,对于每个操作系统。最常见的设置是设备应挂载到文件系统中的位置。如果提供,mount_priority 选项用于配置挂载顺序,以防需要将设备彼此之下挂载。

此描述概述了专门为扩展文件系统支持定义的选项集

from oslo_config import cfg

device_type = [
    cfg.DictOpt('block_ext4', help="Block device to be formatted by guest",
        default={
            'raw_block_device': True,
            'format_options': 'ext4',
            'mount_type': 'ext4',
            'mount_options': '-o rw'
        },
    ),
    cfg.DictOpt('shared', help="Shared filesystem (NFS) to be used as is",
        default={
            'raw_block_device': False
            'mount_type': 'nfs',
            'mount_options': '-o rw'
        },
    )
]

volume_mapping = [
    cfg.DictOpt('data', help="Storage volume for the database",
        default={
            'mount_point': '/var/lib/mysql',
            'mount_priority': 1
        },
    ),
    cfg.DictOpt('binlog',
                help="Volume to hold binary logs for the database",
        default={
            'mount_point': '/var/lib/mysql/binlog',
            'mount_priority': 2
        },
    ),
    cfg.DictOpt('user_log', help="Volume to hold user and error logs",
        default={
            'mount_point': '/var/lib/mysql/userlog'
            'mount_priority': 2
        }
    )
]

数据库

将创建一个新的表 volume_config 来描述要配置的卷。每个卷配置将详细说明要附加到实例的每个卷。volume_config 表将具有以下列

列名

描述

id

uuid 标识符

name

卷配置名称

volume_kind

预期用途 - 由数据存储定义(数据、binlog、userlog)

size

卷的大小(除非用户覆盖)

provider

提供卷的 Openstack 组件(“cinder”、“nova”)

provider_type

传递给 Cinder/Nova 的卷类型

device_type

指示客户机如何准备卷

例如,需要将其数据存储在块设备上,并将日志存储在不同卷上的实例将配置如下

id

name

volume_kind

size

provider

provider_type

device_type

<uuid0>

vc1

root

3

cinder

vtype1

root

<uuid1>

vc1

数据

10

cinder

vtype1

block_ext4

<uuid2>

vc1

binlog

2

cinder

vtype1

block_ext4

未指定要用于分配实例的 volume_config 的实例将使用名为“default”的 volume_config。如果不存在这样的 volume_config,则实例将默认为当前的单个 Cinder 卷。

volume_config 中定义的每个卷将为其指定大小。用户可以通过“--sysvol:<volume_kind>,size=<n>”选项或数据卷的“--size”选项来覆盖此大小。这消除了当前要求在“trove create”或“trove cluster-create”中指定“--size”选项的要求;请注意,这意味着如果用户未定义 volume_config 或 size,则在未定义“default”volume_config 时,创建调用将在任务管理器中失败,而不是当前在 shell 中检测到差异的行为。

最初将支持两个卷提供程序。如果选择“cinder”提供程序,则将通过 Cinder API 分配卷。如果指定“nova”提供程序,则根卷将在计算主机的根磁盘上分配,并且 volume_kind 不同于“root”的卷将在 Ephemeral 存储上分配。如果分配的卷大小超过所选实例风味中配置的存储量,Nova 将引发错误。未来的卷提供程序支持可能包括对 Manila 卷和/或多挂载 Cinder 卷的支持。

将添加一个新的表 instance_volumes 来跟踪与实例关联的卷。这将包括任务管理器基于数据存储卷配置创建的卷,以及用户指定的卷。

列名

描述

instance_id

关联卷的实例 ID

volume_kind

预期用途 - 由数据存储定义(数据、binlog、userlog)

volume_id

Cinder 或 Manila 中的卷 ID(对于 Ephemeral 为空)

provider

提供卷的组件(“cinder”、“nova”、“manila”)

device_type

指示客户机如何准备卷

如上所述配置的实例将在 instance_volumes 表中由以下条目表示

volume_id

instance_id

volume_kind

provider

device_type

<volid0>

<inst1>

root

cinder

root

<volid1>

<inst1>

数据

cinder

block_ext4

<volid2>

<inst1>

binlog

cinder

block_ext4

为了向后兼容,如果 instance_volumes 表中没有条目,则假定实例的根卷分配在 Nova 本地存储上。

公共 API

volume_configvolume_list 参数将添加到

以下 REST API 的有效负载

  • 创建

  • cluster create

  • cluster grow

如果指定了 volume_config 参数,它将从 volume_config 表中选择 volume 配置。如果未指定,则将配置 Nova 存储上的根卷和单个 Cinder 数据卷。

volume_list 将封装来自 –sysvol 选项的信息。为了向后兼容,如果 API 有效负载中未包含 volume_list 参数,它将从 volume 参数计算得出。如果同时指定了 volumevolume_list(或两者都没有),则会出错。

resize_volume API 将更新为包含要调整大小的卷的 volume_kind。为了向后兼容,如果未指定 volume_kind,则将调整大小“data”卷。如果提供程序不支持指定卷上的调整大小操作,将返回错误。

将另外添加一个新的“GET volume_configs”API,它将返回可用卷配置的列表。这些卷配置将是上述 volume_config 参数可以指定的有效值。

请求

GET v1/{tenant_id}/volume_configs
{
}

响应

{
    [
        "default",
        "ora_prod"
    ]
}

以及一个新的“GET volume_configs/<config>”API,它将返回给定 volume_config 的详细信息。

请求

GET v1/{tenant_id}/volume_configs/<config>
{
}

响应

{
    "instance_id": <uuid>,
    "volume_kind": 'data',
    "volume_id": <uuid>,
    "provider": "cinder",
    "device_type": "block_ext4"
}

以及一个新的“GET instance/<instance_id>/volumes”API,它将返回有关附加到给定实例的卷的详细信息。

请求

GET v1/{tenant_id}/instance/<instance_uuid>/volumes
{
}

响应

{
    [
        {
            'volume_id': <volid0>,
            'size': 8,
            'volume_kind': 'root',
            'provider': 'cinder',
            'device_type': 'root'
        },
        {
            'volume_id': <volid1>,
            'size': 50,
            'volume_kind': 'data',
            'provider': 'cinder',
            'device_type': 'block_ext4'
        },
        {
            'volume_id': <volid2>,
            'size': 2,
            'volume_kind': 'binlog',
            'provider': 'cinder',
            'device_type': 'block_ext4'
        }
    ]
}

公共 API 安全

没有影响。

Python API

volume_configvolume_list 参数将添加到

以下 python API

  • Instance.create

  • Cluster.create

  • Cluster.grow

有关 volume_configvolume_list 参数的说明,请参见上述内容。

将在上述 API 中弃用 volume 参数。

Instance.resize_volume python API 将更新为包含要调整大小的卷的 volume_kind。

将向 Trove python API 添加一个新的 volume_configs 对象。此客户端 API 将实现“list”和“show”方法。

CLI (python-troveclient)

将向 trove-manage 命令添加三个新的子命令,以支持将卷与数据存储版本关联

$ trove-manage volume-config-add <name> <volume_kind> \
            <provider> <provider_type> <device_type> <required>

$ trove-manage volume-config-delete <name> <volume_kind>

$ trove-manage volume-config-list <name>

例如,要配置 volume 配置“ora_prod”具有数据卷和可选的 binlog 卷,两者都是 Cinder 块设备,将执行以下命令

$ trove-manage volume-config-add ora_prod \
            data cinder ram_backed block_ext4 True
$ trove-manage volume-config-volume-add ora_prod \
            binlog cinder ram_backed block_ext4 False

将向多个 trove CLI 命令添加一个新的 –sysvol 选项,以支持配置任务管理器创建的卷。可以多次指定 –sysvol 选项以配置多个卷。每个规范将包括正在为其制定规范的 volume_kind,后跟一个冒号分隔的配置选项列表 - 对于初始实现,仅支持 size。

$ trove create mydb myflavor --datastore=foo --datastore_version=1.0 \
            --volume_config=ora_prod \
            --sysvol=data:size=5 --sysvol=binlog:size=2

为了向后兼容,此命令的替代方法是使用“--size”选项指定数据卷的大小,尽管这可能会在未来的版本中弃用

$ trove create mydb myflavor –datastore=foo –datastore_version=1.0

–volume_config=ora_prod –size=5 –sysvol=binlog:size=2

将向 resize-volume 命令添加一个新的选项,以支持指定要调整大小的附加到实例的卷

$ trove resize-volume my_inst 3 --volume_kind binlog

为了向后兼容,如果未指定 –volume_kind 选项,则将调整大小类型为“data”的卷。

将添加一个新的“trove volume-config-list”CLI 命令以返回可用 volume_configs 的名称列表。

$ trove volume-config-list
+==============+
| VolumeConfig |
+==============+
| default      |
| ora_prod     |
+==============+

以及相应的新的“trove volume-config-show”。

$ trove volume-config-show ora_prod
===========  ====  ========  =============  ===========
volume_kind  size  provider  provider_type  device_type
===========  ====  ========  =============  ===========
root         3     cinder    vtype1         root
data         10    cinder    vtype1         block_ext4
binlog       2     cinder    vtype1         block_ext4
===========  ====  ========  =============  ===========

当然,还有一个命令来显示附加到特定实例的卷。

$ trove volumes-list <instance> =========== =========== ======== =========== ========= volume_kind size provider device_type volume_id =========== =========== ======== =========== ========= root 8 cinder root <volid0> data 50 cinder block_ext4 <volid1> binlog 2 cinder block_ext4 <volid2> =========== =========== ======== =========== =========

内部 API

create_instance API 将更新为包含 volume_info 参数。

resize_volume API 将更新为包含要调整大小的卷的 id 和 volume_kind。

Guest Agent

将实现一个新的 prepare 调用,该调用将替换 device_path 和 mount_point 参数,并使用一个新的 device_config 列表。device_config 将提供有关要在客户机上配置的卷的数量和类型的信息

[
    {
        'volume_kind': 'data',
        'device_type': 'block_ext4',
        'device_path': '/dev/vdb1'
    },
    {
        'volume_kind': 'binlog',
        'device_type': 'block_ext4',
        'device_path': '/dev/vdb2'
    },
]

为了支持与客户机升级之前 guestagent API 的向后兼容性,guest agent 的 prepare 方法将接受旧的和新参数。将根据参数的值推断正确的行为。

每个数据存储定义支持的卷、每个 volume_kind 的含义以及每个卷将在本地文件系统上的挂载位置。

guestagent resize_fs API 将更新为包含 volume_kind 参数。当指定 volume_kind 参数时,将忽略 mount_point 参数。

由于传递给 post_upgrade RPC 端点的参数是字典,因此它将被更新以与旧的和新客户机兼容,同时提供数据卷的挂载点以及完整的 device_config 上下文。

备选方案

不可用。

Dashboard 影响 (UX)

仪表板将更改为允许用户在 instance.create、cluster.create 和 cluster.grow 函数上指定 volume_config。将添加 volume.configs.list 方法到 Python API 以促进此功能。

将在实例面板中添加一个新的面板/操作,以显示为特定实例配置的卷。

volume_resize 功能将更新为允许用户指定他们希望调整大小的 volume_kind。

实现

负责人

主要负责人

6-morgan

Dashboard 指定人

<launchpad-id 或 None>

里程碑

完成目标里程碑

ocata 之后

工作项

  • 实现任务管理器更改

  • 实现基础 guestagent 和 guestagent.api 更改

  • 使数据存储适应新的 API

  • 开发单元测试

升级影响

此功能的向后兼容性将取决于新的 RPC 版本控制功能。

依赖项

不适用

测试

应开发一个 int-test,以测试至少一个数据存储的多个卷的添加。

文档影响

此功能将影响以下文档

  • 安装

  • API

  • CLI

  • 构建 Openstack Trove 的客户机镜像

参考资料

不适用

附录

任何其他技术信息和数据。