\section{Introducing Garage} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{frame}{Brought to you by the Deuxfleurs association} \begin{block}{\textbf{deuxfleurs.fr} -- a libre hosting association with a vision} ``Shifting the current structure of the Internet from a world of a few very large service providers, to a world where services are hosted by a variety of smaller organisations.'' \end{block} \begin{block}{Our goals} \begin{itemize} \item To propose performant \& reliable libre services for the masses \item To host and administer our infrastructure ourselves \item To allow members to contribute storage/compute nodes \item Resilience: for availability \& the sysadmins' sleep \item Conceptual simplicity to ease onboarding \& demistify hosting \end{itemize} \end{block} \end{frame} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{frame}{The lacking state of the practice} \begin{block}{Object storage fitted our needs} \begin{itemize} \item Distributed by design \item Objects are replicated \item Conceptually simple \end{itemize} \end{block} \vfill \begin{block}{Existing object stores did not} \begin{itemize} \item Too specific / complex \item Resource hungry \item Hidden constraints \end{itemize} \end{block} \vfill We developed Garage, an object store with minimal functionality. It works, and serves our static sites and media. \end{frame} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{frame}{Introducing Garage} \centering \url{garagehq.deuxfleurs.fr} \url{git.deuxfleurs.fr/Deuxfleurs/garage} \includegraphics[width=.4\columnwidth]{figures/garage_distributed.png} \vfill \raggedright \begin{itemize} \item Distributed data store \item Based on DynamoDB object store (P2P!) \item Modular data types/protocols with CRDTs: \begin{itemize} \item Done: objects (media, static sites, backups...) via S3 API \item To do: e-mails via IMAP protocol, and more \end{itemize} \end{itemize} \end{frame} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{frame}[t]{The \textbf{RING}} \centering \fullcite{decandia_dynamo:_2007} \vspace{3ex} \only<1>{\includegraphics[width=.5\columnwidth]{figures/c1.pdf}}% \only<2>{\includegraphics[width=.5\columnwidth]{figures/c2.pdf}}% \only<3>{\includegraphics[width=.5\columnwidth]{figures/c3.pdf}}% \only<4>{\includegraphics[width=.5\columnwidth]{figures/c4.pdf}}% \vspace{5ex} %\raggedright \only<1>{Each node is assigned a unique ID on the circular address space.}% \only<2-3>{When a new object is added to the store...}% \only<3>{\\ It is assigned a unique ID (its \emph{key}) on the address space.}% \only<4>{The $R$ nodes after the object are in charge of replicating it.}% \end{frame} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{frame}{Distributed metadata} \centering \includegraphics[width=.8\columnwidth]{figures/garage_tables.pdf} \vfill The objects, versions and blocks are all stored in the ring. \end{frame} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{frame}{Written in Rust} \begin{columns} \column{.65\columnwidth} Entirely written in Rust! \column{.35\columnwidth} \centering \includegraphics[width=.85\columnwidth]{figures/rustacean-flat-happy.png} \end{columns} \vfill \begin{columns} \column[t]{.6\columnwidth} \textbf{Pros:} \begin{itemize} \item Compiled and fast \item Features prevent usual mistakes: strongly typed, immutable by default, ownership instead of GC... \item Best of several paradigms: imperative, OO, functional \item Good libraries for network programmings: serialization, http, async/await... \end{itemize} \column[t]{.4\columnwidth} \textbf{Cons}: \begin{itemize} \item Steep learning curve \item Long compilation times \item Compiler rage \end{itemize} \end{columns} \end{frame}