<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Infinit's Blog]]></title><description><![CDATA[Welcome to Infinit’s official blog. Read about the evolution of the Infinit Storage Platform, news about the storage space, and more.]]></description><link>http://blog.infinit.sh/</link><generator>Ghost 0.11</generator><lastBuildDate>Mon, 05 Jun 2017 18:15:25 GMT</lastBuildDate><atom:link href="http://blog.infinit.sh/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Release 0.8.0 — Performance, gRPC interface, Prometheus monitoring...]]></title><description><![CDATA[<p>We just released the 0.8 version of our storage platform! Included in this release (<a href="https://infinit.sh/documentation/changelog?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=release-0-8-0">see full changelog</a>):</p>

<ul>
<li>A gRPC interface to the key-value store  using the <code>‑‑grpc</code> option</li>
<li>Prometheus-compatible metrics collection endpoint using the <code>‑‑prometheus</code> option</li>
<li>CLI adjustements</li>
<li>Performances improvements</li>
</ul>

<h2 id="whatsnext">What's next?</h2>

<p>As you can probably guess from our</p>]]></description><link>http://blog.infinit.sh/release-0-8-0-grpc-interface-prometheus-monitoring/</link><guid isPermaLink="false">60642108-6da0-4e31-b7ce-4a1b4baf5cb4</guid><dc:creator><![CDATA[Gaëtan Rochel]]></dc:creator><pubDate>Wed, 24 May 2017 13:56:22 GMT</pubDate><content:encoded><![CDATA[<p>We just released the 0.8 version of our storage platform! Included in this release (<a href="https://infinit.sh/documentation/changelog?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=release-0-8-0">see full changelog</a>):</p>

<ul>
<li>A gRPC interface to the key-value store  using the <code>‑‑grpc</code> option</li>
<li>Prometheus-compatible metrics collection endpoint using the <code>‑‑prometheus</code> option</li>
<li>CLI adjustements</li>
<li>Performances improvements</li>
</ul>

<h2 id="whatsnext">What's next?</h2>

<p>As you can probably guess from our change log, we're actively working on the key-value layer of our storage platform right now.</p>

<p>We're especially focused on improving and stressing our in-house key-value store. At the same time we're cleaning a lot of code so it can be open sourced in the following weeks.</p>

<p>You may wonder: why another key-value store? What will make it different from the etcd, Consul, ZooKeeper and other key-value stores is the use of a decentralized model (i.e peer-to-peer) where every node is equipotent, making it easily scalable, built with resilience and security in mind. </p>

<p>If you want to know more about it, have a look at <a href="http://blog.infinit.sh/infinit-at-dockercon/">the video or the slides from our DockerCon presentation</a> a few weeks ago.</p>

<p>As always,&nbsp;don&#39;t hesitate to get in touch with us if you have any feedback or would like to chat about our releases.&nbsp;We&#39;re on <a href="https://reddit.com/r/infinit" target="_blank">reddit</a>, <a href="https://twitter.com/infinit_sh" target="_blank">Twitter</a>, <a href="https://infinit.sh#slack" target="_blank">Slack</a>&nbsp;or <a href="http://webchat.freenode.net/?channels=infinit" target="_blank">IRC</a>.</p>]]></content:encoded></item><item><title><![CDATA[Infinit at DockerCon'17]]></title><description><![CDATA[<p>On the 13th of April, Quentin Hocquet and I (formerly CTO and CEO at Infinit, respectively) flew to Austin, Texas to participate to Docker's yearly conference: DockerCon'17.</p>

<h2 id="presentation">Presentation</h2>

<p>First and foremost, we wanted to share the slides and video of the presentation for all the ones who couldn't attend to</p>]]></description><link>http://blog.infinit.sh/infinit-at-dockercon/</link><guid isPermaLink="false">7f1470a3-37d0-4a58-bb93-9ea972a7ad4f</guid><dc:creator><![CDATA[Julien Quintard]]></dc:creator><pubDate>Wed, 24 May 2017 11:30:58 GMT</pubDate><content:encoded><![CDATA[<p>On the 13th of April, Quentin Hocquet and I (formerly CTO and CEO at Infinit, respectively) flew to Austin, Texas to participate to Docker's yearly conference: DockerCon'17.</p>

<h2 id="presentation">Presentation</h2>

<p>First and foremost, we wanted to share the slides and video of the presentation for all the ones who couldn't attend to enjoy (hopefully). Through this talk, I explain why we've designed Infinit's clustering technology this way, how it differentiate from other ones and what benefits it brings to the table:</p>

<iframe src="https://www.youtube.com/embed/MUD8t2oUDWg?ecver=2" width="640" height="360" frameborder="0" style="position:absolute;width:100%;height:100%;left:0" allowfullscreen></iframe>

<p><em>Slides</em>: <a href="https://www.slideshare.net/Docker/infinits-next-generation-keyvalue-store-julien-quintard-and-quentin-hocquet-docker">https://www.slideshare.net/Docker/infinits-next-generation-keyvalue-store-julien-quintard-and-quentin-hocquet-docker</a></p>

<h2 id="usecases">Use Cases</h2>

<p>During the four or so days at DockerCon, I've met with numerous people, from partners, customers and users. Such exchanges helped me get feedback and better understand everyone's expectations when it comes to storage. What came out of those discussions is that most people want storage to be taken care of, being the number one challenge to the containerization of their applications.</p>

<p>However, it also appeared that most people don't really know what type of data they intend to store, hence what they should use. This is especially true for enterprises that have thousands of legacy applications.</p>

<p>When it comes to cloud native developers, the number one application in need of a resilient and scalable storage backend seems to clearly be the database. Over the years at Infinit, we've always taken extra care explaining the specifics of a database when it comes to storage and as such what should be used.</p>

<p>What makes a database specific compared to other distributed applications is that the data stored is only accessed by a single node: a database frontend listens on a port, handles incoming requests and synchronizes its in-memory state on disk. Should the database be scaled out by spawning another frontend on another node, this new node would also synchronize its in-memory state on disk, but that disk would be completely isolated from the first node's.</p>

<p>Many other distributed applications need the state to be <strong>shared</strong> between multiple nodes. This is not the case for a database for which <strong>state is node specific</strong>.</p>

<h3 id="databasespecificredudancy">Database-specific redudancy</h3>

<p>This brings me to how such a state should be managed. In theory, one should always rely on the database's software to scale and handle redundancy. As such, if your database, such as MongoDB, provides a replication feature, we advise you to rely on it because the database application has more context to replicate data and optimize placement, load balancing etc. rather than rely on the storage backend.</p>

<p>We however understand that configuring and tuning a database is not everyone's hobby. Assuming throughput is not a problem and that all you want is for your database's state to be persisted, then you could use a resilient storage backend. Now the type of storage you decide to use will directly impact your database's performance.</p>

<h3 id="persistentstorage">Persistent storage</h3>

<p>Let us now come back to my previous and bold statement "it appears that most people don't really know what type of data they intend to store". The Infinit storage platform has been designed to provide multiple policy-customizable storage logics on top of a scalable and resilient storage clustering mechanism. By using the Infinit storage platform, you can decide to use one or more storage logic, most likely between an object storage, a block device or a (distributed) file system.</p>

<p>In the context of a database, most people I've talked to were drawn to the idea of deploying a distributed file system to back their database, because of the compliance to the POSIX standards. A distributed file system is able to support concurrent accesses from multiple nodes and handle conflicts. As such, since such multi-node concurrent accesses are not possible when it comes to a database (whose state is specific to a single node), using a distributed file system would be too expensive and you would end up paying the price for high-end functionalities that are unnecessary for a database.</p>

<p>A block device on the other end is, in theory (depending on the file system it is formatted in), only accessed from a single node. It therefore perfectly matches the requirements of a database application. In addition and because of this <em>limitation</em>, a block device will be more efficient that a distributed file system, doing away with locking, conflicts, cache invalidations etc.</p>

<p>As a summary, databases are likely to be the first and most deployed application requiring persistent storage. But because people have different needs, I believe that operators will want to have fine-grained control over their deployments and should as such achieve persistent state through the database's redundancy capability itself. As for developers, they don't want to waste time configuring and tuning a database to replicate itself. Those users could in this case rely on a block device storage logic, accessible through an interface such as NBD, iSCSI or else, so as to achieve persistent storage without much effort.</p>]]></content:encoded></item><item><title><![CDATA[Elle, reloaded]]></title><description><![CDATA[<p>You may have heard of the recent open-sourcing of our C++ core library, <a href="https://github.com/infinit/elle">Elle</a>, announced in a previous <a href="http://blog.infinit.sh/elle-our-c-core-library-is-now-open-source">blog post</a>.</p>

<p>We are it has created a wave of interest and led to a few suggestions and merge requests. We are especially proud that Elle was featured on the <a href="http://cppcast.com/2017/03/odin-holmes">2nd of</a></p>]]></description><link>http://blog.infinit.sh/elle-reloaded/</link><guid isPermaLink="false">b5c69d34-6ba1-4d6a-b7f9-aa880064942e</guid><dc:creator><![CDATA[Antony Méchin]]></dc:creator><pubDate>Thu, 06 Apr 2017 13:59:04 GMT</pubDate><content:encoded><![CDATA[<p>You may have heard of the recent open-sourcing of our C++ core library, <a href="https://github.com/infinit/elle">Elle</a>, announced in a previous <a href="http://blog.infinit.sh/elle-our-c-core-library-is-now-open-source">blog post</a>.</p>

<p>We are it has created a wave of interest and led to a few suggestions and merge requests. We are especially proud that Elle was featured on the <a href="http://cppcast.com/2017/03/odin-holmes">2nd of March, 2017 cppcast</a> (podcasts I highly recommend if you are interested in C++).</p>

<p>However, because of the history behind Elle, a 7-year-old library, which used to be closed-source, designed and used by a small team, Elle was more an holdall for our core libraries. The source code was barely documented and 4 namespaces were cohabiting.</p>

<p>We chose to revamp Elle, by cleaning everything, unifying coding style, documenting, writing examples, and more, to give Elle a new face. And it's live!</p>

<h2 id="aquickreminderofwhatelleis">A quick reminder of what Elle is</h2>

<p>Elle is a <em>“framework“</em>, written in C++14, that contains:</p>

<ul>
<li><strong>reactor:</strong> Asynchronous framework based on coroutines</li>
<li><strong>das:</strong> Compile-time introspection via symbol-based metaprogramming</li>
<li><strong>cryptography:</strong> Object-oriented API around OpenSSL</li>
<li><strong>protocol:</strong> Versioned and multiplexed communication protocol for remote procedure calls (<em>RPCs</em>)</li>
<li><strong>And more...</strong></li>
</ul>

<p>In addition, Elle is cross-platform. It works on common environments and architectures, including ARM (Elle has been tested on Android, iPhone and Raspberry Pi). To date, Elle was deployed on close to a million devices, thanks to Infinit's previous product <a href="https://infinit.io">infinit.io</a>.</p>

<h2 id="thenewfaceofelle">The new face of Elle</h2>

<p>As an open library, Elle now follows the same structure <a href="https://www.boost.org">Boost</a> uses:</p>

<ul>
<li>A unique namespace <code>elle</code></li>
<li>Most classes are now documented (abstract, example and public methods documentation)</li>
<li>Libraries names are now prefixed by <strong>elle_</strong>, e.g. <code>libelle_&lt;module&gt;.so</code></li>
</ul>

<p>Therefore, if you already use Elle, you will need to adjust your code because:</p>

<ul>
<li><code>reactor::</code> became <code>elle::reactor::</code>, <code>infinit::cryptography::</code> became <code>elle::cryptography::</code>, <code>infinit::protocol::</code> became <code>elle::protocol::</code>, etc.</li>
<li><code>libreactor.so</code> became <code>libelle_reactor.so</code>, <code>libelle.so</code> became <code>libelle_core.so</code>, etc.</li>
<li>etc.</li>
</ul>

<p><img src="https://github.com/infinit/elle/blob/master/docs/static_files/elle_logotype@2x.png?raw=true" width="300"></p>

<p>Now that things are getting serious, Elle even has its own logo. <a href="http://blog.infinit.sh/a-new-look-for-a-new-life/#projects">Read more...</a></p>

<h2 id="interestedintryingelle">Interested in trying Elle?</h2>

<p>As mentioned earlier, Elle is already accessible on GitHub (<a href="https://github.com/infinit/elle">here</a>) and includes a few examples to demonstrate what features it provides.</p>

<p>Elle doesn't have, strictly speaking, a standard release life cycle. For the sake of simplicity, we will weekly upload the newest 64-bits version for the LTS Ubuntu <a href="https://storage.googleapis.com/elle_tarball/elle.tbz">here</a> along with a Docker image (<a href="https://hub.docker.com/r/infinitd/elle">infinitd/elle</a>) containing Elle, built and installed, examples and a development environment (a compiler, buildsystems, etc.) so you can give Elle a quick try.</p>

<p>For more details about building or testing Elle, you can consult <a href="https://github.com/infinit/elle/wiki">Elle's wiki</a> on GitHub.</p>]]></content:encoded></item><item><title><![CDATA[A new look for a new life]]></title><description><![CDATA[<p>A lot of changes have happened at Infinit over the last few months. The Docker acquisition, the focus on our Storage Platform, the closure of our file transfer applications and more recently, we started open sourcing components of our technology. </p>

<p>With all this change, we decided we needed to refresh</p>]]></description><link>http://blog.infinit.sh/a-new-look-for-a-new-life/</link><guid isPermaLink="false">3fcc1ced-d94c-4346-b35d-a90392f9a4e9</guid><dc:creator><![CDATA[Gaëtan Rochel]]></dc:creator><pubDate>Mon, 13 Mar 2017 14:52:28 GMT</pubDate><content:encoded><![CDATA[<p>A lot of changes have happened at Infinit over the last few months. The Docker acquisition, the focus on our Storage Platform, the closure of our file transfer applications and more recently, we started open sourcing components of our technology. </p>

<p>With all this change, we decided we needed to refresh our image a bit to better match our new direction towards storage.</p>

<h2 id="logotype">Logotype</h2>

<p>People usually love our logo; it's super recognizable and has been the pillar of our image culture for years so the Infinit symbol isn't going anywhere. </p>

<p><em>Side note: our Infinit symbol and name actually come from the <a href="https://en.wikipedia.org/wiki/Endless_knot">Tibetan endless knot</a>.</em></p>

<p><img src="http://blog.infinit.sh/content/images/2017/03/logotype@2x.png" alt="Infinit old logo" width="300"></p>

<p>Our handwritten logotype also conveyed a nice playful character which was well adapted for our file transfer applications. With our shift to the storage world, we wanted a more serious connotation to better fit this new market and our enterprise focus. </p>

<p>However, it had to keep some of the cheerfulness of our previous logo since we still want to make creating storage infrastructure easy for any developer. </p>

<p><img src="http://blog.infinit.sh/content/images/2017/03/Screen-Shot-2017-03-10-at-15.28.49.png" alt="Infinit old logo" width="300"></p>

<p>We went with the <a href="https://www.fontsquirrel.com/fonts/linotte">Linotte</a> font, designed by <a href="http://www.joelcarrouche.net/">Joël Carrouché</a> which perfectly met all of our requirements. It's more readable at small size, has a solid geometric construction while maintaining a few imperfections conveying exactly the feeling we had in mind.</p>

<h2 id="projects">Projects</h2>

<p>Over the last few months we've been working hard to open source our technology, component by component (you can follow our progress on our <a href="https://infinit.sh/open-source">projects page</a>). </p>

<p>We started with our build system written in Python 3, <a href="https://github.com/infinit/drake">Drake</a>, and we recently added our coroutine-based asynchronous C++ development framework, <a href="https://github.com/infinit/elle">Elle</a>.</p>

<p><img src="http://blog.infinit.sh/content/images/2017/03/Screen-Shot-2017-03-10-at-15.25.04.png" alt="" width="600"></p>

<p>With our infinite symbol as the model, we reused the same mechanics playing with the loop widths to get these two logos.</p>

<p>The <em>Drake</em> logo represents the mystical drake animal as you probably guessed.</p>

<p>The <em>Elle</em> logo... sit tight. In French, <em>Elle</em> is pronounced like the letter <em>"L"</em>, and is our feminine gender third-person singular subject pronoun. Well, it means <em>"she"</em>. We had a look at what the <em>L</em> letter represented and found that the symbol for the <em>L</em> hieroglyph is a lion, which is also an astrological sign represented by <a href="https://previews.123rf.com/images/stefaninahill/stefaninahill1209/stefaninahill120900045/15357316-Leo-The-Lion-Astrology-Sign-Stock-Vector-zodiac.jpg">this symbol</a>. Playing with the curve widths, we quickly agreed on this logo which can either look like the astrological sign, or a woman's hair — because it means <em>she</em>, get it? :)</p>

<p>Our key-value store will follow next, but we're still in some intense epic discussions about what the name will be.</p>]]></content:encoded></item><item><title><![CDATA[Elle, our C++ core library, is now open source]]></title><description><![CDATA[<p><strong>TL;DR. We are proud to finally open source <a href="https://github.com/infinit/elle">Elle</a>, Infinit's C++ core library providing a C++ asynchronous framework, based on coroutines, that comes with a set of modules to easily perform networking, serialization, RPCs, cryptography, distributed consensus and more.</strong></p>

<p>Even though the C++ standard has been moving pretty fast</p>]]></description><link>http://blog.infinit.sh/elle-our-c-core-library-is-now-open-source/</link><guid isPermaLink="false">f6aa59b0-58a6-4572-9ef1-5465ade9c770</guid><dc:creator><![CDATA[Antony Méchin]]></dc:creator><pubDate>Mon, 20 Feb 2017 14:49:46 GMT</pubDate><content:encoded><![CDATA[<p><strong>TL;DR. We are proud to finally open source <a href="https://github.com/infinit/elle">Elle</a>, Infinit's C++ core library providing a C++ asynchronous framework, based on coroutines, that comes with a set of modules to easily perform networking, serialization, RPCs, cryptography, distributed consensus and more.</strong></p>

<p>Even though the C++ standard has been moving pretty fast over the last few years, with a new version every 3 years, the C++ ecosystem lacks some important features. <a href="http://blog.infinit.sh/elle-our-c-core-library-is-now-open-source/www.boost.org">Boost C++ libraries</a> has been providing reference implementations for these missing features, helping programmers get a few steps ahead.</p>

<p>In 2009, Infinit's founder Julien <code>mycure</code> Quintard started developing Elle as the core library for <a href="https://www.repository.cam.ac.uk/bitstream/handle/1810/243442/thesis.pdf">his PhD</a> project: the prototype of the <a href="https://infinit.sh">Infinit storage platform</a>. After years and years of development, Elle has grown and is now a meta-library composed of a set of sub-libraries that we are proud to finally share with the community.</p>

<p><em>Elle is currently (mid February 2017) at <a href="https://infinit.sh/open-source#methodology">stage 1</a> (access); you can clone the source code, read it, build it and tweak it. However, until it reachs <a href="https://infinit.sh/open-source#methodology">stage 2</a> (develop), the documentation and hierarchy might seem confusing. Hopefully, within two months, Elle will reach stage 2 and be well documented.</em></p>

<h2 id="yetanotherlibrary">Yet another library?</h2>

<p>Elle is a software development framework, in the sense that it changes the way we approach asynchronism (spoiler: it uses coroutines).</p>

<p>Some frameworks like <a href="https://www.qt.io">Qt</a> with its signals/slots, rely on event-driven programming, which tends to produce "spaghetti code": it's hard to follow the execution without knowledge of a wide range of classes. Like every other paradigm, event-driven programming and coroutines have their pros and cons. However, as you can see, a few projects have emerged to introduce support for coroutines in Qt (<a href="https://github.com/ckamm/qt-coroutine">qt-couroutine</a> or <a href="https://github.com/fanout/qfiber">QFiber</a>). <em>I'm not blaming Qt people. Qt is an extremely mature, well designed framework and its popularity speaks for itself. Event-driven programming fits their needs perfectly.</em></p>

<p>Elle is much more than just an asynchronous framework; it comes with tons of built-in features. Being the core library of the Infinit storage platform, Elle provides all the tools you need to create projects which require cryptography, networking and/or consensus. With Elle, one could very easily develop, say, an HTTP server in C++ capable of handling tens of thousands of clients without breaking a sweat.</p>

<h2 id="welcometoelle">Welcome to Elle</h2>

<p>Elle is based on <a href="http://www.boost.org">Boost</a>, <a href="https://www.openssl.org">OpenSSL</a>, <a href="http://blog.infinit.sh/elle-our-c-core-library-is-now-open-source/www.zlib.net">zlib</a>, <a href="https://curl.haxx.se">curl</a>, and a few other libraries which forms a unified C++ environment, including:</p>

<ul>
<li>A complete asynchronous framework based on <a href="https://en.wikipedia.org/wiki/Coroutine">coroutines</a> in C++</li>
<li>Compile-time introspection via symbol-based metaprogramming</li>
<li>Object-oriented cryptography</li>
<li>Versioned and multiplexed communication protocol for remote procedure calls (RPCs)</li>
<li>And more...</li>
</ul>

<p>And, good news everyone, it's now open-source and available on our <a href="https://github.com/infinit/elle">GitHub account</a>.</p>

<h3 id="reactoranasynchronousframeworkforc">Reactor: an asynchronous framework for C++</h3>

<p>For those who are not familiar with coroutines, natively supported by dozens of languages (including <a href="https://golang.org">Go</a>, <a href="https://www.haskell.org">Haskell</a>, <a href="https://www.python.org">Python</a>, <a href="https://dlang.org">D</a>, etc.), they allow for non-preemptive multitasking (unlike threads) offering concurrency with a reduced need for locking and fit extremely well in I/O bound programming. They also allow for an illusion of sequential code execution in an asynchronous environment.</p>

<p>Basically, a coroutine can choose to yield, in which case its context (state of the program) is saved and the routine goes to <em>sleep</em>. Then, another coroutine is <em>woken</em>, has its context restored, runs until it yields or completes and so on until all the coroutines have completed their tasks. Unlike thread programming, the current coroutine cannot be preempted.</p>

<p>Coroutines are one of the current hot topics for C++, with a <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4628.pdf">proposal</a> for a potential addition to the standard. <a href="http://www.boost.org/doc/libs/1_63_0/libs/coroutine/doc/html/coroutine/overview.html">Boost.Coroutine</a> already provides "templates for generalized subroutines". Elle's <em>reactor</em> sub-library, in addition to providing an elegant and portable implementation of coroutine, is the complete asynchronous framework mentioned earlier, that includes networking sockets (TCP, UDP, µTP), support for HTTP(s), finite state machines (FSM), synchronization mechanisms, etc.</p>

<p>Here is an example of a coroutine in charge of echoing back a message. As you will see, the code is written as a natural sequence of instructions to execute, same for exception handling: no hooks, no promises and no callbacks.</p>

<pre><code class="language-cpp">void  
echo_server()  
{
  // ...
  // For each connection, store the coroutine it was assigned to.
  client_threads.emplace_back(
    std::make_shared&lt;reactor::Thread&gt;(
      sched, "serve",
      // Echo a message back to it sender.
      [socket]
      {
        // Until the connection is closed.
        try
        {
          while (true)
          {
            // Yield until a the message is read until '\n'.
            auto line = socket-&gt;read_until("\n");
            // Yield until the message is written.
            socket-&gt;write(line);
          }
        }
        catch (reactor::network::ConnectionClosed const&amp;)
        {}
      }));
}
</code></pre>

<p>It is as simple to perform HTTP requests.</p>

<pre><code class="language-cpp">// Parse a stream, expecting JSON.
auto process_json = [] (elle::IOStream const&amp; body)  
                    {
                      // Do something clever.
                    };
// Create the HTTP request.
auto r = reactor::http::Request{  
  "http://maps.googleapis.com/maps/api/geocode/json",
  reactor::http::method::GET,
  "application/json"};
// Set the query.
r.query_string({{"address", "white house"},  
                {"sensor", "false"}});
// Finalize the operation.
r.finalize();  
if (r.status() == reactor::http::StatusCode::OK)  
  // Parse the output as a stream.
  process_json(r);
// ...
</code></pre>

<h3 id="dascompiletimeintrospection">Das: compile-time introspection</h3>

<p>Even if C++ offers powerful metaprogramming capabilities, Das uses a symbol-based paradigm to push it further. Named symbols provide powerful compile-time introspection, allowing for more flexibility and decision making. It also provides convenience features like:</p>

<ul>
<li><strong>Printing and serialization</strong></li>
</ul>

<p>Writing printers and basic serialization implementation is a time consuming and redundant task. Das provides a non-intrusive default serialization implementation and printer for C++ objects.</p>

<ul>
<li><strong>Named arguments</strong></li>
</ul>

<p>With minimal intrusion, Das offers the possibility to have named arguments in C++ for clearer and less error prone function calls.</p>

<ul>
<li><strong>CLI</strong></li>
</ul>

<p>Often, command line tools have a 1-1 mapping to the underlying functions actually invoked and force manual type-conversion from the CLI argument to the type of the actual function argument. Named symbols, by design, perfectly solve the problem, offering an almost zero cost CLI binding.</p>

<p>Here is an example demonstrating how, in a non-intrusive way, you can provide serialization and printing for a random object.  </p>

<pre><code class="language-cpp">// The symbols used for introspection.
DAS_SYMBOL(artist);  
DAS_SYMBOL(title);

struct Record  
{
  std::string artist;
  std::string title;
};
// The Model, which declares the symbols associated to a class or struct.
using Model = das::Model&lt;Record,  
                         elle::meta::List&lt;Symbol_title,
                                          Symbol_artist&gt;&gt;;
// Set Model as the default model for Record.
DAS_MODEL_DEFAULT(Record, Model);  
// Make all class::Model printable.
using das::operator &lt;&lt;;

// You know have access Das' features:
// - Printing:
// &gt; Record(artist = "Darude", title = "Sandstorm")
std::cout &lt;&lt; Record{"Darude", "Sandstorm"} &lt;&lt; std::endl;  
// - Serialization
// &gt; {"artist": "Darude", "title": "Sandstorm"}
elle::serialization::json::SerializerOut serializer(std::cout, false);  
das::serialize(Record{"Darude", "Sandstorm"}, serializer);  
</code></pre>

<h3 id="cryptographyobjectorientedwrapperforopenssl">Cryptography: object-oriented wrapper for OpenSSL</h3>

<p>Cryptography is a tough and complex area but thanks to OpenSSL, we don't have to re-implement cryptographic algorithms. Elle's <em>cryptography</em> sub-library is a convenience wrapper over OpenSSL, offering modern C++ interfaces, object-oriented and stream-oriented APIs, automatic resource management, transparent module initialization and deinitialization, etc.: The power of OpenSSL with the elegance of modern C++.</p>

<pre><code class="language-cpp">#include &lt;cryptography/rsa/KeyPair.hh&gt;
#include &lt;cryptography/SecretKey.hh&gt;

// This is a bad implementation of cryptography::envelope.
// It stands here as an example.
std::tuple&lt;elle::Buffer, elle::Buffer&gt;  
hybrid_encrypt(cryptography::rsa::PublicKey const&amp; peer_key)  
{
  // The payload you want to send.
  auto data = elle::Buffer{"super important data to encrypt"};
  // Generate a random password of 1024 characters.
  auto symmetric_key = cryptography::SecretKey(
    cryptography::generate&lt;elle::Buffer&gt;(1024));
  // Encipher the payload with the secret key.
  auto encrypted_payload = symmetric_key.encipher(
    data,
    cryptography::Cipher::blowfish, // default: aes256
    cryptography::Mode::cfb, // default: cbc
    cryptography::OneWay::sha512 // default: sha256
  );
  // Encrypt the key itself.
  auto encrypted_key = peer_key.encrypt(symmetric_key);

  // Return both encrypted payload and key, so the peer can decrypt the key
  // using his private key and use that key to decipher the original payload.
  return {encrypted_payload, encrypted_key};
}
</code></pre>

<h3 id="protocolunifiedcommunicationchannels">Protocol: unified communication channels</h3>

<p>Because the Infinit storage platform relies on sending data between nodes, setting up a sustainable channel of communication is crucial. Unification and versioning of the communication protocol itself are mandatory for robustness. Elle's <em>protocol</em> sub-library is designed to transparently take care of those two requirements on top of every stream.</p>

<p>It also allows for multiplexing communications channels in a single stream in order to support our <a href="https://en.wikipedia.org/wiki/Remote_procedure_call">remote procedure call</a> (RPC) system.</p>

<h3 id="andmore">And more...</h3>

<p>Elle contains additions to the standard library, such as printers for standard types, new algorithms, but also classes and functions related to:</p>

<ul>
<li><a href="https://github.com/infinit/elle/tree/master/elle/src/elle/log">Logging</a> (hierarchical logging system)</li>
<li><a href="https://github.com/infinit/elle/tree/master/elle/src/elle/serialization">Serialization</a> (JSON and binary)</li>
<li><a href="https://github.com/infinit/elle/tree/master/athena/src/athena">Distributed consensus</a> (<a href="https://en.wikipedia.org/wiki/Paxos_(computer_science)">Paxos</a>)</li>
<li>Exception handling (nesting, serializable exceptions, etc.)</li>
<li>Lazy evaluation wrappers, generators, etc.</li>
<li>UUID</li>
<li>And many more...</li>
</ul>

<h2 id="usagesupportandcontribution">Usage, support and contribution</h2>

<p>Elle is officially maintained by Infinit (which is now part of <a href="https://docker.com">Docker</a>). Elle will evolve according to our own needs, therefore, APIs may change over time. Also, binary compatibility won't be preserved between versions for now.</p>

<p>You can legitimately ask why you should use Elle then. Elle is a library which provides, in our opinion, great tools to write beautiful, easy to maintain and efficient code in C++. At present, we can't ensure backward compatibility, mostly because it requires a lot of effort, but open-sourcing it will push us towards this. Also, its stability and efficiency has been proven by the two projects Infinit has developed, the <a href="https://infinit.io">Infinit file transfer</a> applications (deployed on close to a million devices, both desktop and mobile) and our current project, the <a href="https://infinit.sh">Infinit storage platform</a>.</p>

<p>If you have any questions or issues, we are available:</p>

<ul>
<li>by email: <a href="mailto:open+elle@infinit.sh">open+elle@infinit.sh</a></li>
<li>on <a href="https://infinit.sh/#slack">Slack</a>: channel #elle</li>
<li>on GitHub: <a href="https://github.com/infinit/elle">https://github.com/infinit/elle</a></li>
</ul>

<p>If you want to contribute, you are more than welcome. However, until the project reaches its <a href="http://infinit.sh/open-source#methodology">final stage</a>, contributions may take longer than expected to be integrated.</p>]]></content:encoded></item><item><title><![CDATA[How to choose between hyper-convergent and hyper-scalable storage architectures]]></title><description><![CDATA[<p>Before jumping directly into the heart of the article, let's clarify these two terms with their definition to bring some context.</p>

<h4 id="hyperscale">Hyper-scale</h4>

<p>Hyper-scale is the ability of an architecture to scale appropriately as increased demand is added to the system. This typically involves the ability to seamlessly provision and add</p>]]></description><link>http://blog.infinit.sh/hyperconvergent-and-hyperscalable-storage-for-docker-2/</link><guid isPermaLink="false">b2e91488-c6b2-4039-9ae9-64f3fed790b8</guid><dc:creator><![CDATA[Gaëtan Rochel]]></dc:creator><pubDate>Tue, 14 Feb 2017 14:30:24 GMT</pubDate><content:encoded><![CDATA[<p>Before jumping directly into the heart of the article, let's clarify these two terms with their definition to bring some context.</p>

<h4 id="hyperscale">Hyper-scale</h4>

<p>Hyper-scale is the ability of an architecture to scale appropriately as increased demand is added to the system. This typically involves the ability to seamlessly provision and add compute, memory, networking, and storage resources to a given node or set of nodes that make up a larger computing environment — from <a href="https://en.wikipedia.org/wiki/Hyperscale">Wikipedia</a>.</p>

<p>In short: every component can scale separately.</p>

<p>This hyper-scale model has been popularized by the giants Google, Facebook, Amazon and their large distributed sites. But a new model is emerging these last years, first  with the virtual desktop infrastructure (VDI) and now with the attractiveness of containers.</p>

<h4 id="hyperconvergence">Hyper-convergence</h4>

<p>Hyper-convergence is a type of infrastructure system with a software-centric architecture that tightly integrates compute, storage, networking and virtualization resources and other technologies from scratch — from <a href="http://searchconvergedinfrastructure.techtarget.com/definition/hyper-convergence">TechTarget</a>.</p>

<p>In short: everything scales together. Let's visualize it with a schema.</p>

<p><img src="http://blog.infinit.sh/content/images/2017/01/Screen-Shot-2017-01-26-at-10.52.23.png" alt="schema hypers-calable vs hyper-convergence"></p>

<p>As you can imagine, these two models come from different use cases and there is not one solution prevailing over the other. This is how Software Defined Storage (SDS) solutions like Infinit come into play. </p>

<h2 id="infinitdefaulthyperscalablearchitecture">Infinit default hyper-scalable architecture</h2>

<p>By default, Infinit allows you to build your own custom storage infrastructure without taking consideration of your application, basically providing you the <em>storage</em> part on the hyper-scalable architecture schema above.</p>

<p>One big advantage of this system is that if you want to add and remove storage nodes on the fly without interfering with your application, you can. Because of its resilience and decentralized architecture, Infinit is able to take care of rebalancing data between all the nodes, or to heal itself if one node were to crash.</p>

<p>This architecture is perfect for operators wanting complete isolation and control over their storage component, independently of their computing resources. </p>

<h2 id="buildinghyperconvergentarchitectureswithinfinit">Building hyper-convergent architectures with Infinit</h2>

<p>But it's easy to imagine different use cases where developers want an easy way of scaling storage alongside their applications.</p>

<p>Dealing with two different clusters — one for storage, one for applications — is particularly cumbersome for developers that don't want to tweak every detail of their architecture.</p>

<p>That's why hyper-convergence architecture are interesting for them, making storage scale alongside their application cluster. In the context of containers, such an application cluster would be managed by an orchestrator, such as <a href="https://www.docker.com/products/docker-swarm">Docker Swarm</a>, <a href="https://kubernetes.io/">Kubernetes</a> or <a href="http://mesos.apache.org/">Mesos</a>.</p>

<p>Well, Infinit also provides a simple way to add hyper-converged storage to your Docker Swarm, meaning that as a compute node is added to a Swarm, Infinit aggregates its storage capacity to the virtual pool. </p>

<p>This global persistent storage can then be used by any container running on the Swarm to provide a place to store common files or share state. As nodes join or leave the Swarm, Infinit automatically scales the storage and rebalances or replicates blocks to ensure high availability and redundancy of the data stored. </p>

<p><a class="quote">Infinit provides a simple way to add hyper-converged storage to your Docker Swarm.</a></p>

<p>We made a prototype during a Docker hackathon in 2016, <a href="https://devpost.com/software/infinit-docker-hackathon-1-12">have a look</a>!</p>

<h2 id="choosingwhatsbestforyou">Choosing what's best for you</h2>

<p>There are no right answers as to which architecture is better. </p>

<p>If you're a developer looking for a simple solution that lets you focus on your code rather than tweaking your storage layer, go for an hyper-convergent architecture. If you're an operator, deploying applications in production, in need of an elastic and resilient storage layer, go for an hyper-scalable one.</p>

<p>But choosing a software defined storage product like Infinit will allow you to adapt to every situation. Whether you need an empowered hyper-converged Docker Swarm with persistent storage or an independent hyper-scalable storage infrastructure for your applications, Infinit won't lock you up to an unique solution. </p>]]></content:encoded></item><item><title><![CDATA[Akim is joining our team]]></title><description><![CDATA[<p>We haven't talked much about our team and the seven people composing it over the last few months, so here is our effort trying to be a little more transparent about it.</p>

<p>Akim started working with us on our storage platform a couple of months ago. He has now joined</p>]]></description><link>http://blog.infinit.sh/akim-is-joining-our-team/</link><guid isPermaLink="false">21fe56ef-5ee6-4a80-b59e-4279db39b7cc</guid><dc:creator><![CDATA[Gaëtan Rochel]]></dc:creator><pubDate>Tue, 07 Feb 2017 16:31:34 GMT</pubDate><content:encoded><![CDATA[<p>We haven't talked much about our team and the seven people composing it over the last few months, so here is our effort trying to be a little more transparent about it.</p>

<p>Akim started working with us on our storage platform a couple of months ago. He has now joined Docker to officially take part in our 7-people team!</p>

<p>Let's introduce Akim with a small biography. </p>

<p><img src="http://blog.infinit.sh/content/images/2017/02/Combined-Shape@2x.jpg" alt=""></p>

<h3 id="phdyears">PhD years</h3>

<p>Everything started when Akim was a PhD student.</p>

<p>He was sitting next to the printer, where he could see all the different ways that people wasted paper: single-sided printing, large fonts for plain text, print PostScript source instead of rendered PostScript, etc.  </p>

<p>So he decided to help out by writing scripts named after the printers. These scripts made it easy to print double-sided, to print several "virtual minipages" on single physical pages, etc.  </p>

<p>At some point, he also used a small C program to convert plain text files into decent PostScript: <a href="https://www.gnu.org/software/a2ps/">a2ps</a>. </p>

<p>Over the years he added several features to a2ps which eventually integrated all the features from the original shell-scripts, including pretty-printing for more programming languages, reordering pages to print duplex booklets, and many, many other features. This new a2ps became very successful (eventually it was dubbed GNU a2ps), so he started to get reports about portability issues.  </p>

<p><img src="http://blog.infinit.sh/content/images/2017/02/empowered-by-gnu@2x.png" width="200" alt="GNU logo"></p>

<p>That’s how he ended up using <a href="https://www.gnu.org/software/autoconf/autoconf.html">Autoconf</a>, and then <a href="https://www.gnu.org/software/automake/">Automake</a>. To provide extensible pretty-printing features, he implemented a description language using <a href="https://en.wikipedia.org/wiki/GNU_bison">Bison</a> and Flex. And he used regular expressions heavily. Eventually, he contributed a lot to Bison, Autoconf, Automake and many other open source projects. He even became the official maintainer of Bison and Autoconf for a while.</p>

<h3 id="teachingatepita">Teaching at EPITA</h3>

<p>Right after his PhD defense, he was hired at <a href="http://www.epita.fr/">EPITA</a>, a French private university for computer science, by Thierry Géraud, founder of <a href="https://www.lrde.epita.fr/">LRDE</a>, EPITA's R&amp;D lab. He spent almost eighteen years there, teaching courses such as Formal Languages, Compiler Construction, C++, Formal Logic, Object-Oriented Design, etc.</p>

<p>The legend has it that he was the teacher of Julien &amp; Quentin (former CEO &amp; CTO of Infinit respectively) for a few years. </p>

<p>He was also involved in several projects: </p>

<ul>
<li><strong><a href="https://www.lrde.epita.fr/wiki/Vcsn">Vaucanson</a></strong>, a C++ platform dedicated to automata and rational expressions;</li>
<li><strong><a href="https://www.lrde.epita.fr/dload/20030521-Seminar/vasseur0503_transformers_report.pdf">Transformers</a></strong>, a source-to-source workbench for C++ programs;</li>
<li><strong><a href="https://tiger.lrde.epita.fr">Tiger</a></strong>, a compiler written in C++ based on Andrew Appel's brilliant "Modern Compiler Implementation" books which is used at EPITA to teach long-term software development. </li>
</ul>

<h3 id="roboticsatgostai">Robotics at Gostai</h3>

<p>For six years, starting in 2006, he was a part-time employee of <a href="http://www.gostai.com/">Gostai</a>, a French start-up working on robotics.  With <a href="http://twitter.com/mefyl">Quentin Hocquet</a>, Matthieu Nottale, and Antony Méchin (who was still an intern back then). They worked on the <a href="https://en.wikipedia.org/wiki/URBI">Urbi</a> platform, in particular the urbiscript programming language. </p>

<p><img src="http://blog.infinit.sh/content/images/2017/02/vcsn.png" alt=""></p>

<p>Then, when he went back full time to EPITA, he spent most of his research time on the <a href="https://www.lrde.epita.fr/wiki/Vcsn">Vcsn</a> project (<a href="https://gitlab.lrde.epita.fr/vcsn/vcsn">GitLab link</a>), a reboot of the Vaucanson project. Its core is a C++14 templated library, on top of which sits a "regular" and easy to use C++ library, thanks to type erasure and run-time code generation. Python and IPython bindings for it provide a very pleasant interactive graphical user experience. Don't tell anyone but he's quite proud of what Vcsn has become :)</p>

<h3 id="timeforanewadventure">Time for a new adventure</h3>

<p>After 6494 days spent at EPITA with its great team and passionate students, he's now part of the Infinit team at Docker, working on the distributed storage platform. Here, he will indulge himself in some of his passions: modern C++, frisbee, and coffee.</p>

<p>Akim will be working on the platform backend alongside Matthieu and Quentin. You can find him on <a href="https://infinit.sh/#slack">our Slack channel</a> at @akim.</p>

<p>Welcome <a href="https://www.linkedin.com/in/akimdemaille">Akim</a>!</p>]]></content:encoded></item><item><title><![CDATA[Infinit's build system: Drake]]></title><description><![CDATA[<p>In April 2016, we started our open-sourcing process by releasing a fork of Infinit's technical leader's (Quentin <a href="https://github.com/mefyl"><code>mefyl</code></a> Hocquet) build system: <a href="https://www.github.com/infinit/drake">Drake</a>.</p>

<p>Drake is a language agnostic build-system, officially adopted and supported by Infinit since July 2012. At Infinit, we use Drake to build our products (C++ and Objective-C), our</p>]]></description><link>http://blog.infinit.sh/infinits-build-system-drake/</link><guid isPermaLink="false">8707fb33-e2e1-4012-b36c-be0c715ac29e</guid><dc:creator><![CDATA[Antony Méchin]]></dc:creator><pubDate>Fri, 20 Jan 2017 12:39:06 GMT</pubDate><content:encoded><![CDATA[<p>In April 2016, we started our open-sourcing process by releasing a fork of Infinit's technical leader's (Quentin <a href="https://github.com/mefyl"><code>mefyl</code></a> Hocquet) build system: <a href="https://www.github.com/infinit/drake">Drake</a>.</p>

<p>Drake is a language agnostic build-system, officially adopted and supported by Infinit since July 2012. At Infinit, we use Drake to build our products (C++ and Objective-C), our servers (Python), our websites (HTML, CSS and JS), to run tests and to package applications, etc.</p>

<p>We moved from <a href="https://cmake.org">CMake</a> to Drake for several reasons, the main one being that Drake configuration files (known as a drakefile) are plain Python3 files; it's easy to read and benefits from the rich Python3 ecosystem, making most tasks trival.</p>

<p>Drake is a bottom-up designed build system. It relies on 3 simple parts: <strong>nodes</strong> (files: sources or targets), <strong>builders</strong> (that creates nodes) and <strong>dependencies</strong> (conditions for builders); builders transforms a list of source nodes into a list of target nodes when all its dependencies have been fulfilled.</p>

<p>The drakefile (comparable to both a CMakefile and the resulting Makefile) is a Python3 file listing nodes and defining builders, in order to create a dependency graph. Once defined, the dependency graph is explored and Drake creates target nodes by running the associated builder. <a href="https://pypi.python.org/pypi/greenlet">Greenlets</a> allow for parallelizing builders and a cache (based on mtime and sources, targets and builder hashing) prevents unnecessary operations.</p>

<h2 id="drakeandc">Drake and C++</h2>

<p>Even though Drake is language agnostic, it includes a module for C++ designed to ease integration, including:</p>

<ul>
<li>Header exploration: Drake recursively explores <em>includes</em> and adds headers to the builder's sources; editing one, even a system header, will cause Drake to recompile.</li>
<li>Configuration composition: C++ configurations describe <em>include paths</em>, <em>library paths</em>, <em>flags</em>, etc and can be summed up together.</li>
<li>Tookits: Drake determines tools related to your compiler and detects source and target architectures, thereby, ease cross-compilation.</li>
</ul>

<p>Here is a drakefile for a dummy <code>hello_world.cc</code> example:</p>

<pre><code class="language-python">import drake  
import drake.cxx

def configure(cxx_toolkit = None,  
              cxx_config = drake.cxx.Config(),
              path = '.'):

  # Create a default C++ toolkit if none is provided.
  # This will use the default system compiler.
  cxx_toolkit = drake.cxx.GccToolkit(cxx_toolkit)

  # List the sources required.
  sources = drake.nodes(
    'hello_world.cc',
  )

  # Declare a builder to create our 'hello_world' executable.
  hello_world = drake.cxx.Executable(
    # Path in the build directory where the executable will be
    # output to.
    path = drake.Path('%s/hello_world' % path),
    sources = sources, # Sources on which the executable depends.
    tk = cxx_toolkit,  # C++ toolkit to use.
    cfg = cxx_config,  # C++ compiler configuration to use.
  )

  # Create a 'build' rule.
  # Invoking this rule using //build will build all targets
  # added to the rule (and their dependencies).
  build = drake.Rule('build')

  # Add the 'hello_world' executable to the rule's targets.
  build &lt;&lt; hello_world
</code></pre>

<p>Assuming the following hierarchy for the current working directory:  </p>

<pre><code class="language-bash">$ tree . --noreport
.
├── drakefile
└── hello_world.cc
</code></pre>

<p>Here is an example showing how easy Drake makes changing configuration. Assuming both the <code>PYTHONPATH</code> and <code>PATH</code> are correctly set:</p>

<pre><code class="language-bash">$ drake . --cxx_toolkit="g++" --path=linux //build
&lt;...&gt;  
Compile hello_world.o  
Link linux/hello_world  
&lt;...&gt;  
$ ./linux/hello_world
Hello, world!  
</code></pre>

<pre><code class="language-bash">$ drake . --cxx_toolkit="x86_64-w64-mingw32-g++" --path=windows //build
&lt;...&gt;  
Compile hello_world.o  
Link windows/hello_world.exe  
&lt;...&gt;  
$ wine64 windows/hello_world.exe
Hello, world!  
</code></pre>

<p>Easy!</p>

<h2 id="simpleasabrickbuildinggame">Simple as a brick building game</h2>

<p>Drake has been designed to be extensible! Because it relies on simple bricks, writing new modules is a simple task.</p>

<p>So, feel free to extend it: write modules for your favorite language, for documents, pictures, sound or video manipulation (why not!).</p>

<p>For example, <a href="https://github.com/infinit/drake/blob/master/src/drake/go/__init__.py">here</a> are the basics to add Go support to Drake. This can be used with a simple drakefile to build <a href="https://github.com/docker/machine">Docker machine</a>:</p>

<pre><code class="language-python">import drake.go  
import drake.git

def configure(goconfig = drake.go.Configuration(),  
              gotoolkit = drake.go.Toolkit()):

  config = drake.go.Configuration(goconfig)
  toolkit = drake.go.Toolkit(gotoolkit)
  build = drake.Rule('build')
  machine = drake.go.Source('cmd/machine.go')
  git = drake.git.Git()

  config.add_ldflags(
    ['-X',
     '%s.GitCommit=%s' % (toolkit.list('version'),
                          git.rev_parse('HEAD', short = True)),
     '-w',
     '-s'
   ])
  build &lt;&lt; drake.go.Executable(source = machine,
                               toolkit = toolkit,
                               config = config)
</code></pre>]]></content:encoded></item><item><title><![CDATA[Our open-sourcing philosophy]]></title><description><![CDATA[<p>To quote one of our <a href="http://blog.infinit.sh/introducing-infinit-file-system/#opensource">previous blog posts</a>:</p>

<p><em>Everyone in our team has been using open-source software since we started programming. We believe in the power of open-source and feel that it is only natural to give back to the community and be as transparent as possible regarding our technology.</em></p>]]></description><link>http://blog.infinit.sh/our-open-source-philosophy/</link><guid isPermaLink="false">4ef0c142-c34c-4945-a77d-1d2f6c875751</guid><dc:creator><![CDATA[Antony Méchin]]></dc:creator><pubDate>Mon, 09 Jan 2017 17:18:52 GMT</pubDate><content:encoded><![CDATA[<p>To quote one of our <a href="http://blog.infinit.sh/introducing-infinit-file-system/#opensource">previous blog posts</a>:</p>

<p><em>Everyone in our team has been using open-source software since we started programming. We believe in the power of open-source and feel that it is only natural to give back to the community and be as transparent as possible regarding our technology. We hope that by open-sourcing our code, more developers will join us and contribute to improve the core technology and build awesome tools on top of it.</em></p>

<p>We committed a few months ago to make our code available to the community. This has taken longer than we wanted but we're getting closer.</p>

<p>As a small team, resource allocation is always problematic but we finally made open-sourcing one of our priorities. Hence, expect some activity on our <a href="https://github.com/infinit">GitHub account</a> in the weeks to come.</p>

<h2 id="whatareweopensourcing">What are we open-sourcing?</h2>

<p>For the past 5 years, we have developed two products, a <a href="https://infinit.io">file transfer application</a> and a <a href="https://infinit.sh">storage platform</a>. Both rely on the same set of libraries and use our open-source build system: <a href="https://github.com/infinit/drake">Drake</a>.</p>

<p>We'd like to make Elle, our suite of core libraries, available to the community. We believe this powerful set of libraries will be useful to developers as it provides clean abstractions for common tasks and make use of interesting technologies (including coroutines). In addition, Elle's reliability, stability and performance have already been tested on close to a million of devices.</p>

<p>Once this has been completed, we would like to keep the momentum and open-source components of our storage platform. The first of these will be our horizontally-scalable, resilient and policy-based <a href="https://en.wikipedia.org/wiki/Key-value_database">key-value store</a> benefiting from cryptographic access control.</p>

<p>This will be followed by various bricks built on top of it, including tools to configure and monitor an infrastructure but, more importantly, developer APIs for creating various types of end user interfaces, allowing one to create file systems, object stores or block devices. We will include our implementations for a <a href="https://en.wikipedia.org/wiki/POSIX">POSIX-compliant</a> file system using FUSE, an <a href="http://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html">Amazon S3</a> compatible object store and a <a href="https://en.wikipedia.org/wiki/Network_block_device">Network Block Device</a>. <br>
<br><br></p>

<h2 id="howdoweproceed">How do we proceed?</h2>

<p>We want the open-source experience that developers (and contributors) have to be flawless. We know the frustration of a project that doesn't compile, doesn't behave as documented or has no documentation at all. To ensure the best experience possible, we will follow a strict <a href="https://infinit.sh/open-source#methodology">methodology</a> in our open-sourcing.</p>

<p><img src="http://blog.infinit.sh/content/images/2017/01/Screen-Shot-2017-01-06-at-14.02.24.png" alt=""></p>

<p>Going forward, we want open-source to be a cornerstone of our development process. We hope to have Elle available publicly in the coming weeks. In the meantime, you can always keep track of our <a href="http://infinit.sh/open-source">progress</a>.</p>]]></content:encoded></item><item><title><![CDATA[Infinit joins Docker]]></title><description><![CDATA[<p>Today, we are thrilled to announce that Infinit and Docker are joining forces.</p>

<p>To anyone following the container space, this may not come as a surprise because persistent storage remains the number one challenge when it comes to container technologies.</p>

<p>Still, for Infinit, this is a huge milestone, closing the</p>]]></description><link>http://blog.infinit.sh/infinit-joins-docker/</link><guid isPermaLink="false">93b7d545-1b4a-4bbf-889a-bf3738c5d999</guid><dc:creator><![CDATA[Julien Quintard]]></dc:creator><pubDate>Tue, 06 Dec 2016 14:44:13 GMT</pubDate><content:encoded><![CDATA[<p>Today, we are thrilled to announce that Infinit and Docker are joining forces.</p>

<p>To anyone following the container space, this may not come as a surprise because persistent storage remains the number one challenge when it comes to container technologies.</p>

<p>Still, for Infinit, this is a huge milestone, closing the loop that has taken the team through quite an incredible journey.</p>

<p><img src="http://blog.infinit.sh/content/images/2016/11/docker_team.jpg" alt=""></p>

<p>Docker has changed the way developers work. By providing an ecosystem of tools based on container technologies, developers and operators have been able to gain in agility and security. At the same time, Docker has succeeded at reconciling operators and developers (through what has been dubbed the DevOps movement) by making them speak the same language.</p>

<p>This whole revolution is still in its early stages even though both ends of the spectrum, startups and enterprises, have jumped on the train. Indeed, at this point, containers have been used primarily to deploy stateless applications because these can be stopped and relaunched easily, allowing for easy scalability.</p>

<p>Unfortunately, this is no longer enough as developers want more. Namely, they want the ability to scale stateful applications, such as databases, as easily as their stateless counterparts.</p>

<p>With stateful applications being the <a href="http://blog.infinit.sh/the-missing-piece-in-containers-storage/">next natural step</a> in this evolution, Infinit comes into play by providing the Docker community with a <a href="http://blog.infinit.sh/our-presentation-at-docker-distributed-systems-summit/">storage platform</a> that is scalable, resilient and easy to deploy.</p>

<p><img src="http://blog.infinit.sh/content/images/2016/12/platform.png" alt="" style="max-width:700px;"></p>

<p>There are numerous ways for Infinit to improve the Docker ecosystem, from a <a href="http://blog.infinit.sh/announcing-the-infinit-docker-volume-plugin/">default volume plugin</a> for stateful applications, to the distributed storage of images for the Docker Trusted Registry or to providing a hyper-converged storage environment in a Docker Swarm (something that we demonstrated in the latest <a href="https://devpost.com/software/infinit-docker-hackathon-1-12">Docker Hackathon</a>).</p>

<p>There is a long road ahead as Infinit is still in its infancy. Our plan for the coming months is to improve stability, resilience and scalability so that we can quickly release a production-ready version 1.0 of the software.</p>

<p><a class="quote">#Docker Acquires Distributed Storage Startup @infinit to Provide Support for Stateful Containerized Applications</a></p>

<p>We are also preparing to <a href="http://infinit.sh/open-source">open source</a> the different components of our software (core libraries, decentralized key-value store and storage platform), something that a lot of people have been (rightfully) requesting. Unfortunately until now, we lacked the resources to do it properly and we did not want to just throw the sources at the community without proper support.</p>

<p>In addition to this, we are hard at work developing more storage interfaces (iSCSI, NBD, AWS S3 etc.) in order to cover more use cases: databases, logs, website media files, concurrent accesses, etc.</p>

<p>Even though Docker has already made its mark in history, we believe that what the community sees today is really just the tip of the iceberg.</p>

<p>Docker has the potential to reshape infrastructure software at large. This is why, even though Infinit was about to close a significant round of financing, the team has preferred to join Docker in order to have a bigger and more direct impact.</p>

<p>Stay tuned, this is just a new beginning! Don't hesitate to subscribe (below) to this blog to follow the development of the Infinit storage platform.</p>

<p>You can read Docker's announcement on their <a href="https://blog.docker.com/2016/12/docker-acquires-infinit/">blog</a>.</p>

<p>⌘ ❤︎ 🐳</p>]]></content:encoded></item><item><title><![CDATA[Infinit now supports any S3 compatible storage backend]]></title><description><![CDATA[<p>Infinit tries to be as unconstrained as possible when it comes to the system it is running on so that it can be used in as many places as possible. In terms of backend storage for blocks, we support several different options including the local filesystem, Amazon S3 and Google</p>]]></description><link>http://blog.infinit.sh/infinit-now-supports-any-s3-compatible-storage-backend/</link><guid isPermaLink="false">9dc01459-a4a2-46cb-8602-1a8516dc348b</guid><dc:creator><![CDATA[Chris Crone]]></dc:creator><pubDate>Wed, 12 Oct 2016 16:09:44 GMT</pubDate><content:encoded><![CDATA[<p>Infinit tries to be as unconstrained as possible when it comes to the system it is running on so that it can be used in as many places as possible. In terms of backend storage for blocks, we support several different options including the local filesystem, Amazon S3 and Google Cloud Storage.</p>

<p>With the 0.7.0 release we've added any S3 compatible service to this list. This means that if you have an S3 compatible block store (such as <a href="https://minio.io">Minio</a>) you can now use this to store Infinit blocks.</p>

<p>To use this feature, you simply need to add the credentials for the service using <code>infinit-credentials</code>, then create your S3 type storage with an <code>--endpoint</code> option as follows:</p>

<pre><code>$&gt; infinit-credentials --add --aws --name minio
$&gt; infinit-storage --create --name minio \
    --s3 \
    --account minio \
    --region us-east-1 \
    --bucket my-bucket \
    --endpoint http://192.168.1.53:9000
</code></pre>

<p>Excluding the <code>--endpoint</code> option will make the storage default to using an Amazon S3 endpoint.</p>

<p>If you'd like to give it a try, we updated our S3 <a href="https://infinit.sh/documentation/storages/s3">documentation</a>. If you'd like us to add another provider, you can upvote or add it <a href="http://help.infinit.sh">here</a>.</p>]]></content:encoded></item><item><title><![CDATA[Our presentation at the Docker Distributed Systems Summit]]></title><description><![CDATA[<p>Our CTO, Quentin Hocquet, was invited to speak at the Docker Distributed Systems Summit in Berlin this week. The summit was targeted at developers and included high quality talks about distributed systems and issues.</p>

<p><img src="http://blog.infinit.sh/content/images/2016/10/IMG_4304.JPG" alt=""></p>

<p>During his <a href="http://www.slideshare.net/infinit-one/persistent-storage-tailored-for-containers-dockersummit">presentation</a>, Quentin talked about how the Infinit storage platform is designed and showed our</p>]]></description><link>http://blog.infinit.sh/our-presentation-at-docker-distributed-systems-summit/</link><guid isPermaLink="false">09f7d74c-ddc5-4712-ad5d-d736b250e55e</guid><dc:creator><![CDATA[Chris Crone]]></dc:creator><pubDate>Fri, 07 Oct 2016 15:13:47 GMT</pubDate><content:encoded><![CDATA[<p>Our CTO, Quentin Hocquet, was invited to speak at the Docker Distributed Systems Summit in Berlin this week. The summit was targeted at developers and included high quality talks about distributed systems and issues.</p>

<p><img src="http://blog.infinit.sh/content/images/2016/10/IMG_4304.JPG" alt=""></p>

<p>During his <a href="http://www.slideshare.net/infinit-one/persistent-storage-tailored-for-containers-dockersummit">presentation</a>, Quentin talked about how the Infinit storage platform is designed and showed our new tool <code>infinit-cluster</code> which simplifies setting up common storage deployments. We're still working on the tool so it's not yet included in Infinit but expect to see it in a future release.</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/k0m-XwCoxo0" frameborder="0" allowfullscreen></iframe>

<p>What follows is the demo that Quentin gave at the Docker Distributed Systems Summit. The demo creates three storage nodes (a.k.a servers) to store the blocks of data (with a default replication factor of three). We can then create a volume backed by this storage that can be accessed by other containers for example.</p>

<p>The first step is to initialize the Infinit cluster:</p>

<pre><code>$&gt; docker run --name node1 --rm \
    infinit:0.7.0 \
    infinit-cluster --init
</code></pre>

<p>Once this has been done, other nodes can join the cluster by connecting and authenticating to the first node. Those of you familiar with Docker Swarm will see that <code>infinit-cluster</code>'s syntax is very similar to Docker Swarm's.</p>

<pre><code>$&gt; docker run --name node2 \
    --link node1 \
    infinit:0.7.0 \
    infinit-cluster --join node1
</code></pre>

<pre><code>$&gt; docker run --name node3 \
    --link node1 --link node2 \
    infinit:0.7.0 \
    infinit-cluster --join node1
</code></pre>

<p>Once the Infinit cluster is running, we have a place to store our data. We can now launch a new container in which we will create a volume and mount it.</p>

<pre><code>$&gt; docker run --name client --privileged \
    --link node1 --link node2 --link node3 \
    infinit:0.7.0 \
    bash
$&gt; infinit-volume --create docker-summit
$&gt; infinit-volume --run docker-summit --mountpoint /mnt/infinit &amp;
</code></pre>

<p>Note that we need the <code>--privileged</code> mode so that we can mount the Infinit volume that we created.</p>

<p>Files and folders can be created in the <code>/mnt/infinit/</code> mountpoint and they will persist beyond the life of the newly launched container. They will also be accessible by other containers.</p>

<p>We can access the volume we created from other containers using the <a href="https://infinit.sh/documentation/docker/volume-plugin">Infinit Docker volume plugin</a>. This is part of the Infinit daemon which is also containerized and can be started using the following command:</p>

<pre><code>$&gt; docker run --name plugin --privileged \
    --volume /run:/run:shared \
    --link node1 --link node2 --link node3 \
    infinit:0.7.0 \
    sh -c 'infinit-cluster --connect node1 &amp;&amp; infinit-daemon --run'
</code></pre>

<p>Once the Infinit daemon is running, the <code>docker-summit</code> volume is exposed as a <a href="https://docs.docker.com/engine/tutorials/dockervolumes/">Docker volume</a> that you can use in any container.</p>

<pre><code>$&gt; docker run --name my-service \
    --volume infinit/docker-summit:/mnt/infinit \
    alpine \
    touch /mnt/infinit/something
</code></pre>

<p>Quentin's slides from his presentation can be found here: <br>
<a href="http://www.slideshare.net/infinit-one/persistent-storage-tailored-for-containers-dockersummit">http://www.slideshare.net/infinit-one/persistent-storage-tailored-for-containers-dockersummit</a></p>

<p>Check out the video here: <br>
<a href="https://www.youtube.com/watch?v=k0m-XwCoxo0">https://www.youtube.com/watch?v=k0m-XwCoxo0</a></p>

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Most evil slide of the <a href="https://twitter.com/hashtag/DockerSummit?src=hash">#DockerSummit</a> was definitely the <a href="https://twitter.com/infinit">@infinit</a> total knowledge pentagram <a href="https://t.co/NQGXR9WOuJ">pic.twitter.com/NQGXR9WOuJ</a></p>&mdash; *aanand, **kwaanand (@AanandPrasad) <a href="https://twitter.com/AanandPrasad/status/784779183859826688">October 8, 2016</a></blockquote>  

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>]]></content:encoded></item><item><title><![CDATA[Release 0.7.0 — Infinit for Windows, IPv6 & more...]]></title><description><![CDATA[<p>We just released the 0.7 version of our storage platform! A lot of things have been integrated into this release, including:</p>

<ul>
<li>Infinit for Windows in alpha</li>
<li>IPV6 support</li>
<li>New Koordinate overlay</li>
<li>S3 compatible storage support</li>
<li>Bandwidth and CPU usage optimization</li>
<li><a href="https://infinit.sh/documentation/changelog?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=release-0-7-0">Full changelog</a>
<br><br></li>
</ul>

<h2 id="infinitforwindows">Infinit for Windows</h2>

<p><img src="http://blog.infinit.sh/content/images/2016/09/giphy.gif" alt="Windows gif"></p>

<p>We finally have something</p>]]></description><link>http://blog.infinit.sh/release-0-7-0-infinit-for-windows-ipv6-more/</link><guid isPermaLink="false">0dce7aa0-701e-4b50-a290-3d3fccf004d3</guid><category><![CDATA[release]]></category><dc:creator><![CDATA[Gaëtan Rochel]]></dc:creator><pubDate>Wed, 28 Sep 2016 11:43:05 GMT</pubDate><content:encoded><![CDATA[<p>We just released the 0.7 version of our storage platform! A lot of things have been integrated into this release, including:</p>

<ul>
<li>Infinit for Windows in alpha</li>
<li>IPV6 support</li>
<li>New Koordinate overlay</li>
<li>S3 compatible storage support</li>
<li>Bandwidth and CPU usage optimization</li>
<li><a href="https://infinit.sh/documentation/changelog?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=release-0-7-0">Full changelog</a>
<br><br></li>
</ul>

<h2 id="infinitforwindows">Infinit for Windows</h2>

<p><img src="http://blog.infinit.sh/content/images/2016/09/giphy.gif" alt="Windows gif"></p>

<p>We finally have something to share with you, fellow Windows users. You can now find our Windows binaries on our website, and our <a href="https://infinit.sh/get-started?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=release-0-7-0">Get Started guide</a> is updated with some nice <code>dir</code> commands. </p>

<p><a href="https://infinit.sh/download?utm_source=blog&utm_medium=article&utm_campaign=release-0-7-0" class="button">Download</a>

<a href="https://infinit.sh/documentation/upgrading?utm_source=blog&utm_medium=article&utm_campaign=release-0-7-0" class="button">Upgrade</a>  
</p>

<p>Our GUI client, <a href="https://infinit.sh/drive?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=release-0-7-0">Infinit Drive</a>, is now also available on Windows.</p>

<p>As always,&nbsp;don&#39;t hesitate to get in touch with us if you have any feedback or would like to chat about our releases.&nbsp;We&#39;re on <a href="https://reddit.com/r/infinit" target="_blank">reddit</a>, <a href="https://twitter.com/infinit_sh" target="_blank">Twitter</a>, <a href="https://infinit.sh#slack" target="_blank">Slack</a>&nbsp;or <a href="http://webchat.freenode.net/?channels=infinit" target="_blank">IRC</a>.</p>]]></content:encoded></item><item><title><![CDATA[Announcing the Infinit Docker volume plugin]]></title><description><![CDATA[<p><strong>TLDR; we launched our <a href="https://infinit.sh/documentation/docker/volume-plugin?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=release-0-6-2">Docker Volume plugin</a> in the 0.6.2 release.</strong></p>

<p>Docker's lightweight virtualization, portable container format and orchestration tools are driving a revolution in software engineering and infrastructure. Lighter weight virtualization allows complex services to be broken into single applications per container which simplifies and clarifies system</p>]]></description><link>http://blog.infinit.sh/announcing-the-infinit-docker-volume-plugin/</link><guid isPermaLink="false">2725b678-3c6d-47fa-a192-6182c128bdca</guid><dc:creator><![CDATA[Chris Crone]]></dc:creator><pubDate>Tue, 20 Sep 2016 11:42:00 GMT</pubDate><content:encoded><![CDATA[<p><strong>TLDR; we launched our <a href="https://infinit.sh/documentation/docker/volume-plugin?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=release-0-6-2">Docker Volume plugin</a> in the 0.6.2 release.</strong></p>

<p>Docker's lightweight virtualization, portable container format and orchestration tools are driving a revolution in software engineering and infrastructure. Lighter weight virtualization allows complex services to be broken into single applications per container which simplifies and clarifies system design. </p>

<p>A portable container format and suite of orchestration tools mean that deploying services is easier, more robust and more deterministic than ever.</p>

<p><img src="http://blog.infinit.sh/content/images/2016/09/schema-docker-volume-plugin@2x-1.png" style="max-width:640px;" alt="Schema of the Infinit Docker Volume Plugin"></p>

<p>This ease of deployment and scaling is particularly the case for stateless applications. Scaling out is as simple as launching more application containers on available hosts and load balancing across them. Stateful applications are more complex. In the simplest form, application state can be stored on the container's host but this requires that an application is run on a specific host. </p>

<p>In addition, if this host were to be lost the application's state data would be lost too. Different applications have vastly different storage needs: a database may require raw block storage while a website may require an object store for images and yet another application a full POSIX compliant filesystem.</p>

<p>Clearly a networked storage solution which provides different types of storage is required. A modern solution should also scale well – as close to linearly as possible – and not have any single points of failure. These goals can only truly be met by a <a href="https://infinit.sh/documentation/technology?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=release-0-6-2">decentralized system</a>.</p>

<p>At Infinit we are building such a storage platform and with the 0.6.2 release we have introduced a <a href="https://infinit.sh/documentation/docker/volume-plugin?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=release-0-6-2">Docker volume plugin</a>. Once you have setup the Infinit daemon on your hosts, your containers will be able to mount Infinit volumes irrespective of the host that they're running on.</p>

<p>To get started with our Docker plugin, read the <a href="https://infinit.sh/documentation/docker/volume-plugin">documentation</a>.</p>

<p></p><p><a href="https://infinit.sh/documentation/docker/volume-plugin?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=release-0-6-2" class="button">Get Started</a></p>]]></content:encoded></item><item><title><![CDATA[Programmatic software-defined storage is taking over monolithic appliances]]></title><description><![CDATA[Software-defined storage is making its way into production environments because of compelling advantages over existing hardware-based solutions.]]></description><link>http://blog.infinit.sh/programmatic-software-defined-storage-is-taking-over-monolithic-appliances/</link><guid isPermaLink="false">aaa05650-a219-4a5a-9b6a-9a6b6dc55a33</guid><category><![CDATA[storage]]></category><category><![CDATA[software]]></category><category><![CDATA[enterprise]]></category><dc:creator><![CDATA[Julien Quintard]]></dc:creator><pubDate>Tue, 13 Sep 2016 13:10:11 GMT</pubDate><content:encoded><![CDATA[<p>Software is eating the world, Marc Andressen <a href="http://www.wsj.com/articles/SB10001424053111903480904576512250915629460">famously said</a>. Well not surprisingly, enterprise infrastructure is also being caught in this tornado, thanks primarily to two phenomena.</p>

<p>Container technologies and the micro-services philosophy allow for more agility when it comes to developing and deploying applications. In addition to such revolutionary technologies are software-defined infrastructure solutions, from networking to storage, which have been in used in development environments for years but are now about to disrupt enterprise IT.</p>

<p>These two trends have been obvious to developers and operators for quite some time already, in particular following the exceptional growth of Docker. But it happens that enterprises are also embracing these radical changes as Keith Fulton, CTO of <a href="http://www.adp.com">ADP</a>, made clear in <a href="https://youtu.be/KC9tJ7b3dww?t=1h6m18s">his talk at DockerCon'16</a>.</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/KC9tJ7b3dww" frameborder="0" allowfullscreen></iframe>

<p class="legend">Keith Fulton talk during DockerCon'16 (from 1:06:00)</p>

<p>Enterprises feel that it is about time, having learned the hard way that their storage infrastructure is stuck in another age. Expensive appliances, non-scalable protocols, monolithic setups and non-programmable components are just too far off to keep pace with ever-changing business requirements.</p>

<p>As a result, many enterprises are no longer afraid to consider drastically modernizing their infrastructure. This process starts by replacing their hardware storage setup with a naturally distributed storage platform. By decoupling the hardware from the software, one can expect to reduce costs and greatly gain in flexibility.</p>

<p>This trend is already made clear both through market research analyses and the lost of market shares from all the major hardware vendors: EMC, NetApp, HP, Dell etc.</p>

<p><a class="quote">Software-defined storage is making its way into production environments.</a></p>

<p>Whether you like it or not, software-defined storage is making its way into production environments because of compelling advantages over existing hardware-based solutions:</p>

<ol>
<li><p><strong>Scalability</strong>: Software-defined solutions can scale up to several petabytes (even to exabytes if well-architectured) whereas appliance-based solutions are inherently limited in terms of storage capacity. In addition, software-based solutions can very quickly scale out to thousands of computer nodes, in particular if benefiting from a decentralized architecture (i.e no metadata server): <a href="http://infinit.sh">Infinit</a>, <em>Cassandra</em>, <em>Tahoe-LAFS</em> etc.</p></li>
<li><p><strong>Cost</strong>: While enterprises have been locked in with existing vendors for decades, software-defined solutions allow them to finally decide which hardware to use: re-use legacy appliances, buy custom or commodity hardware. Enterprises can expect a 70+% reduction in total cost of ownership. In addition, because different servers can compose the software-defined infrastructure, it is much more cost effective than traditional solutions to keep pace and adapt to the exponentially growing amount of data to store by integrating modern hardware.</p></li>
<li><p><strong>Security</strong>: While the firmware of hardware-based solutions is rarely updated, leading to critical security holes that are never fixed, software-based solutions can be updated on a regular basis to benefit from security patches and performance optimizations.</p></li>
<li><p><strong>Flexibility</strong>: Software-based solutions can, by definition, run anywhere (or they shouldn't call themselves software-defined): bare metal, virtual machines or containers. Given this flexibility, such solutions are ideal for more complex environments: multi-site, hybrid cloud etc. In addition, some software-defined solutions (Infinit and Hedvig primarily) go further by allowing multiple storage infrastructure to evolve in parallel, each with its own set characteristics: topology, composition etc. This capability allows enterprises to choose which data goes where: to the cloud for rarely accessed data for instance, or on premise for benefiting from a faster access or to keep business critical information under control.</p></li>
<li><p><strong>Programmatic</strong>: Even more important to modern flows is the possibility to control the behavior of a storage infrastructure through a set of properties: redundancy, security, data placement, versioning and more. This allows developers and enterprises to set up different infrastructure with different optimizations that will suit the needs of the overlying application/user.</p></li>
</ol>

<p>For the past decade, several software-defined solutions have paved the way to what is now accepted as a viable solution to production challenges, most notably RedHat's <em>Ceph</em> and <em>GlusterFS</em> but also <em>Nexenta</em>.</p>

<p>Even though such storage solutions are not necessarily playing very well with the cloud, it is worth noting that software-defined storage, by definition, can be complementary by allowing for hybrid cloud deployments.</p>

<p>Also, thanks to the advent of containers, enterprises could also create their own cloud by relying on cloud-based bare metal for instance, and further reduce their costs: <em>Packets</em>, <em>Scalway</em>, etc.</p>

<p>A new and more modern wave of software-defined storage products like <em>Infinit</em>, <em>Hedvig</em>, <em>Portworx</em> and more) is however making its way to the market, in particular because well adapted to more dynamic environments such as large-scale containerized applications.</p>

<p>Given the diversity of workflows and setups, it is clear that this is not a winner-takes-all market, as the history has shown with numerous big players. However, the advent of container technologies and software-defined technologies are reshuffling the cards...</p>]]></content:encoded></item></channel></rss>