挂载磁盘资源

使用 Mesos 挂载存储资源

使用 DC/OS,您可以在群集中配置 Mesos Mount 磁盘资源,只需使用众所周知的路径在代理节点上挂载存储资源即可。

当 DC/OS 代理节点启动时,它会扫描与模式 /dcos/volume<N>(其中 <N> 是个整数)匹配的卷。然后,代理节点会自动配置,以向其他服务提供这些磁盘资源。

使用回送设备示例

在此示例中,磁盘资源在运行的群集上安装后被添加到 DC/OS 代理节点中。这些步骤可以在安装前使用,而无需停止服务或清除代理节点序状态。

请注意,此示例仅处理添加资源,在删除资源时不能采用相同的方式。

警告:这将终止节点上任何运行的任务或服务。

  1. 通过 SSH 连接到群集中的代理节点。
  2. 检查当前代理节点的资源状态。
    1. cat /var/lib/dcos/mesos-resources
    2. # Generated by make_disk_resources.py on 2016-05-05 17:04:29.868595
    3. #
    4. 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 尚无引用。
  3. 停止代理节点。
    • 专用代理节点上:
      1. sudo systemctl stop dcos-mesos-slave.service
    • 公共代理节点上:
      1. sudo systemctl stop dcos-mesos-slave-public.service
  4. 清除代理节点状态。
    1. 使用以下命令缓存卷挂载发现资源状态:
      1. sudo mv -f /var/lib/dcos/mesos-resources /var/lib/dcos/mesos-resources.cache
      DC/OS 将稍后检查此文件,以便为代理生成新的资源状态。
    2. 使用以下命令删除代理节点检查点状态:
      1. sudo rm -f /var/lib/mesos/slave/meta/slaves/latest
  5. 创建 200 MB 回送设备。
    1. sudo mkdir -p /dcos/volume0
    2. sudo dd if=/dev/zero of=/root/volume0.img bs=1M count=200
    3. sudo losetup /dev/loop0 /root/volume0.img
    4. sudo mkfs -t ext4 /dev/loop0
    5. sudo losetup -d /dev/loop0
    这仅适用于测试目的。挂载卷必须至少有 200 MB 可用空间。每个卷 100 MB 由 DC/OS 保留,不可用于其他服务。
  6. 创建 fstab 条目并挂载。 确保卷在启动时自动挂载。也可以通过 systemd 挂载单元完成类似操作。
    1. echo "/root/volume0.img /dcos/volume0 auto loop 0 2" | sudo tee -a /etc/fstab
    2. sudo mount /dcos/volume0
  7. 重新启动。
    1. sudo reboot
  8. 通过 SSH 连接到到代理节点并查看 journald 日志以获取对新卷 /dcos/volume0 的引用。
    1. journalctl -b | grep '/dcos/volume0'
    特别是,应该有代理节点启动的条目和新的 volume0 Mount 磁盘资源:
    1. May 05 19:18:40 dcos-agent-public-01234567000001 systemd[1]: Mounting /dcos/volume0
    2. May 05 19:18:42 dcos-agent-public-01234567000001 systemd[1]: Mounted /dcos/volume0.
    3. May 05 19:18:46 dcos-agent-public-01234567000001 make_disk_resources.py[888]: Found matching mounts : [('/dcos/volume0', 74)]
    4. 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}}]
    5. 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 应用程序中使用挂载卷示例

  1. {
  2. "id": "/mount-test-svc1",
  3. "instances": 1,
  4. "cpus": 0.1,
  5. "mem": 128,
  6. "networks": [
  7. {
  8. "mode": "container/bridge"
  9. }
  10. ],
  11. "disk": 0,
  12. "gpus": 0,
  13. "backoffSeconds": 1,
  14. "backoffFactor": 1.15,
  15. "maxLaunchDelaySeconds": 300,
  16. "container": {
  17. "type": "DOCKER",
  18. "volumes": [
  19. {
  20. "persistent": {
  21. "size": 25,
  22. "type": "mount"
  23. },
  24. "mode": "RW",
  25. "containerPath": "volume0"
  26. }
  27. ],
  28. "docker": {
  29. "image": "nginx",
  30. "privileged": false,
  31. "forcePullImage": false
  32. },
  33. "portMappings": [
  34. {
  35. "containerPort": 80,
  36. "hostPort": 0,
  37. "servicePort": 10101,
  38. "protocol": "tcp",
  39. "name": "httpport",
  40. "labels": {
  41. "VIP_0": "/mount-test-svc1:80"
  42. }
  43. }
  44. ]
  45. },
  46. "healthChecks": [
  47. {
  48. "gracePeriodSeconds": 300,
  49. "intervalSeconds": 60,
  50. "timeoutSeconds": 20,
  51. "maxConsecutiveFailures": 3,
  52. "portIndex": 0,
  53. "path": "/",
  54. "protocol": "MESOS_HTTP",
  55. "delaySeconds": 15
  56. }
  57. ],
  58. "upgradeStrategy": {
  59. "minimumHealthCapacity": 0.5,
  60. "maximumOverCapacity": 0
  61. },
  62. "unreachableStrategy": "disabled",
  63. "killSelection": "YOUNGEST_FIRST",
  64. "requirePorts": true,
  65. "labels": {
  66. "HAPROXY_GROUP": "external"
  67. }
  68. }

在运行此服务后,导航到 Web 界面中的 Services > Volumes 选项卡:

挂载磁盘

图 1. Services > Volumes 选项卡

云提供程序资源

云提供程序存储服务通常用于支持 DC/OS 挂载卷。在设计生产 DC/OS 部署时,此参考材料非常有用:

最佳实践

Mount 磁盘资源主要用于 Kafka 和 Cassandra 等有状态服务,这些服务可以从整个群集中可用的专用存储中受益。使用 Mount 磁盘资源的任何服务具有对保留资源的独占访问权限。然而,考虑服务的性能和可靠性要求仍然很重要。Mount 磁盘资源的性能基于底层存储的特性,并且 DC/OS 不提供任何数据复制服务。请考虑以下事项:

  • Mount 磁盘资源与具有严格存储要求的有状态服务一起使用。
  • 根据有状态服务的存储需求和要求,仔细考虑文件系统类型、存储介质(网络链接、SSD 等)和卷特征(RAID 级别、大小调整等)。
  • 使用 Mesos 属性标记 Mesos 代理节点,该属性反映代理节点磁盘挂载的特征,例如, IOPS200、RAID1 等
  • 使用 Mesos 属性限制将有状态服务与存储代理节点相关联。
  • 考虑将要求严苛的存储服务隔离到专用存储代理节点中,因为文件系统页面缓存是主机级共享资源。
  • 确保使用 Mount 磁盘资源的所有服务都旨在处理一个或多个 Mount 磁盘资源的永久丢失。服务仍然负责管理数据复制和保留,从故障代理节点进行正常恢复以及关键服务状态的备份。