外部持久卷
通过 Marathon 使用外部持久卷
当容错对您的应用程序至关重要时,请使用外部卷。如果主机发生故障,本地 Marathon 实例会在其他主机上重新安排您的应用程序及其相关数据,而无需用户干预。外部卷通常提供较大的存储量。
请注意,卷的大小以吉字节 (GiB) 为单位指定。
创建具有外部持久卷的应用程序
此应用定义中 将 date
命令的输出附加到 test.txt
。如果您看到应用程序连续运行的日志显示越来越多的 date
输出行,则可以确定外部卷已被正确使用。
卷配置选项
containerPath
:卷装载在容器内的路径。对于 Mesos 外部卷,这必须是相对于容器的单层路径;不能包含正斜杠 (/
)。有关更多信息,请参阅。mode
:卷的访问模式。目前,"RW"
是唯一可能的值,它将允许您的应用程序从卷中读取及写入卷。external.size
:以 GiB 为单位的卷大小。external.name
: name 卷驱动程序用于查找外部卷的名称。当您的任务在代理程序上暂存时,卷驱动程序将在存储服务中查询具有此名称的卷。如果不存在,则是隐式创建的。否则,将重用现有卷。external.options["dvdi/driver"]
:用于存储的 Docker 卷驱动程序。随 DC/OS 提供的唯一靠 Docker 卷驱动程序是rexray
。了解有关 的更多信息。- 您可以通过
container.volumes[x].external.options[optionName]
指定其他选项。Mesos 容器的 dvdi 提供程序适用dvdcli
,它提供以下选项。任何选项的可用性取决于您的卷驱动程序。 - 通过在
container.volumes
阵列中添加其他项来创建多个卷。 - 创建应用程序后,无法更改卷参数。
- 如
upgradeStrategy.minimumHealthCapacity
大于 0.5 或upgradeStrategy.maximumOverCapacity
不等于 0,Marathon 将不会启动具有外部卷的应用程序。
使用 Docker 引擎
"id": "/test-docker",
"instances": 1,
"cpus": 0.1,
"cmd": "date >> /data/test-rexray-volume/test.txt; cat /data/test-rexray-volume/test.txt",
"container": {
"type": "DOCKER",
"docker": {
"image": "alpine:3.1",
"network": "HOST",
"forcePullImage": true
},
"volumes": [
{
"containerPath": "/data/test-rexray-volume",
"external": {
"name": "my-test-vol",
"provider": "dvdi",
"options": { "dvdi/driver": "rexray" }
},
}
]
},
"upgradeStrategy": {
"minimumHealthCapacity": 0,
}
}
卷配置选项
containerPath
必须是绝对的。- 只有某些版本的 Docker 与 REX-Ray 卷驱动程序兼容。请参阅 。
- 单击 Services 选项卡,然后 RUN A SERVICE。
- 如果您正在使用 Docker 容器,请单击 Container Settings 并配置您的容器运行时间。
- 单击 Volumes 并输入卷名称和容器路径。
- 单击 Deploy。
volumes[x].external.size
来修改特定卷的此默认值。如果您使用的是 Docker Engine,则无法修改特定卷的此默认值。但是,对于这两个运行时间,您可以通过修改 来修改所有隐式卷的默认大小。
# 扩展应用程序
使用外部卷的应用程序只能扩展为单个实例,因为卷一次只能附加到单个任务。
如果将应用程序减容到 0 个实例,该卷将从装载它的代理程序中分离,但不会被删除。如果您再次扩展应用程序,则与其关联的数据仍然可用。
# 潜在问题
- 每个卷只能分配一个任务。您的存储提供程序可能有其他限制。
- 您创建的卷不会自动清除。如果删除群集,则必须转至存储提供程序并删除不再需要的卷。如果您正在使用 EBS,请通过您在 Marathon 应用定义中设置的
container.volumes.external.name
进行搜索来查找它们。此名称对应于 EBS 卷Name
标签。 - 卷由其存储提供程序命名。选择唯一的卷名称以避免冲突。
- 如果使用 Docker,则必须使用兼容的 Docker 版本。请参阅 REX-Ray 文档,了解哪些版本的 Docker 与 REX-Ray 卷驱动程序兼容。
- 对于隐式创建卷的应用程序,启动时间可能会增加。增加的量取决于若干因素,包括卷大小和类型。存储提供程序处理卷的方法也会影响隐式创建卷的启动时间。
- 安装 NVMe CLI 命令。
-
安装必要的 udev 规则和 helper 脚本。这些都取自 。
$ cat <<EOF > /etc/udev/rules.d/999-aws-ebs-nvme.rules
KERNEL=="nvme[0-9]n[0-9]", ENV{DEVTYPE}=="disk", ATTRS{model}=="Amazon Elastic Block Store", PROGRAM="/usr/local/bin/ebs-nvme-mapping /dev/%k", SYMLINK+="%c"
EOF
- 创建 helper 脚本。
-
Set the file permissions on the scripts and reload the udev rules.
$ chown root:root /usr/local/bin/ebs-nvme-mapping
$ chmod 700 /usr/local/bin/ebs-nvme-mapping
有关外部卷的故障排除,请参阅代理程序或系统日志。如果您在 DC/OS 上使用 REX-Ray,还可以查阅 systemd
日志中的 dcos-rexray.service
单元记录。