挂载磁盘资源

使用 Mesos 挂载存储资源

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

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

使用回送设备示例

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

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

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

  1. 通过 SSH 连接到群集中的代理节点。

  2. 检查当前代理节点的资源状态。

    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 尚无引用。

  3. 停止代理节点。

    • 专用代理节点上:

      sudo systemctl stop dcos-mesos-slave.service
      
    • 公共代理节点上:

      sudo systemctl stop dcos-mesos-slave-public.service
      
  4. 清除代理节点状态。

    1. 使用以下命令缓存卷挂载发现资源状态:

      sudo mv -f /var/lib/dcos/mesos-resources /var/lib/dcos/mesos-resources.cache
      

      DC/OS 将稍后检查此文件,以便为代理生成新的资源状态。

    2. 使用以下命令删除代理节点检查点状态:

      sudo rm -f /var/lib/mesos/slave/meta/slaves/latest
      
  5. 创建 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 保留,不可用于其他服务。

  1. 创建 fstab 条目并挂载。

    确保卷在启动时自动挂载。也可以通过 systemd 挂载单元完成类似操作。

    echo "/root/volume0.img /dcos/volume0 auto loop 0 2" | sudo tee -a /etc/fstab
    sudo mount /dcos/volume0
    
  2. 重新启动。

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