使用 Mesosphere® DC/OS™,您可以在群集中配置 Apache® Mesos® Mount
磁盘资源,只需使用众所周知的路径在代理节点上挂载存储资源即可。
当 DC/OS 代理节点启动时,它会扫描与模式 /dcos/volume<N>
(其中 <N>
是个整数)匹配的卷。然后,代理节点会自动配置,以向其他服务提供这些磁盘资源。
使用回送设备示例
在此示例中,磁盘资源在运行的群集上安装后被添加到 DC/OS 代理节点中。这些步骤可以在安装前使用,而无需停止服务或清除代理节点序状态。
请注意,此示例仅处理添加资源,在删除资源时不能采用相同的方式。
-
通过 SSH 连接到群集中的代理节点。
-
检查当前代理节点的资源状态。
cat /var/lib/dcos/mesos-resources # Generated by make_disk_resources.py on 2016-05-05 17:04:29.868595 # MESOS_RESOURCES='[{"ranges": {"range": [{"end": 21, "begin": 1}, {"end": 5050, "begin": 23}, {"end": 32000, "begin": 5052}]}, "type": "RANGES", "name": "ports"}, {"role": "*", "type": "SCALAR", "name": "disk", "scalar": {"value": 47540}}]'
请注意, 尚无引用。
/dcos/volume0
. -
停止代理节点。
-
清除代理节点状态。
-
使用以下命令缓存卷挂载发现资源状态:
sudo mv -f /var/lib/dcos/mesos-resources /var/lib/dcos/mesos-resources.cache
DC/OS 将稍后检查此文件,以便为代理生成新的资源状态。
-
使用以下命令删除代理节点检查点状态:
sudo rm -f /var/lib/mesos/slave/meta/slaves/latest
-
-
创建 200 MB 回送设备。
sudo mkdir -p /dcos/volume0 sudo dd if=/dev/zero of=/root/volume0.img bs=1M count=200 sudo losetup /dev/loop0 /root/volume0.img sudo mkfs -t ext4 /dev/loop0 sudo losetup -d /dev/loop0
这仅适用于测试目的。挂载卷必须至少有 200 MB 可用空间。每个卷 100 MB 由 DC/OS 保留,不可用于其他服务。
-
创建
fstab
条目并挂载。确保卷在启动时自动挂载。也可以通过
systemd
挂载单元完成类似操作。echo "/root/volume0.img /dcos/volume0 auto loop 0 2" | sudo tee -a /etc/fstab sudo mount /dcos/volume0
-
重新启动。
sudo reboot
-
通过 SSH 连接到到代理节点并查看
journald
日志以获取对新卷/dcos/volume0
. 的引用。journalctl -b | grep '/dcos/volume0'
特别是,应该有代理节点启动的条目和新的 volume0
Mount
磁盘资源:May 05 19:18:40 dcos-agent-public-01234567000001 systemd[1]: Mounting /dcos/volume0... May 05 19:18:42 dcos-agent-public-01234567000001 systemd[1]: Mounted /dcos/volume0. May 05 19:18:46 dcos-agent-public-01234567000001 make_disk_resources.py[888]: Found matching mounts : [('/dcos/volume0', 74)] May 05 19:18:46 dcos-agent-public-01234567000001 make_disk_resources.py[888]: Generated disk resources map: [{'name': 'disk', 'type': 'SCALAR', 'disk': {'source': {'mount': {'root': '/dcos/volume0'}, 'type': 'MOUNT'}}, 'role': '*', 'scalar': {'value': 74}}, {'name': 'disk', 'type': 'SCALAR', 'role': '*', 'scalar': {'value': 47540}}] May 05 19:18:58 dcos-agent-public-01234567000001 mesos-slave[1891]: " --oversubscribed_resources_interval="15secs" --perf_duration="10secs" --perf_interval="1mins" --port="5051" --qos_correction_interval_min="0ns" --quiet="false" --recover="reconnect" --recovery_timeout="15mins" --registration_backoff_factor="1secs" --resources="[{"name": "ports", "type": "RANGES", "ranges": {"range": [{"end": 21, "begin": 1}, {"end": 5050, "begin": 23}, {"end": 32000, "begin": 5052}]}}, {"name": "disk", "type": "SCALAR", "disk": {"source": {"mount": {"root": "/dcos/volume0"}, "type": ""}}, "role": "*", "scalar": {"value": 74}}, {"name": "disk", "type": "SCALAR", "role": "*", "scalar": {"value": 47540}}]" --revocable_cpu_low_priority="true" --sandbox_directory="/mnt/mesos/sandbox" --slave_subsystems="cpu,memory" --strict="true" --switch_user="true" --systemd_enable_support="true" --systemd_runtime_directory="/run/systemd/system" --version="false" --work_dir="/var/lib/mesos/slave"
在 Marathon™ 应用程序中使用挂载卷示例
{
"id": "/mount-test-svc1",
"instances": 1,
"cpus": 0.1,
"mem": 128,
"networks": [
{
"mode": "container/bridge"
}
],
"disk": 0,
"gpus": 0,
"backoffSeconds": 1,
"backoffFactor": 1.15,
"maxLaunchDelaySeconds": 300,
"container": {
"type": "DOCKER",
"volumes": [
{
"persistent": {
"size": 25,
"type": "mount"
},
"mode": "RW",
"containerPath": "volume0"
}
],
"docker": {
"image": "nginx",
"privileged": false,
"forcePullImage": false
},
"portMappings": [
{
"containerPort": 80,
"hostPort": 0,
"servicePort": 10101,
"protocol": "tcp",
"name": "httpport",
"labels": {
"VIP_0": "/mount-test-svc1:80"
}
}
]
},
"healthChecks": [
{
"gracePeriodSeconds": 300,
"intervalSeconds": 60,
"timeoutSeconds": 20,
"maxConsecutiveFailures": 3,
"portIndex": 0,
"path": "/",
"protocol": "MESOS_HTTP",
"delaySeconds": 15
}
],
"upgradeStrategy": {
"minimumHealthCapacity": 0.5,
"maximumOverCapacity": 0
},
"unreachableStrategy": "disabled",
"killSelection": "YOUNGEST_FIRST",
"requirePorts": true,
"labels": {
"HAPROXY_GROUP": "external"
}
}
在运行此服务后,导航到 Web 界面中的 Services > Volumes 选项卡:
图 1. Services > Volumes 选项卡
云提供程序资源
云提供程序存储服务通常用于支持 DC/OS 挂载卷。在设计生产 DC/OS 部署时,此参考材料非常有用:
最佳实践
Mount
磁盘资源主要用于 Kafka® 和 Cassandra® 等有状态服务,这些服务可以从整个群集中可用的专用存储中受益。使用 Mount
磁盘资源的任何服务具有对保留资源的独占访问权限。然而,考虑服务的性能和可靠性要求仍然很重要。Mount
磁盘资源的性能基于底层存储的特性,并且 DC/OS 不提供任何数据复制服务。请考虑以下事项:
- 将
Mount
磁盘资源与具有严格存储要求的有状态服务一起使用。 - 根据有状态服务的存储需求和要求,仔细考虑文件系统类型、存储介质(网络链接、固态硬盘等)和卷特征(RAID 级别、大小调整等)。
- 使用 Mesos 属性标记 Mesos 代理节点,该属性反映代理节点磁盘挂载的特征,例如, IOPS200、RAID1 等
- 使用 Mesos 属性限制将有状态服务与存储代理节点相关联。
- 考虑将要求严苛的存储服务隔离到专用存储代理节点中,因为文件系统页面缓存是主机级共享资源。
- 确保使用
Mount
磁盘资源的所有服务都旨在处理一个或多个Mount
磁盘资源的永久丢失。服务仍然负责管理数据复制和保留,从故障代理节点进行正常恢复以及关键服务状态的备份。