<!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
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>
