<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Apache Mesos - Multiple Disks</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <meta property="og:locale" content="en_US"/>
    <meta property="og:type" content="website"/>
    <meta property="og:title" content="Apache Mesos"/>
    <meta property="og:site_name" content="Apache Mesos"/>
    <meta property="og:url" content="http://mesos.apache.org/"/>
    <meta property="og:image" content="http://mesos.apache.org/assets/img/mesos_logo_fb_preview.png"/>
    <meta property="og:description"
          content="Apache Mesos abstracts resources away from machines,
                   enabling fault-tolerant and elastic distributed systems
                   to easily be built and run effectively."/>

    <meta name="twitter:card" content="summary"/>
    <meta name="twitter:site" content="@ApacheMesos"/>
    <meta name="twitter:title" content="Apache Mesos"/>
    <meta name="twitter:image" content="http://mesos.apache.org/assets/img/mesos_logo_fb_preview.png"/>
    <meta name="twitter:description"
          content="Apache Mesos abstracts resources away from machines,
                   enabling fault-tolerant and elastic distributed systems
                   to easily be built and run effectively."/>

    <link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
    <link rel="alternate" type="application/atom+xml" title="Apache Mesos Blog" href="/blog/feed.xml">
    <link href="../../../assets/css/main.css" media="screen" rel="stylesheet" type="text/css" />

    

    <!-- Google Analytics Magic -->
    <script type="text/javascript">
    var _gaq = _gaq || [];
    _gaq.push(['_setAccount', 'UA-20226872-1']);
    _gaq.push(['_setDomainName', 'apache.org']);
    _gaq.push(['_trackPageview']);

    (function() {
      var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
      ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
      var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
    })();
    </script>
    
  </head>
  <body>
    <!-- magical breadcrumbs -->
    <div class="topnav">
      <div class="container">
        <ul class="breadcrumb">
          <li>
            <div class="dropdown">
              <a data-toggle="dropdown" href="#">Apache Software Foundation <span class="caret"></span></a>
              <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
                <li><a href="http://www.apache.org">Apache Homepage</a></li>
                <li><a href="http://www.apache.org/licenses/">License</a></li>
                <li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
                <li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
                <li><a href="http://www.apache.org/security/">Security</a></li>
              </ul>
            </div>
          </li>

          <li><a href="http://mesos.apache.org">Apache Mesos</a></li>
          
          
          <li><a href="/documentation
/">Documentation
</a></li>
          
          
        </ul><!-- /.breadcrumb -->
      </div><!-- /.container -->
    </div><!-- /.topnav -->

    <!-- navbar excitement -->
<div class="navbar navbar-default navbar-static-top" role="navigation">
  <div class="container">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#mesos-menu" aria-expanded="false">
      <span class="sr-only">Toggle navigation</span>
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="/"><img src="/assets/img/mesos_logo.png" alt="Apache Mesos logo"/></a>
    </div><!-- /.navbar-header -->

    <div class="navbar-collapse collapse" id="mesos-menu">
      <ul class="nav navbar-nav navbar-right">
        <li><a href="/gettingstarted/">Getting Started</a></li>
        <li><a href="/blog/">Blog</a></li>
        <li><a href="/documentation/latest/">Documentation</a></li>
        <li><a href="/downloads/">Downloads</a></li>
        <li><a href="/community/">Community</a></li>
      </ul>
    </div><!-- /#mesos-menu -->
  </div><!-- /.container -->
</div><!-- /.navbar -->

<div class="content">
  <div class="container">
    <div class="row-fluid">
  <div class="col-md-4">
    <h4>If you're new to Mesos</h4>
    <p>See the <a href="/gettingstarted/">getting started</a> page for more
       information about downloading, building, and deploying Mesos.</p>

    <h4>If you'd like to get involved or you're looking for support</h4>
    <p>See our <a href="/community/">community</a> page for more details.</p>
  </div>
  <div class="col-md-8">
    <h1>Multiple Disks</h1>

<p>Mesos provides a mechanism for operators to expose multiple disk resources. When
creating <a href="/documentation/latest/./persistent-volume/">persistent volumes</a> frameworks can decide
whether to use specific disks by examining the <code>source</code> field on the disk
resources offered.</p>

<h2>Types of Disk Resources</h2>

<p><code>Disk</code> resources come in three forms:</p>

<ul>
<li>A <code>Root</code> disk is presented by not having the <code>source</code> set in <code>DiskInfo</code>.</li>
<li>A <code>Path</code> disk is presented by having the <code>PATH</code> enum set for <code>source</code> in
<code>DiskInfo</code>. It also has a <code>root</code> which the operator uses to specify the
directory to be used to store data.</li>
<li>A <code>Mount</code> disk is presented by having the <code>MOUNT</code> enum set for <code>source</code> in
<code>DiskInfo</code>. It also has a <code>root</code> which the operator uses to specify the
mount point used to store data.</li>
</ul>


<p>Operators can use the JSON-formated <code>--resources</code> option on the agent to provide
these different kind of disk resources on agent start-up. Example resource
values in JSON format can be found below. By default (if <code>--resources</code> is not
specified), the Mesos agent will only make the root disk available to the
cluster.</p>

<p><strong>NOTE:</strong> Once you specify any <code>Disk</code> resource manually (i.e., via the
<code>--resources</code> flag), Mesos will stop auto-detecting the <code>Root</code> disk resource.
Hence if you want to use the <code>Root</code> disk you will need to manually specify it
using the format described below.</p>

<h3><code>Root</code> disk</h3>

<p>A <code>Root</code> disk is the basic disk resource in Mesos. It usually maps to the
storage on the main operating system drive that the operator has presented to
the agent. Data is mapped into the <code>work_dir</code> of the agent.</p>

<p>An example resources value for a root disk is shown below. Note that the
operator could optionally specify a <code>role</code> for the disk, which would result in
<a href="/documentation/latest/./reservation/">statically reserving</a> the disk for a single <a href="/documentation/latest/./roles/">role</a>.</p>

<pre><code>    {
      "resources" : [
        {
          "name" : "disk",
          "type" : "SCALAR",
          "scalar" : { "value" : 2048 }
        }
      ]
    }
</code></pre>

<h3><code>Path</code> disks</h3>

<p>A <code>Path</code> disk is an auxiliary disk resource provided by the operator. This
can be carved up into smaller chunks by creating persistent volumes that use
less than the total available space on the disk. Common uses for this kind of
disk are extra logging space, file archives or caches, or other non
performance-critical applications.  Operators can present extra disks on their
agents as <code>Path</code> disks simply by creating a directory and making that the <code>root</code>
of the <code>Path</code> in <code>DiskInfo</code>&rsquo;s <code>source</code>.</p>

<p><code>Path</code> disks are also useful for mocking up a multiple disk environment by
creating some directories on the operating system drive. This should only be
done in a testing or staging environment. Note that creating multiple <code>Path</code>
disks on the same filesystem requires statically partitioning the available disk
space. For example, suppose a 10GB storage device is mounted to <code>/foo</code> and the
Mesos agent is configured with two <code>Path</code> disks at <code>/foo/disk1</code> and
<code>/foo/disk2</code>. To avoid the risk of running out of space on the device, <code>disk1</code>
and <code>disk2</code> should be configured (when the Mesos agent is started) to use at
most 10GB of disk space in total.</p>

<p>An example resources value for a <code>Path</code> disk is shown below. Note that the
operator could optionally specify a <code>role</code> for the disk, which would result in
<a href="/documentation/latest/./reservation/">statically reserving</a> the disk for a single <a href="/documentation/latest/./roles/">role</a>.</p>

<pre><code>    {
      "resources" : [
        {
          "name" : "disk",
          "type" : "SCALAR",
          "scalar" : { "value" : 2048 },
          "disk" : {
            "source" : {
              "type" : "PATH",
              "path" : { "root" : "/mnt/data" }
            }
          }
        }
      ]
    }
</code></pre>

<h3><code>Mount</code> disks</h3>

<p>A <code>Mount</code> disk is an auxiliary disk resource provided by the operator. This
<strong>cannot</strong> be carved up into smaller chunks by frameworks. This lack of
flexibility allows operators to provide assurances to frameworks that they will
have exclusive access to the disk device. Common uses for this kind of disk
include database storage, write-ahead logs, or other performance-critical
applications.</p>

<p>On Linux, <code>Mount</code> disks must map to a <code>mount</code> point in the <code>/proc/mounts</code>
table. Operators should mount a physical disk with their preferred file system
and provide the mount point as the <code>root</code> of the <code>Mount</code> in <code>DiskInfo</code>&rsquo;s
<code>source</code>.</p>

<p>Aside from the performance advantages of <code>Mount</code> disks, applications running on
them should be able to rely on disk errors when they attempt to exceed the
capacity of the volume. This holds true as long as the file system in use
correctly propagates these errors. Due to this expectation, the <code>disk/du</code>
isolation is disabled for <code>Mount</code> disks.</p>

<p>An example resources value for a <code>Mount</code> disk is shown below. Note that the
operator could optionally specify a <code>role</code> for the disk, which would result in
<a href="/documentation/latest/./reservation/">statically reserving</a> the disk for a single <a href="/documentation/latest/./roles/">role</a>.</p>

<pre><code>    {
      "resources" : [
        {
          "name" : "disk",
          "type" : "SCALAR",
          "scalar" : { "value" : 2048 },
          "disk" : {
            "source" : {
              "type" : "MOUNT",
              "mount" : { "root" : "/mnt/data" }
            }
          }
        }
      ]
    }
</code></pre>

<h4><code>Block</code> disks</h4>

<p>Mesos currently does not allow operators to expose raw block devices. It may do
so in the future, but there are security and flexibility concerns that need to
be addressed in a design document first.</p>

<h3>Implementation</h3>

<p>A <code>Path</code> disk will have sub-directories created within the <code>root</code> which will be
used to differentiate the different volumes that are created on it. When a
persistent volume on a <code>Path</code> disk is destroyed, Mesos will remove all the files
and directories stored in the volume, as well as the sub-directory within <code>root</code>
that was created by Mesos for the volume.</p>

<p>A <code>Mount</code> disk will <strong>not</strong> have sub-directories created, allowing applications
to use the full file system mounted on the device. This construct allows Mesos
tasks to access volumes that contain pre-existing directory structures. This can
be useful to simplify ingesting data such as a pre-existing Postgres database or
HDFS data directory. Note that when a persistent volume on a <code>Mount</code> disk is
destroyed, Mesos will remove all the files and directories stored in the volume,
but will <strong>not</strong> remove the root directory (i.e., the mount point).</p>

<p>Operators should be aware of these distinctions when inspecting or cleaning up
remnant data.</p>

  </div>
</div>

  </div><!-- /.container -->
</div><!-- /.content -->

<hr>



    <!-- footer -->
    <div class="footer">
      <div class="container">
        <div class="col-md-4 social-blk">
          <span class="social">
            <a href="https://twitter.com/ApacheMesos"
              class="twitter-follow-button"
              data-show-count="false" data-size="large">Follow @ApacheMesos</a>
            <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
            <a href="https://twitter.com/intent/tweet?button_hashtag=mesos"
              class="twitter-hashtag-button"
              data-size="large"
              data-related="ApacheMesos">Tweet #mesos</a>
            <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
          </span>
        </div>

        <div class="col-md-8 trademark">
          <p>&copy; 2012-2017 <a href="http://apache.org">The Apache Software Foundation</a>.
            Apache Mesos, the Apache feather logo, and the Apache Mesos project logo are trademarks of The Apache Software Foundation.
          <p>
        </div>
      </div><!-- /.container -->
    </div><!-- /.footer -->

    <!-- JS -->
    <script src="//code.jquery.com/jquery-1.11.0.min.js" type="text/javascript"></script>
    <script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js" type="text/javascript"></script>
  </body>
</html>
