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_config 和 volume_list 参数将添加到
以下 REST API 的有效负载
创建
cluster create
cluster grow
如果指定了 volume_config 参数,它将从 volume_config 表中选择 volume 配置。如果未指定,则将配置 Nova 存储上的根卷和单个 Cinder 数据卷。
volume_list 将封装来自 –sysvol 选项的信息。为了向后兼容,如果 API 有效负载中未包含 volume_list 参数,它将从 volume 参数计算得出。如果同时指定了 volume 和 volume_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_config 和 volume_list 参数将添加到
以下 python API
Instance.create
Cluster.create
Cluster.grow
有关 volume_config 和 volume_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,以测试至少一个数据存储的多个卷的添加。
参考资料¶
不适用
附录¶
任何其他技术信息和数据。