From 5ffcdb4634260c66b0db60e1e9de18866b5be550 Mon Sep 17 00:00:00 2001 From: Lapineige Date: Sat, 19 Aug 2023 15:17:51 +0000 Subject: fix typo --- doc/book/connect/apps/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'doc') diff --git a/doc/book/connect/apps/index.md b/doc/book/connect/apps/index.md index 83aadec2..0ebb01b4 100644 --- a/doc/book/connect/apps/index.md +++ b/doc/book/connect/apps/index.md @@ -146,7 +146,7 @@ Keep the Key ID and the Secret key in a pad, they will be needed later. We need two buckets, one for normal videos (named peertube-video) and one for webtorrent videos (named peertube-playlist). ```bash -garage bucket create peertube-video +garage bucket create peertube-videos garage bucket create peertube-playlist ``` -- cgit v1.2.3 From 47e7f9e1229f3c5e25708cedd60eeb2e0e1a6cd2 Mon Sep 17 00:00:00 2001 From: Lapineige Date: Sat, 19 Aug 2023 20:29:24 +0000 Subject: another typo --- doc/book/connect/apps/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'doc') diff --git a/doc/book/connect/apps/index.md b/doc/book/connect/apps/index.md index 0ebb01b4..baf6ba50 100644 --- a/doc/book/connect/apps/index.md +++ b/doc/book/connect/apps/index.md @@ -216,7 +216,7 @@ object_storage: # Same settings but for webtorrent videos videos: - bucket_name: 'peertube-video' + bucket_name: 'peertube-videos' prefix: '' # You must fill this field to make Peertube use our reverse proxy/website logic base_url: 'http://peertube-videos.web.garage.localhost' -- cgit v1.2.3 From 5feb6a1f64aaede10f8172c37645da18a96b419c Mon Sep 17 00:00:00 2001 From: networkException Date: Tue, 3 Oct 2023 17:49:30 +0200 Subject: docs: add documentation for specifying token / secret file as environment variables --- doc/book/reference-manual/configuration.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'doc') diff --git a/doc/book/reference-manual/configuration.md b/doc/book/reference-manual/configuration.md index 3110aab7..2a8c5df5 100644 --- a/doc/book/reference-manual/configuration.md +++ b/doc/book/reference-manual/configuration.md @@ -276,7 +276,7 @@ Compression is done synchronously, setting a value too high will add latency to This value can be different between nodes, compression is done by the node which receive the API call. -### `rpc_secret`, `rpc_secret_file` or `GARAGE_RPC_SECRET` (env) +### `rpc_secret`, `rpc_secret_file` or `GARAGE_RPC_SECRET`, `GARAGE_RPC_SECRET_FILE` (env) Garage uses a secret key, called an RPC secret, that is shared between all nodes of the cluster in order to identify these nodes and allow them to @@ -288,6 +288,9 @@ Since Garage `v0.8.2`, the RPC secret can also be stored in a file whose path is given in the configuration variable `rpc_secret_file`, or specified as an environment variable `GARAGE_RPC_SECRET`. +Since Garage `v0.9.0`, you can also specify the path of a file storing the secret +as the `GARAGE_RPC_SECRET_FILE` environment variable. + ### `rpc_bind_addr` The address and port on which to bind for inter-cluster communcations @@ -465,7 +468,7 @@ See [administration API reference](@/documentation/reference-manual/admin-api.md Alternatively, since `v0.8.5`, a path can be used to create a unix socket. Note that for security reasons, the socket will have 0220 mode. Make sure to set user and group permissions accordingly. -### `metrics_token`, `metrics_token_file` or `GARAGE_METRICS_TOKEN` (env) +### `metrics_token`, `metrics_token_file` or `GARAGE_METRICS_TOKEN`, `GARAGE_METRICS_TOKEN_FILE` (env) The token for accessing the Metrics endpoint. If this token is not set, the Metrics endpoint can be accessed without access control. @@ -475,8 +478,9 @@ You can use any random string for this value. We recommend generating a random t `metrics_token` was introduced in Garage `v0.7.2`. `metrics_token_file` and the `GARAGE_METRICS_TOKEN` environment variable are supported since Garage `v0.8.2`. +`GARAGE_METRICS_TOKEN_FILE` is supported since `v0.9.0`. -### `admin_token`, `admin_token_file` or `GARAGE_ADMIN_TOKEN` (env) +### `admin_token`, `admin_token_file` or `GARAGE_ADMIN_TOKEN`, `GARAGE_ADMIN_TOKEN_FILE` (env) The token for accessing all of the other administration endpoints. If this token is not set, access to these endpoints is disabled entirely. @@ -486,6 +490,7 @@ You can use any random string for this value. We recommend generating a random t `admin_token` was introduced in Garage `v0.7.2`. `admin_token_file` and the `GARAGE_ADMIN_TOKEN` environment variable are supported since Garage `v0.8.2`. +`GARAGE_ADMIN_TOKEN_FILE` is supported since `v0.9.0`. ### `trace_sink` -- cgit v1.2.3 From f83fa021937978e79c917c08b3499ba866120284 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Baylac=20Jacqu=C3=A9?= Date: Wed, 25 Oct 2023 11:34:39 +0200 Subject: Add allow_world_readable_secrets option to config file Sometimes, the secret files permissions checks gets in the way. It's by no mean complete, it doesn't take the Posix ACLs into account among other things. Correctly checking the ACLs would be too involving (see https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/658#issuecomment-7102) and would likely still fail in some weird chmod settings. We're adding a new configuration file key allowing the user to disable this permission check altogether. The (already existing) env variable counterpart always take precedence to this config file option. That's useful in cases where the configuration file is static and cannot be easily altered. Fixes https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/658 Co-authored-by: Florian Klink --- doc/book/reference-manual/configuration.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'doc') diff --git a/doc/book/reference-manual/configuration.md b/doc/book/reference-manual/configuration.md index 2a8c5df5..a536dd02 100644 --- a/doc/book/reference-manual/configuration.md +++ b/doc/book/reference-manual/configuration.md @@ -323,6 +323,18 @@ be obtained by running `garage node id` and then included directly in the key will be returned by `garage node id` and you will have to add the IP yourself. +### `allow_world_readable_secrets` + +Garage checks the permissions of your secret files to make sure +they're not world-readable. In some cases, the check might fail and +consider your files as world-readable even if they're not. Such as +when using Posix ACLs. + +Setting `allow_world_readable_secrets` to `true` bypass this +permission verification. + +Alternatively, you can set the `GARAGE_ALLOW_WORLD_READABLE_SECRETS` +environment variable to `true` to bypass the permissions check. ## The `[consul_discovery]` section -- cgit v1.2.3 From 60f0bd03b68c43fb1181497b028c91edfb1efbb1 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Thu, 11 Jan 2024 11:40:44 +0100 Subject: doc: add talk for SEED webinar --- doc/talks/2024-01-12-seed/.gitignore | 17 + doc/talks/2024-01-12-seed/Makefile | 10 + doc/talks/2024-01-12-seed/abstract.md | 39 +++ doc/talks/2024-01-12-seed/assets/AGPLv3_Logo.png | Bin 0 -> 32497 bytes doc/talks/2024-01-12-seed/assets/alex.jpg | Bin 0 -> 4914 bytes doc/talks/2024-01-12-seed/assets/atuin.jpg | Bin 0 -> 269747 bytes doc/talks/2024-01-12-seed/assets/deuxfleurs.svg | 91 +++++ .../2024-01-12-seed/assets/garage2.drawio.png | Bin 0 -> 89618 bytes doc/talks/2024-01-12-seed/assets/logo_chatons.png | Bin 0 -> 203533 bytes doc/talks/2024-01-12-seed/assets/map.png | Bin 0 -> 148270 bytes doc/talks/2024-01-12-seed/assets/minio.png | Bin 0 -> 13497 bytes doc/talks/2024-01-12-seed/assets/neptune.jpg | Bin 0 -> 310601 bytes doc/talks/2024-01-12-seed/assets/rust_logo.png | Bin 0 -> 14835 bytes doc/talks/2024-01-12-seed/talk.pdf | Bin 0 -> 1187444 bytes doc/talks/2024-01-12-seed/talk.tex | 370 +++++++++++++++++++++ 15 files changed, 527 insertions(+) create mode 100644 doc/talks/2024-01-12-seed/.gitignore create mode 100644 doc/talks/2024-01-12-seed/Makefile create mode 100644 doc/talks/2024-01-12-seed/abstract.md create mode 100644 doc/talks/2024-01-12-seed/assets/AGPLv3_Logo.png create mode 100644 doc/talks/2024-01-12-seed/assets/alex.jpg create mode 100644 doc/talks/2024-01-12-seed/assets/atuin.jpg create mode 100644 doc/talks/2024-01-12-seed/assets/deuxfleurs.svg create mode 100644 doc/talks/2024-01-12-seed/assets/garage2.drawio.png create mode 100644 doc/talks/2024-01-12-seed/assets/logo_chatons.png create mode 100644 doc/talks/2024-01-12-seed/assets/map.png create mode 100644 doc/talks/2024-01-12-seed/assets/minio.png create mode 100644 doc/talks/2024-01-12-seed/assets/neptune.jpg create mode 100644 doc/talks/2024-01-12-seed/assets/rust_logo.png create mode 100644 doc/talks/2024-01-12-seed/talk.pdf create mode 100644 doc/talks/2024-01-12-seed/talk.tex (limited to 'doc') diff --git a/doc/talks/2024-01-12-seed/.gitignore b/doc/talks/2024-01-12-seed/.gitignore new file mode 100644 index 00000000..9f1f00e6 --- /dev/null +++ b/doc/talks/2024-01-12-seed/.gitignore @@ -0,0 +1,17 @@ +* + +!*.txt +!*.md + +!assets + +!.gitignore +!*.svg +!*.png +!*.jpg +!*.tex +!Makefile +!.gitignore +!assets/*.drawio.pdf + +!talk.pdf diff --git a/doc/talks/2024-01-12-seed/Makefile b/doc/talks/2024-01-12-seed/Makefile new file mode 100644 index 00000000..033a8af9 --- /dev/null +++ b/doc/talks/2024-01-12-seed/Makefile @@ -0,0 +1,10 @@ +ASSETS=assets/deuxfleurs.pdf + +talk.pdf: talk.tex $(ASSETS) + pdflatex talk.tex + +assets/%.pdf: assets/%.svg + inkscape -D -z --file=$^ --export-pdf=$@ + +assets/%.pdf_tex: assets/%.svg + inkscape -D -z --file=$^ --export-pdf=$@ --export-latex diff --git a/doc/talks/2024-01-12-seed/abstract.md b/doc/talks/2024-01-12-seed/abstract.md new file mode 100644 index 00000000..b2658868 --- /dev/null +++ b/doc/talks/2024-01-12-seed/abstract.md @@ -0,0 +1,39 @@ +### (fr) Garage, un système de stockage de données géo-distribué léger et robuste + +Garage est un système de stockage de données léger, géo-distribué, qui +implémente le protocole de stockage S3 de Amazon. Garage est destiné +principalement à l'auto-hébergement sur du matériel courant d'occasion. À ce +titre, il doit tolérer un grand nombre de pannes: coupures de courant, coupures +de connexion Internet, pannes de machines, ... Il doit également être facile à +déployer et à maintenir, afin de pouvoir être facilement utilisé par des +amateurs ou des petites organisations. + +Cette présentation vous proposera un aperçu de Garage et du choix technique +principal qui rend un système comme Garage possible: le refus d'utiliser des +algorithmes de consensus, remplacés avantageusement par des méthodes à +cohérence faible. Notre modèle est fortement inspiré de la base de donnée +Dynamo (DeCandia et al, 2007), et fait usage des types de données CRDT (Shapiro +et al, 2011). Nous exploreront comment ces méthodes s'appliquent à la +construction de l'abstraction "stockage objet" dans un système distribué, et +quelles autres abstractions peuvent ou ne peuvent pas être construites dans ce +modèle. + +### (en) Garage, a lightweight and robust geo-distributed data storage system + +Garage is a lightweight geo-distributed data store that implements the Amazon +S3 object storage protocol. Garage is meant primarily for self-hosting at home +on second-hand commodity hardware, meaning it has to tolerate a wide variety of +failure scenarios such as power cuts, Internet disconnections and machine +crashes. It also has to be easy to deploy and maintain, so that hobbyists and +small organizations can use it without trouble. + +This talk will present Garage and the key technical choice that made Garage +possible: refusing to use consensus algorithms and using instead weak +consistency methods, with a model that is loosely based on that of the Dynamo +database (DeCandia et al, 2007) and that makes heavy use of conflict-free +replicated data types (Shapiro et al, 2011). We will explore how these methods +are suited to building the "object store" abstraction in a distributed system, +and what other abstractions are possible or impossible to build in this model. + + + diff --git a/doc/talks/2024-01-12-seed/assets/AGPLv3_Logo.png b/doc/talks/2024-01-12-seed/assets/AGPLv3_Logo.png new file mode 100644 index 00000000..445284a3 Binary files /dev/null and b/doc/talks/2024-01-12-seed/assets/AGPLv3_Logo.png differ diff --git a/doc/talks/2024-01-12-seed/assets/alex.jpg b/doc/talks/2024-01-12-seed/assets/alex.jpg new file mode 100644 index 00000000..eac0f0a9 Binary files /dev/null and b/doc/talks/2024-01-12-seed/assets/alex.jpg differ diff --git a/doc/talks/2024-01-12-seed/assets/atuin.jpg b/doc/talks/2024-01-12-seed/assets/atuin.jpg new file mode 100644 index 00000000..f2fbd61d Binary files /dev/null and b/doc/talks/2024-01-12-seed/assets/atuin.jpg differ diff --git a/doc/talks/2024-01-12-seed/assets/deuxfleurs.svg b/doc/talks/2024-01-12-seed/assets/deuxfleurs.svg new file mode 100644 index 00000000..c298c22b --- /dev/null +++ b/doc/talks/2024-01-12-seed/assets/deuxfleurs.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + D + F + diff --git a/doc/talks/2024-01-12-seed/assets/garage2.drawio.png b/doc/talks/2024-01-12-seed/assets/garage2.drawio.png new file mode 100644 index 00000000..8562fbcf Binary files /dev/null and b/doc/talks/2024-01-12-seed/assets/garage2.drawio.png differ diff --git a/doc/talks/2024-01-12-seed/assets/logo_chatons.png b/doc/talks/2024-01-12-seed/assets/logo_chatons.png new file mode 100644 index 00000000..890cf17e Binary files /dev/null and b/doc/talks/2024-01-12-seed/assets/logo_chatons.png differ diff --git a/doc/talks/2024-01-12-seed/assets/map.png b/doc/talks/2024-01-12-seed/assets/map.png new file mode 100644 index 00000000..1dff3ab6 Binary files /dev/null and b/doc/talks/2024-01-12-seed/assets/map.png differ diff --git a/doc/talks/2024-01-12-seed/assets/minio.png b/doc/talks/2024-01-12-seed/assets/minio.png new file mode 100644 index 00000000..a71e9ccc Binary files /dev/null and b/doc/talks/2024-01-12-seed/assets/minio.png differ diff --git a/doc/talks/2024-01-12-seed/assets/neptune.jpg b/doc/talks/2024-01-12-seed/assets/neptune.jpg new file mode 100644 index 00000000..61fcbff6 Binary files /dev/null and b/doc/talks/2024-01-12-seed/assets/neptune.jpg differ diff --git a/doc/talks/2024-01-12-seed/assets/rust_logo.png b/doc/talks/2024-01-12-seed/assets/rust_logo.png new file mode 100644 index 00000000..0e4809ec Binary files /dev/null and b/doc/talks/2024-01-12-seed/assets/rust_logo.png differ diff --git a/doc/talks/2024-01-12-seed/talk.pdf b/doc/talks/2024-01-12-seed/talk.pdf new file mode 100644 index 00000000..b48497a7 Binary files /dev/null and b/doc/talks/2024-01-12-seed/talk.pdf differ diff --git a/doc/talks/2024-01-12-seed/talk.tex b/doc/talks/2024-01-12-seed/talk.tex new file mode 100644 index 00000000..e7b4e2c2 --- /dev/null +++ b/doc/talks/2024-01-12-seed/talk.tex @@ -0,0 +1,370 @@ +\nonstopmode +\documentclass[aspectratio=169]{beamer} +\usepackage[utf8]{inputenc} +% \usepackage[frenchb]{babel} +\usepackage{amsmath} +\usepackage{mathtools} +\usepackage{breqn} +\usepackage{multirow} +\usetheme{boxes} +\usepackage{graphicx} +\usepackage{import} +\usepackage{adjustbox} +%\useoutertheme[footline=authortitle,subsection=false]{miniframes} +%\useoutertheme[footline=authorinstitute,subsection=false]{miniframes} +\useoutertheme{infolines} +\setbeamertemplate{headline}{} + +\beamertemplatenavigationsymbolsempty + +\definecolor{TitleOrange}{RGB}{255,137,0} +\setbeamercolor{title}{fg=TitleOrange} +\setbeamercolor{frametitle}{fg=TitleOrange} + +\definecolor{ListOrange}{RGB}{255,145,5} +\setbeamertemplate{itemize item}{\color{ListOrange}$\blacktriangleright$} + +\definecolor{verygrey}{RGB}{70,70,70} +\setbeamercolor{normal text}{fg=verygrey} + + +\usepackage{tabu} +\usepackage{multicol} +\usepackage{vwcol} +\usepackage{stmaryrd} +\usepackage{graphicx} + +\usepackage[normalem]{ulem} + +\AtBeginSection[]{ + \begin{frame} + \vfill + \centering + \begin{beamercolorbox}[sep=8pt,center,shadow=true,rounded=true]{title} + \usebeamerfont{title}\insertsectionhead\par% + \end{beamercolorbox} + \vfill + \end{frame} +} + +\title{Garage} +\subtitle{a lightweight and robust geo-distributed data storage system} +\author{Alex Auvolat, Deuxfleurs} +\date{SEED webinar, 2024-01-12} + +\begin{document} + +% \begin{frame} +% \centering +% \includegraphics[width=.3\linewidth]{../../sticker/Garage.png} +% \vspace{1em} +% +% {\large\bf Alex Auvolat, Deuxfleurs Association} +% \vspace{1em} +% +% \url{https://garagehq.deuxfleurs.fr/} +% +% %Matrix channel: \texttt{\#garage:deuxfleurs.fr} +% \end{frame} + +\begin{frame} + %\frametitle{Who I am} + \begin{columns}[t] + \begin{column}{.2\textwidth} + \centering + \adjincludegraphics[width=.4\linewidth, valign=t]{assets/alex.jpg} + \end{column} + \begin{column}{.6\textwidth} + \textbf{Alex Auvolat}\\ + Member of Deuxfleurs, lead developer of Garage + \end{column} + \begin{column}{.2\textwidth} + ~ + \end{column} + \end{columns} + \vspace{.5em} + + \begin{columns}[t] + \begin{column}{.2\textwidth} + \centering + \adjincludegraphics[width=.6\linewidth, valign=t]{../../logo/garage-notext.png} + \end{column} + \begin{column}{.6\textwidth} + \\\textbf{Garage}\\ + A self-hosted alternative to S3 for object storage + \end{column} + \begin{column}{.2\textwidth} + ~ + \end{column} + \end{columns} + \vspace{2em} + + \begin{columns}[t] + \begin{column}{.2\textwidth} + \centering + \adjincludegraphics[width=.5\linewidth, valign=t]{assets/deuxfleurs.pdf} + \end{column} + \begin{column}{.6\textwidth} + \textbf{Deuxfleurs}\\ + A non-profit self-hosting collective,\\ + member of the CHATONS network + \end{column} + \begin{column}{.2\textwidth} + \centering + \adjincludegraphics[width=.7\linewidth, valign=t]{assets/logo_chatons.png} + \end{column} + \end{columns} + +\end{frame} + +\begin{frame} + \frametitle{Stable vs Resilient} + + \hspace{1em} + \begin{minipage}{7cm} + \textbf{Building a "stable" system:} + \vspace{1em} + + Enterprise-grade systems typically employ: + \vspace{1em} + \begin{itemize} + \item RAID + \item Redundant power grid + UPS + \item Redundant Internet connections + \item Low-latency links + \item ... + \end{itemize} + \vspace{1em} + $\to$ costly, only worth at DC scale\\ + $\to$ still risk of DC-level incident... + \end{minipage} + \hfill + \begin{minipage}{7cm} + \textbf{Building a \underline{resilient} system:} + \vspace{1em} + + An alternative, cheaper way: + \vspace{1em} + \begin{itemize} + \item Commodity hardware \\(e.g. old desktop PCs) + \vspace{.5em} + \item Commodity Internet \\(e.g. FTTB, FTTH) and power grid + \vspace{.5em} + \item \textbf{Geographical redundancy} \\(multi-site replication) + \end{itemize} + \vspace{1.5em} + \end{minipage} + \hspace{1em} +\end{frame} + +\begin{frame} + \frametitle{Example: our infrastructure at Deuxfleurs} + \only<1>{ + \begin{center} + \includegraphics[width=.8\linewidth]{assets/neptune.jpg} + \end{center} + } + \only<2>{ + \begin{center} + \includegraphics[width=.8\linewidth]{assets/atuin.jpg} + \end{center} + } + \only<3>{ + \begin{center} + \includegraphics[width=.8\linewidth]{assets/inframap_jdll2023.pdf} + \end{center} + } +\end{frame} + +\begin{frame} + \frametitle{Object storage: simpler than file systems} + + \begin{minipage}{6cm} + Only two operations: + \vspace{1em} + \begin{itemize} + \item Put an object at a key + \vspace{1em} + \item Retrieve an object from its key + \end{itemize} + \vspace{1em} + {\footnotesize (and a few others)} + + \vspace{1em} + Sufficient for many applications! + \end{minipage} + \hfill + \begin{minipage}{8cm} + \begin{center} + \vspace{2em} + \includegraphics[height=6em]{../2020-12-02_wide-team/img/Amazon-S3.jpg} + \hspace{2em} + \includegraphics[height=5em]{assets/minio.png} + + \vspace{2em} + \includegraphics[height=6em]{../../logo/garage_hires_crop.png} + \end{center} + \vspace{1em} + \end{minipage} +\end{frame} + + +\begin{frame} + \frametitle{The data model of object storage} + Object storage is basically a key-value store: + \vspace{1em} + + \begin{center} + \begin{tabular}{|l|p{8cm}|} + \hline + \textbf{Key: file path + name} & \textbf{Value: file data + metadata} \\ + \hline + \hline + \texttt{index.html} & + \texttt{Content-Type: text/html; charset=utf-8} \newline + \texttt{Content-Length: 24929} \newline + \texttt{} \\ + \hline + \texttt{img/logo.svg} & + \texttt{Content-Type: text/svg+xml} \newline + \texttt{Content-Length: 13429} \newline + \texttt{} \\ + \hline + \texttt{download/index.html} & + \texttt{Content-Type: text/html; charset=utf-8} \newline + \texttt{Content-Length: 26563} \newline + \texttt{} \\ + \hline + \end{tabular} + \end{center} +\end{frame} + +\begin{frame} + \frametitle{Implementation: consensus vs weak consistency} + + \hspace{1em} + \begin{minipage}{7cm} + \textbf{Consensus-based systems:} + \vspace{1em} + \begin{itemize} + \item \textbf{Leader-based:} a leader is elected to coordinate + all reads and writes + \vspace{1em} + \item Allows for \textbf{sequential reasoning}: + program as if running on a single machine + \vspace{1em} + \item Serializability is one of the \\ + \textbf{strongest consistency guarantees} + \vspace{1em} + \item \textbf{Costly}, the leader is a bottleneck; + leader elections on failure take time + \end{itemize} + \end{minipage} + \hfill + \begin{minipage}{7cm} \visible<2->{ + \textbf{Weakly consistent systems:} + \vspace{1em} + \begin{itemize} + \item \textbf{Nodes are equivalent}, any node + can originate a read or write operation + \vspace{1em} + \item \textbf{Operations must be independent}, + conflicts are resolved after the fact + \vspace{1em} + \item Strongest achievable consistency:\\ + \textbf{read-after-write consistency}\\(using quorums) + \vspace{1em} + \item \textbf{Fast}, no single bottleneck;\\ + works transparently with offline nodes + \end{itemize} + } \end{minipage} + \hspace{1em} +\end{frame} + +\begin{frame} + \frametitle{Why avoid consensus?} + Consensus can be implemented reasonably well in practice, so why avoid it? + \vspace{2em} + \begin{itemize} + \item \textbf{Software complexity:} RAFT and PAXOS are complex beasts;\\ + harder to prove, harder to reason about + \vspace{1.5em} + \item \textbf{Performance issues:} + \vspace{1em} + \begin{itemize} + \item Taking a decision may take an \textbf{arbitrary number of steps} (in adverse scenarios) + \vspace{1em} + \item The leader is a \textbf{bottleneck} for all requests;\\ + even in leaderless approaches, \textbf{all nodes must process all operations in order} + \vspace{1em} + \item Particularly \textbf{sensitive to higher latency} between nodes + \end{itemize} + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Objective: the right level of consistency for Garage} + + \underline{Constraints:} slow network (geographical distance), node unavailability/crashes\\ + \underline{Objective:} maximize availability, maintain an \emph{appropriate level of consistency}\\ + \vspace{1em} + \begin{enumerate} + \item<2-> \textbf{Weak consistency for most things}\\ + \vspace{1em} + \underline{Example:} \texttt{PutObject}\\ + \vspace{.5em} + If two clients write the same + object at the same time, one of the two is implicitly overwritten. + No need to coordinate, use a \emph{last-writer-wins register}. + \vspace{1em} + \item<3-> \textbf{Stronger consistency only when necessary}\\ + \vspace{1em} + \underline{Example:} \texttt{CreateBucket}\\ + \vspace{.5em} + A bucket is a reserved name in a shared namespace, + two clients should be prevented from both creating the same bucket + (\emph{mutual exclusion}). + \end{enumerate} +\end{frame} + +\begin{frame} + \frametitle{The possibility of \emph{leaderless consensus}} + Currently, Garage \emph{only has weak consistency}. Is fast, but \texttt{CreateBucket} is broken! + + \visible<2->{ + \vspace{1em} + Leaderless consensus (Antoniadis et al., 2023) alleviates issues with RAFT and PAXOS: + \vspace{1em} + \begin{itemize} + \item \textbf{No leader.} All nodes participate equally at each time step, + and different nodes can be unavailable at different times without issues. + \\ \vspace{.5em} $\to$ better tolerance to the high latency (remove bottleneck issue) + \\ $\to$ tolerates crash transparently + \vspace{1em} + \item \textbf{Simpler formalization.} The algorithm is very simple to express and to analyze in mathematical terms. + \end{itemize} + } + \visible<3->{ + \vspace{1em} + One of the possible subjects for this PhD: + \\$\to$ \emph{integration of leaderless consensus in Garage} + testing + perf eval, etc. + } +\end{frame} + +\begin{frame} + \begin{center} + \includegraphics[width=.25\linewidth]{../../logo/garage_hires.png}\\ + \vspace{-1em} + \url{https://garagehq.deuxfleurs.fr/}\\ + \url{mailto:garagehq@deuxfleurs.fr}\\ + \texttt{\#garage:deuxfleurs.fr} on Matrix + + \vspace{1.5em} + \includegraphics[width=.06\linewidth]{assets/rust_logo.png} + \includegraphics[width=.13\linewidth]{assets/AGPLv3_Logo.png} + \end{center} +\end{frame} + +\end{document} + +%% vim: set ts=4 sw=4 tw=0 noet spelllang=en : -- cgit v1.2.3 From 7228695ee288012103355589caa1ab5dd666b164 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Mon, 15 Jan 2024 17:18:46 +0100 Subject: config: refactor secret sourcing --- doc/book/reference-manual/configuration.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'doc') diff --git a/doc/book/reference-manual/configuration.md b/doc/book/reference-manual/configuration.md index a536dd02..77720f7b 100644 --- a/doc/book/reference-manual/configuration.md +++ b/doc/book/reference-manual/configuration.md @@ -325,10 +325,9 @@ yourself. ### `allow_world_readable_secrets` -Garage checks the permissions of your secret files to make sure -they're not world-readable. In some cases, the check might fail and -consider your files as world-readable even if they're not. Such as -when using Posix ACLs. +Garage checks the permissions of your secret files to make sure they're not +world-readable. In some cases, the check might fail and consider your files as +world-readable even if they're not, for instance when using Posix ACLs. Setting `allow_world_readable_secrets` to `true` bypass this permission verification. -- cgit v1.2.3 From ee57dd922b9c396298473b41e4046c8d00ee77d5 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Tue, 16 Jan 2024 16:28:17 +0100 Subject: Bump version to 0.9.1 --- doc/book/cookbook/real-world.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'doc') diff --git a/doc/book/cookbook/real-world.md b/doc/book/cookbook/real-world.md index ea4ce1f9..ce0abddd 100644 --- a/doc/book/cookbook/real-world.md +++ b/doc/book/cookbook/real-world.md @@ -85,14 +85,14 @@ to store 2 TB of data in total. ## Get a Docker image Our docker image is currently named `dxflrs/garage` and is stored on the [Docker Hub](https://hub.docker.com/r/dxflrs/garage/tags?page=1&ordering=last_updated). -We encourage you to use a fixed tag (eg. `v0.9.0`) and not the `latest` tag. -For this example, we will use the latest published version at the time of the writing which is `v0.9.0` but it's up to you +We encourage you to use a fixed tag (eg. `v0.9.1`) and not the `latest` tag. +For this example, we will use the latest published version at the time of the writing which is `v0.9.1` but it's up to you to check [the most recent versions on the Docker Hub](https://hub.docker.com/r/dxflrs/garage/tags?page=1&ordering=last_updated). For example: ``` -sudo docker pull dxflrs/garage:v0.9.0 +sudo docker pull dxflrs/garage:v0.9.1 ``` ## Deploying and configuring Garage @@ -157,7 +157,7 @@ docker run \ -v /etc/garage.toml:/etc/garage.toml \ -v /var/lib/garage/meta:/var/lib/garage/meta \ -v /var/lib/garage/data:/var/lib/garage/data \ - dxflrs/garage:v0.9.0 + dxflrs/garage:v0.9.1 ``` With this command line, Garage should be started automatically at each boot. @@ -171,7 +171,7 @@ If you want to use `docker-compose`, you may use the following `docker-compose.y version: "3" services: garage: - image: dxflrs/garage:v0.9.0 + image: dxflrs/garage:v0.9.1 network_mode: "host" restart: unless-stopped volumes: -- cgit v1.2.3 From cf0abbfe42d06a1a740870f4d09bd1b749d51323 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Mon, 22 Jan 2024 14:33:48 +0100 Subject: rm abstract --- doc/talks/2024-01-12-seed/abstract.md | 39 ----------------------------------- 1 file changed, 39 deletions(-) delete mode 100644 doc/talks/2024-01-12-seed/abstract.md (limited to 'doc') diff --git a/doc/talks/2024-01-12-seed/abstract.md b/doc/talks/2024-01-12-seed/abstract.md deleted file mode 100644 index b2658868..00000000 --- a/doc/talks/2024-01-12-seed/abstract.md +++ /dev/null @@ -1,39 +0,0 @@ -### (fr) Garage, un système de stockage de données géo-distribué léger et robuste - -Garage est un système de stockage de données léger, géo-distribué, qui -implémente le protocole de stockage S3 de Amazon. Garage est destiné -principalement à l'auto-hébergement sur du matériel courant d'occasion. À ce -titre, il doit tolérer un grand nombre de pannes: coupures de courant, coupures -de connexion Internet, pannes de machines, ... Il doit également être facile à -déployer et à maintenir, afin de pouvoir être facilement utilisé par des -amateurs ou des petites organisations. - -Cette présentation vous proposera un aperçu de Garage et du choix technique -principal qui rend un système comme Garage possible: le refus d'utiliser des -algorithmes de consensus, remplacés avantageusement par des méthodes à -cohérence faible. Notre modèle est fortement inspiré de la base de donnée -Dynamo (DeCandia et al, 2007), et fait usage des types de données CRDT (Shapiro -et al, 2011). Nous exploreront comment ces méthodes s'appliquent à la -construction de l'abstraction "stockage objet" dans un système distribué, et -quelles autres abstractions peuvent ou ne peuvent pas être construites dans ce -modèle. - -### (en) Garage, a lightweight and robust geo-distributed data storage system - -Garage is a lightweight geo-distributed data store that implements the Amazon -S3 object storage protocol. Garage is meant primarily for self-hosting at home -on second-hand commodity hardware, meaning it has to tolerate a wide variety of -failure scenarios such as power cuts, Internet disconnections and machine -crashes. It also has to be easy to deploy and maintain, so that hobbyists and -small organizations can use it without trouble. - -This talk will present Garage and the key technical choice that made Garage -possible: refusing to use consensus algorithms and using instead weak -consistency methods, with a model that is loosely based on that of the Dynamo -database (DeCandia et al, 2007) and that makes heavy use of conflict-free -replicated data types (Shapiro et al, 2011). We will explore how these methods -are suited to building the "object store" abstraction in a distributed system, -and what other abstractions are possible or impossible to build in this model. - - - -- cgit v1.2.3 From d2c40b12e8df2b192bc9af876119fff1d95f8a46 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Mon, 22 Jan 2024 14:43:46 +0100 Subject: doc/talks: refactor assets --- doc/talks/2024-01-12-seed/.gitignore | 11 +-- doc/talks/2024-01-12-seed/Makefile | 2 +- doc/talks/2024-01-12-seed/assets/AGPLv3_Logo.png | Bin 32497 -> 0 bytes doc/talks/2024-01-12-seed/assets/alex.jpg | Bin 4914 -> 0 bytes doc/talks/2024-01-12-seed/assets/atuin.jpg | Bin 269747 -> 0 bytes doc/talks/2024-01-12-seed/assets/deuxfleurs.svg | 91 --------------------- .../2024-01-12-seed/assets/garage2.drawio.png | Bin 89618 -> 0 bytes doc/talks/2024-01-12-seed/assets/logo_chatons.png | Bin 203533 -> 0 bytes doc/talks/2024-01-12-seed/assets/map.png | Bin 148270 -> 0 bytes doc/talks/2024-01-12-seed/assets/minio.png | Bin 13497 -> 0 bytes doc/talks/2024-01-12-seed/assets/neptune.jpg | Bin 310601 -> 0 bytes doc/talks/2024-01-12-seed/assets/rust_logo.png | Bin 14835 -> 0 bytes doc/talks/2024-01-12-seed/talk.pdf | Bin 1187444 -> 1187401 bytes doc/talks/2024-01-12-seed/talk.tex | 18 ++-- doc/talks/assets/.gitignore | 2 + doc/talks/assets/AGPLv3_Logo.png | Bin 0 -> 32497 bytes doc/talks/assets/alex.jpg | Bin 0 -> 4914 bytes doc/talks/assets/atuin.jpg | Bin 0 -> 269747 bytes doc/talks/assets/deuxfleurs.svg | 91 +++++++++++++++++++++ doc/talks/assets/garage2.drawio.png | Bin 0 -> 89618 bytes doc/talks/assets/inframap_jdll2023.pdf | Bin 0 -> 137258 bytes doc/talks/assets/logo_chatons.png | Bin 0 -> 203533 bytes doc/talks/assets/map.png | Bin 0 -> 148270 bytes doc/talks/assets/minio.png | Bin 0 -> 13497 bytes doc/talks/assets/neptune.jpg | Bin 0 -> 310601 bytes doc/talks/assets/rust_logo.png | Bin 0 -> 14835 bytes 26 files changed, 105 insertions(+), 110 deletions(-) delete mode 100644 doc/talks/2024-01-12-seed/assets/AGPLv3_Logo.png delete mode 100644 doc/talks/2024-01-12-seed/assets/alex.jpg delete mode 100644 doc/talks/2024-01-12-seed/assets/atuin.jpg delete mode 100644 doc/talks/2024-01-12-seed/assets/deuxfleurs.svg delete mode 100644 doc/talks/2024-01-12-seed/assets/garage2.drawio.png delete mode 100644 doc/talks/2024-01-12-seed/assets/logo_chatons.png delete mode 100644 doc/talks/2024-01-12-seed/assets/map.png delete mode 100644 doc/talks/2024-01-12-seed/assets/minio.png delete mode 100644 doc/talks/2024-01-12-seed/assets/neptune.jpg delete mode 100644 doc/talks/2024-01-12-seed/assets/rust_logo.png create mode 100644 doc/talks/assets/.gitignore create mode 100644 doc/talks/assets/AGPLv3_Logo.png create mode 100644 doc/talks/assets/alex.jpg create mode 100644 doc/talks/assets/atuin.jpg create mode 100644 doc/talks/assets/deuxfleurs.svg create mode 100644 doc/talks/assets/garage2.drawio.png create mode 100644 doc/talks/assets/inframap_jdll2023.pdf create mode 100644 doc/talks/assets/logo_chatons.png create mode 100644 doc/talks/assets/map.png create mode 100644 doc/talks/assets/minio.png create mode 100644 doc/talks/assets/neptune.jpg create mode 100644 doc/talks/assets/rust_logo.png (limited to 'doc') diff --git a/doc/talks/2024-01-12-seed/.gitignore b/doc/talks/2024-01-12-seed/.gitignore index 9f1f00e6..b7e0ced2 100644 --- a/doc/talks/2024-01-12-seed/.gitignore +++ b/doc/talks/2024-01-12-seed/.gitignore @@ -2,16 +2,9 @@ !*.txt !*.md - -!assets - -!.gitignore -!*.svg -!*.png -!*.jpg !*.tex + +!talk.pdf !Makefile !.gitignore -!assets/*.drawio.pdf -!talk.pdf diff --git a/doc/talks/2024-01-12-seed/Makefile b/doc/talks/2024-01-12-seed/Makefile index 033a8af9..5f0befbe 100644 --- a/doc/talks/2024-01-12-seed/Makefile +++ b/doc/talks/2024-01-12-seed/Makefile @@ -1,4 +1,4 @@ -ASSETS=assets/deuxfleurs.pdf +ASSETS=../assets/deuxfleurs.pdf talk.pdf: talk.tex $(ASSETS) pdflatex talk.tex diff --git a/doc/talks/2024-01-12-seed/assets/AGPLv3_Logo.png b/doc/talks/2024-01-12-seed/assets/AGPLv3_Logo.png deleted file mode 100644 index 445284a3..00000000 Binary files a/doc/talks/2024-01-12-seed/assets/AGPLv3_Logo.png and /dev/null differ diff --git a/doc/talks/2024-01-12-seed/assets/alex.jpg b/doc/talks/2024-01-12-seed/assets/alex.jpg deleted file mode 100644 index eac0f0a9..00000000 Binary files a/doc/talks/2024-01-12-seed/assets/alex.jpg and /dev/null differ diff --git a/doc/talks/2024-01-12-seed/assets/atuin.jpg b/doc/talks/2024-01-12-seed/assets/atuin.jpg deleted file mode 100644 index f2fbd61d..00000000 Binary files a/doc/talks/2024-01-12-seed/assets/atuin.jpg and /dev/null differ diff --git a/doc/talks/2024-01-12-seed/assets/deuxfleurs.svg b/doc/talks/2024-01-12-seed/assets/deuxfleurs.svg deleted file mode 100644 index c298c22b..00000000 --- a/doc/talks/2024-01-12-seed/assets/deuxfleurs.svg +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - D - F - diff --git a/doc/talks/2024-01-12-seed/assets/garage2.drawio.png b/doc/talks/2024-01-12-seed/assets/garage2.drawio.png deleted file mode 100644 index 8562fbcf..00000000 Binary files a/doc/talks/2024-01-12-seed/assets/garage2.drawio.png and /dev/null differ diff --git a/doc/talks/2024-01-12-seed/assets/logo_chatons.png b/doc/talks/2024-01-12-seed/assets/logo_chatons.png deleted file mode 100644 index 890cf17e..00000000 Binary files a/doc/talks/2024-01-12-seed/assets/logo_chatons.png and /dev/null differ diff --git a/doc/talks/2024-01-12-seed/assets/map.png b/doc/talks/2024-01-12-seed/assets/map.png deleted file mode 100644 index 1dff3ab6..00000000 Binary files a/doc/talks/2024-01-12-seed/assets/map.png and /dev/null differ diff --git a/doc/talks/2024-01-12-seed/assets/minio.png b/doc/talks/2024-01-12-seed/assets/minio.png deleted file mode 100644 index a71e9ccc..00000000 Binary files a/doc/talks/2024-01-12-seed/assets/minio.png and /dev/null differ diff --git a/doc/talks/2024-01-12-seed/assets/neptune.jpg b/doc/talks/2024-01-12-seed/assets/neptune.jpg deleted file mode 100644 index 61fcbff6..00000000 Binary files a/doc/talks/2024-01-12-seed/assets/neptune.jpg and /dev/null differ diff --git a/doc/talks/2024-01-12-seed/assets/rust_logo.png b/doc/talks/2024-01-12-seed/assets/rust_logo.png deleted file mode 100644 index 0e4809ec..00000000 Binary files a/doc/talks/2024-01-12-seed/assets/rust_logo.png and /dev/null differ diff --git a/doc/talks/2024-01-12-seed/talk.pdf b/doc/talks/2024-01-12-seed/talk.pdf index b48497a7..85c3bcde 100644 Binary files a/doc/talks/2024-01-12-seed/talk.pdf and b/doc/talks/2024-01-12-seed/talk.pdf differ diff --git a/doc/talks/2024-01-12-seed/talk.tex b/doc/talks/2024-01-12-seed/talk.tex index e7b4e2c2..cd6c4681 100644 --- a/doc/talks/2024-01-12-seed/talk.tex +++ b/doc/talks/2024-01-12-seed/talk.tex @@ -72,7 +72,7 @@ \begin{columns}[t] \begin{column}{.2\textwidth} \centering - \adjincludegraphics[width=.4\linewidth, valign=t]{assets/alex.jpg} + \adjincludegraphics[width=.4\linewidth, valign=t]{../assets/alex.jpg} \end{column} \begin{column}{.6\textwidth} \textbf{Alex Auvolat}\\ @@ -102,7 +102,7 @@ \begin{columns}[t] \begin{column}{.2\textwidth} \centering - \adjincludegraphics[width=.5\linewidth, valign=t]{assets/deuxfleurs.pdf} + \adjincludegraphics[width=.5\linewidth, valign=t]{../assets/deuxfleurs.pdf} \end{column} \begin{column}{.6\textwidth} \textbf{Deuxfleurs}\\ @@ -111,7 +111,7 @@ \end{column} \begin{column}{.2\textwidth} \centering - \adjincludegraphics[width=.7\linewidth, valign=t]{assets/logo_chatons.png} + \adjincludegraphics[width=.7\linewidth, valign=t]{../assets/logo_chatons.png} \end{column} \end{columns} @@ -161,17 +161,17 @@ \frametitle{Example: our infrastructure at Deuxfleurs} \only<1>{ \begin{center} - \includegraphics[width=.8\linewidth]{assets/neptune.jpg} + \includegraphics[width=.8\linewidth]{../assets/neptune.jpg} \end{center} } \only<2>{ \begin{center} - \includegraphics[width=.8\linewidth]{assets/atuin.jpg} + \includegraphics[width=.8\linewidth]{../assets/atuin.jpg} \end{center} } \only<3>{ \begin{center} - \includegraphics[width=.8\linewidth]{assets/inframap_jdll2023.pdf} + \includegraphics[width=.8\linewidth]{../assets/inframap_jdll2023.pdf} \end{center} } \end{frame} @@ -199,7 +199,7 @@ \vspace{2em} \includegraphics[height=6em]{../2020-12-02_wide-team/img/Amazon-S3.jpg} \hspace{2em} - \includegraphics[height=5em]{assets/minio.png} + \includegraphics[height=5em]{../assets/minio.png} \vspace{2em} \includegraphics[height=6em]{../../logo/garage_hires_crop.png} @@ -360,8 +360,8 @@ \texttt{\#garage:deuxfleurs.fr} on Matrix \vspace{1.5em} - \includegraphics[width=.06\linewidth]{assets/rust_logo.png} - \includegraphics[width=.13\linewidth]{assets/AGPLv3_Logo.png} + \includegraphics[width=.06\linewidth]{../assets/rust_logo.png} + \includegraphics[width=.13\linewidth]{../assets/AGPLv3_Logo.png} \end{center} \end{frame} diff --git a/doc/talks/assets/.gitignore b/doc/talks/assets/.gitignore new file mode 100644 index 00000000..e483c28f --- /dev/null +++ b/doc/talks/assets/.gitignore @@ -0,0 +1,2 @@ +# Files that are auto-generated when building pdfs +deuxfleurs.pdf diff --git a/doc/talks/assets/AGPLv3_Logo.png b/doc/talks/assets/AGPLv3_Logo.png new file mode 100644 index 00000000..445284a3 Binary files /dev/null and b/doc/talks/assets/AGPLv3_Logo.png differ diff --git a/doc/talks/assets/alex.jpg b/doc/talks/assets/alex.jpg new file mode 100644 index 00000000..eac0f0a9 Binary files /dev/null and b/doc/talks/assets/alex.jpg differ diff --git a/doc/talks/assets/atuin.jpg b/doc/talks/assets/atuin.jpg new file mode 100644 index 00000000..f2fbd61d Binary files /dev/null and b/doc/talks/assets/atuin.jpg differ diff --git a/doc/talks/assets/deuxfleurs.svg b/doc/talks/assets/deuxfleurs.svg new file mode 100644 index 00000000..c298c22b --- /dev/null +++ b/doc/talks/assets/deuxfleurs.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + D + F + diff --git a/doc/talks/assets/garage2.drawio.png b/doc/talks/assets/garage2.drawio.png new file mode 100644 index 00000000..8562fbcf Binary files /dev/null and b/doc/talks/assets/garage2.drawio.png differ diff --git a/doc/talks/assets/inframap_jdll2023.pdf b/doc/talks/assets/inframap_jdll2023.pdf new file mode 100644 index 00000000..77f97baa Binary files /dev/null and b/doc/talks/assets/inframap_jdll2023.pdf differ diff --git a/doc/talks/assets/logo_chatons.png b/doc/talks/assets/logo_chatons.png new file mode 100644 index 00000000..890cf17e Binary files /dev/null and b/doc/talks/assets/logo_chatons.png differ diff --git a/doc/talks/assets/map.png b/doc/talks/assets/map.png new file mode 100644 index 00000000..1dff3ab6 Binary files /dev/null and b/doc/talks/assets/map.png differ diff --git a/doc/talks/assets/minio.png b/doc/talks/assets/minio.png new file mode 100644 index 00000000..a71e9ccc Binary files /dev/null and b/doc/talks/assets/minio.png differ diff --git a/doc/talks/assets/neptune.jpg b/doc/talks/assets/neptune.jpg new file mode 100644 index 00000000..61fcbff6 Binary files /dev/null and b/doc/talks/assets/neptune.jpg differ diff --git a/doc/talks/assets/rust_logo.png b/doc/talks/assets/rust_logo.png new file mode 100644 index 00000000..0e4809ec Binary files /dev/null and b/doc/talks/assets/rust_logo.png differ -- cgit v1.2.3 From 4de7ac60232d521d7b31bddc0768002894cecf9d Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Mon, 22 Jan 2024 18:52:14 +0100 Subject: FOSDEM'24 talk WIP --- doc/talks/2024-02-03-fosdem/.gitignore | 17 + doc/talks/2024-02-03-fosdem/Makefile | 30 + doc/talks/2024-02-03-fosdem/abstract.md | 39 + doc/talks/2024-02-03-fosdem/assets/AGPLv3_Logo.png | Bin 0 -> 32497 bytes doc/talks/2024-02-03-fosdem/assets/aerogramme.png | Bin 0 -> 117865 bytes doc/talks/2024-02-03-fosdem/assets/aerogramme.svg | 1241 ++++++ .../assets/aerogramme_components1.drawio.pdf | Bin 0 -> 31966 bytes .../assets/aerogramme_components1.png | Bin 0 -> 26898 bytes .../assets/aerogramme_components2.drawio.pdf | Bin 0 -> 31688 bytes .../assets/aerogramme_components2.png | Bin 0 -> 27405 bytes .../assets/aerogramme_datatype.drawio.pdf | Bin 0 -> 31073 bytes .../assets/aerogramme_datatype.png | Bin 0 -> 9090 bytes .../assets/aerogramme_keys.drawio.pdf | Bin 0 -> 25145 bytes .../2024-02-03-fosdem/assets/aerogramme_keys.png | Bin 0 -> 17869 bytes .../2024-02-03-fosdem/assets/compatibility.png | Bin 0 -> 84505 bytes doc/talks/2024-02-03-fosdem/assets/consensus.svg | 137 + .../2024-02-03-fosdem/assets/garage.drawio.pdf | Bin 0 -> 26098 bytes .../2024-02-03-fosdem/assets/garage.drawio.png | Bin 0 -> 13463 bytes .../assets/garage_sync.drawio.pdf | Bin 0 -> 34372 bytes .../assets/garage_sync.drawio.png | Bin 0 -> 31184 bytes doc/talks/2024-02-03-fosdem/assets/lattice1.svg | 433 ++ doc/talks/2024-02-03-fosdem/assets/lattice2.svg | 514 +++ doc/talks/2024-02-03-fosdem/assets/lattice3.svg | 515 +++ doc/talks/2024-02-03-fosdem/assets/lattice4.svg | 525 +++ doc/talks/2024-02-03-fosdem/assets/lattice5.svg | 536 +++ doc/talks/2024-02-03-fosdem/assets/lattice6.svg | 553 +++ doc/talks/2024-02-03-fosdem/assets/lattice7.svg | 581 +++ doc/talks/2024-02-03-fosdem/assets/lattice8.svg | 581 +++ doc/talks/2024-02-03-fosdem/assets/latticeB_1.svg | 576 +++ doc/talks/2024-02-03-fosdem/assets/latticeB_10.svg | 715 ++++ doc/talks/2024-02-03-fosdem/assets/latticeB_2.svg | 576 +++ doc/talks/2024-02-03-fosdem/assets/latticeB_3.svg | 576 +++ doc/talks/2024-02-03-fosdem/assets/latticeB_4.svg | 587 +++ doc/talks/2024-02-03-fosdem/assets/latticeB_5.svg | 604 +++ doc/talks/2024-02-03-fosdem/assets/latticeB_6.svg | 632 +++ doc/talks/2024-02-03-fosdem/assets/latticeB_7.svg | 654 +++ doc/talks/2024-02-03-fosdem/assets/latticeB_8.svg | 671 +++ doc/talks/2024-02-03-fosdem/assets/latticeB_9.svg | 699 ++++ doc/talks/2024-02-03-fosdem/assets/rust_logo.png | Bin 0 -> 14835 bytes .../2024-02-03-fosdem/assets/scr_garage_stats.png | Bin 0 -> 133013 bytes .../2024-02-03-fosdem/assets/scr_garage_status.png | Bin 0 -> 75685 bytes .../assets/scr_garage_status_broken.png | Bin 0 -> 54964 bytes .../assets/scr_garage_worker_get.png | Bin 0 -> 76007 bytes .../assets/scr_garage_worker_list.png | Bin 0 -> 115654 bytes doc/talks/2024-02-03-fosdem/assets/slideB1.png | Bin 0 -> 86072 bytes doc/talks/2024-02-03-fosdem/assets/slideB2.png | Bin 0 -> 83399 bytes doc/talks/2024-02-03-fosdem/assets/slideB3.png | Bin 0 -> 82581 bytes doc/talks/2024-02-03-fosdem/assets/slides.svg | 4326 ++++++++++++++++++++ doc/talks/2024-02-03-fosdem/assets/slidesB.svg | 444 ++ doc/talks/2024-02-03-fosdem/talk.pdf | Bin 0 -> 3919347 bytes doc/talks/2024-02-03-fosdem/talk.tex | 1104 +++++ doc/talks/assets/.gitignore | 4 + doc/talks/assets/Amazon-S3.jpg | Bin 0 -> 45617 bytes doc/talks/assets/NGI0Entrust_tag.png | Bin 0 -> 78466 bytes doc/talks/assets/NGI0Entrust_tag.svg | 149 + doc/talks/assets/capitole_du_libre.png | Bin 0 -> 30578 bytes doc/talks/assets/db_engine.png | Bin 0 -> 181046 bytes .../assets/endpoint_latency_0.7_0.8_minio.png | Bin 0 -> 147625 bytes doc/talks/assets/fosdem22.png | Bin 0 -> 7383 bytes doc/talks/assets/fosdem24.png | Bin 0 -> 7819 bytes doc/talks/assets/geodistrib_paper.png | Bin 0 -> 302250 bytes doc/talks/assets/grafana_dashboard.png | Bin 0 -> 468890 bytes doc/talks/assets/io-0.7-0.8-minio.png | Bin 0 -> 193869 bytes doc/talks/assets/jaeger_listobjects.png | Bin 0 -> 125264 bytes doc/talks/assets/jaeger_putobject.png | Bin 0 -> 139900 bytes doc/talks/assets/jdll.png | Bin 0 -> 10348 bytes doc/talks/assets/location-aware.png | Bin 0 -> 99269 bytes doc/talks/assets/ngi-pointer.png | Bin 0 -> 21593 bytes doc/talks/assets/nlnet.svg | 34 + doc/talks/assets/pses.png | Bin 0 -> 22379 bytes doc/talks/assets/schema-streaming-1.png | Bin 0 -> 93247 bytes doc/talks/assets/schema-streaming-2.png | Bin 0 -> 92570 bytes doc/talks/assets/schema-streaming.png | Bin 0 -> 238774 bytes doc/talks/assets/timeline-22-24.svg | 327 ++ doc/talks/assets/ttfb.png | Bin 0 -> 131548 bytes 75 files changed, 18380 insertions(+) create mode 100644 doc/talks/2024-02-03-fosdem/.gitignore create mode 100644 doc/talks/2024-02-03-fosdem/Makefile create mode 100644 doc/talks/2024-02-03-fosdem/abstract.md create mode 100644 doc/talks/2024-02-03-fosdem/assets/AGPLv3_Logo.png create mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme.png create mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme_components1.drawio.pdf create mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme_components1.png create mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme_components2.drawio.pdf create mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme_components2.png create mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme_datatype.drawio.pdf create mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme_datatype.png create mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme_keys.drawio.pdf create mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme_keys.png create mode 100644 doc/talks/2024-02-03-fosdem/assets/compatibility.png create mode 100644 doc/talks/2024-02-03-fosdem/assets/consensus.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/garage.drawio.pdf create mode 100644 doc/talks/2024-02-03-fosdem/assets/garage.drawio.png create mode 100644 doc/talks/2024-02-03-fosdem/assets/garage_sync.drawio.pdf create mode 100644 doc/talks/2024-02-03-fosdem/assets/garage_sync.drawio.png create mode 100644 doc/talks/2024-02-03-fosdem/assets/lattice1.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/lattice2.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/lattice3.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/lattice4.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/lattice5.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/lattice6.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/lattice7.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/lattice8.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_1.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_10.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_2.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_3.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_4.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_5.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_6.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_7.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_8.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_9.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/rust_logo.png create mode 100644 doc/talks/2024-02-03-fosdem/assets/scr_garage_stats.png create mode 100644 doc/talks/2024-02-03-fosdem/assets/scr_garage_status.png create mode 100644 doc/talks/2024-02-03-fosdem/assets/scr_garage_status_broken.png create mode 100644 doc/talks/2024-02-03-fosdem/assets/scr_garage_worker_get.png create mode 100644 doc/talks/2024-02-03-fosdem/assets/scr_garage_worker_list.png create mode 100644 doc/talks/2024-02-03-fosdem/assets/slideB1.png create mode 100644 doc/talks/2024-02-03-fosdem/assets/slideB2.png create mode 100644 doc/talks/2024-02-03-fosdem/assets/slideB3.png create mode 100644 doc/talks/2024-02-03-fosdem/assets/slides.svg create mode 100644 doc/talks/2024-02-03-fosdem/assets/slidesB.svg create mode 100644 doc/talks/2024-02-03-fosdem/talk.pdf create mode 100644 doc/talks/2024-02-03-fosdem/talk.tex create mode 100644 doc/talks/assets/Amazon-S3.jpg create mode 100644 doc/talks/assets/NGI0Entrust_tag.png create mode 100644 doc/talks/assets/NGI0Entrust_tag.svg create mode 100644 doc/talks/assets/capitole_du_libre.png create mode 100644 doc/talks/assets/db_engine.png create mode 100644 doc/talks/assets/endpoint_latency_0.7_0.8_minio.png create mode 100644 doc/talks/assets/fosdem22.png create mode 100644 doc/talks/assets/fosdem24.png create mode 100644 doc/talks/assets/geodistrib_paper.png create mode 100644 doc/talks/assets/grafana_dashboard.png create mode 100644 doc/talks/assets/io-0.7-0.8-minio.png create mode 100644 doc/talks/assets/jaeger_listobjects.png create mode 100644 doc/talks/assets/jaeger_putobject.png create mode 100644 doc/talks/assets/jdll.png create mode 100644 doc/talks/assets/location-aware.png create mode 100644 doc/talks/assets/ngi-pointer.png create mode 100644 doc/talks/assets/nlnet.svg create mode 100644 doc/talks/assets/pses.png create mode 100644 doc/talks/assets/schema-streaming-1.png create mode 100644 doc/talks/assets/schema-streaming-2.png create mode 100644 doc/talks/assets/schema-streaming.png create mode 100644 doc/talks/assets/timeline-22-24.svg create mode 100644 doc/talks/assets/ttfb.png (limited to 'doc') diff --git a/doc/talks/2024-02-03-fosdem/.gitignore b/doc/talks/2024-02-03-fosdem/.gitignore new file mode 100644 index 00000000..9f1f00e6 --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/.gitignore @@ -0,0 +1,17 @@ +* + +!*.txt +!*.md + +!assets + +!.gitignore +!*.svg +!*.png +!*.jpg +!*.tex +!Makefile +!.gitignore +!assets/*.drawio.pdf + +!talk.pdf diff --git a/doc/talks/2024-02-03-fosdem/Makefile b/doc/talks/2024-02-03-fosdem/Makefile new file mode 100644 index 00000000..1440057c --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/Makefile @@ -0,0 +1,30 @@ +ASSETS=assets/consensus.pdf_tex \ + assets/lattice1.pdf_tex \ + assets/lattice2.pdf_tex \ + assets/lattice3.pdf_tex \ + assets/lattice4.pdf_tex \ + assets/lattice5.pdf_tex \ + assets/lattice6.pdf_tex \ + assets/lattice7.pdf_tex \ + assets/lattice8.pdf_tex \ + assets/latticeB_1.pdf_tex \ + assets/latticeB_2.pdf_tex \ + assets/latticeB_3.pdf_tex \ + assets/latticeB_4.pdf_tex \ + assets/latticeB_5.pdf_tex \ + assets/latticeB_6.pdf_tex \ + assets/latticeB_7.pdf_tex \ + assets/latticeB_8.pdf_tex \ + assets/latticeB_9.pdf_tex \ + assets/latticeB_10.pdf_tex \ + ../assets/deuxfleurs.pdf \ + ../assets/timeline-22-24.pdf + +talk.pdf: talk.tex $(ASSETS) + pdflatex talk.tex + +%.pdf: %.svg + inkscape -D -z --file=$^ --export-pdf=$@ + +%.pdf_tex: %.svg + inkscape -D -z --file=$^ --export-pdf=$@ --export-latex diff --git a/doc/talks/2024-02-03-fosdem/abstract.md b/doc/talks/2024-02-03-fosdem/abstract.md new file mode 100644 index 00000000..b2658868 --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/abstract.md @@ -0,0 +1,39 @@ +### (fr) Garage, un système de stockage de données géo-distribué léger et robuste + +Garage est un système de stockage de données léger, géo-distribué, qui +implémente le protocole de stockage S3 de Amazon. Garage est destiné +principalement à l'auto-hébergement sur du matériel courant d'occasion. À ce +titre, il doit tolérer un grand nombre de pannes: coupures de courant, coupures +de connexion Internet, pannes de machines, ... Il doit également être facile à +déployer et à maintenir, afin de pouvoir être facilement utilisé par des +amateurs ou des petites organisations. + +Cette présentation vous proposera un aperçu de Garage et du choix technique +principal qui rend un système comme Garage possible: le refus d'utiliser des +algorithmes de consensus, remplacés avantageusement par des méthodes à +cohérence faible. Notre modèle est fortement inspiré de la base de donnée +Dynamo (DeCandia et al, 2007), et fait usage des types de données CRDT (Shapiro +et al, 2011). Nous exploreront comment ces méthodes s'appliquent à la +construction de l'abstraction "stockage objet" dans un système distribué, et +quelles autres abstractions peuvent ou ne peuvent pas être construites dans ce +modèle. + +### (en) Garage, a lightweight and robust geo-distributed data storage system + +Garage is a lightweight geo-distributed data store that implements the Amazon +S3 object storage protocol. Garage is meant primarily for self-hosting at home +on second-hand commodity hardware, meaning it has to tolerate a wide variety of +failure scenarios such as power cuts, Internet disconnections and machine +crashes. It also has to be easy to deploy and maintain, so that hobbyists and +small organizations can use it without trouble. + +This talk will present Garage and the key technical choice that made Garage +possible: refusing to use consensus algorithms and using instead weak +consistency methods, with a model that is loosely based on that of the Dynamo +database (DeCandia et al, 2007) and that makes heavy use of conflict-free +replicated data types (Shapiro et al, 2011). We will explore how these methods +are suited to building the "object store" abstraction in a distributed system, +and what other abstractions are possible or impossible to build in this model. + + + diff --git a/doc/talks/2024-02-03-fosdem/assets/AGPLv3_Logo.png b/doc/talks/2024-02-03-fosdem/assets/AGPLv3_Logo.png new file mode 100644 index 00000000..445284a3 Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/AGPLv3_Logo.png differ diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme.png b/doc/talks/2024-02-03-fosdem/assets/aerogramme.png new file mode 100644 index 00000000..3aabe3ad Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/aerogramme.png differ diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme.svg b/doc/talks/2024-02-03-fosdem/assets/aerogramme.svg new file mode 100644 index 00000000..0c1ee127 --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/aerogramme.svg @@ -0,0 +1,1241 @@ + + + + + + K2V APIS3 APIAerogramme + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +IMAPIMAPIMAPMessageindexMessagebodies diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme_components1.drawio.pdf b/doc/talks/2024-02-03-fosdem/assets/aerogramme_components1.drawio.pdf new file mode 100644 index 00000000..71a90f26 Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/aerogramme_components1.drawio.pdf differ diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme_components1.png b/doc/talks/2024-02-03-fosdem/assets/aerogramme_components1.png new file mode 100644 index 00000000..fb81b460 Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/aerogramme_components1.png differ diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme_components2.drawio.pdf b/doc/talks/2024-02-03-fosdem/assets/aerogramme_components2.drawio.pdf new file mode 100644 index 00000000..87e42eed Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/aerogramme_components2.drawio.pdf differ diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme_components2.png b/doc/talks/2024-02-03-fosdem/assets/aerogramme_components2.png new file mode 100644 index 00000000..f9e2df14 Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/aerogramme_components2.png differ diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme_datatype.drawio.pdf b/doc/talks/2024-02-03-fosdem/assets/aerogramme_datatype.drawio.pdf new file mode 100644 index 00000000..0606e059 Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/aerogramme_datatype.drawio.pdf differ diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme_datatype.png b/doc/talks/2024-02-03-fosdem/assets/aerogramme_datatype.png new file mode 100644 index 00000000..c3b015a1 Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/aerogramme_datatype.png differ diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme_keys.drawio.pdf b/doc/talks/2024-02-03-fosdem/assets/aerogramme_keys.drawio.pdf new file mode 100644 index 00000000..8fea81c7 Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/aerogramme_keys.drawio.pdf differ diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme_keys.png b/doc/talks/2024-02-03-fosdem/assets/aerogramme_keys.png new file mode 100644 index 00000000..ed2077d9 Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/aerogramme_keys.png differ diff --git a/doc/talks/2024-02-03-fosdem/assets/compatibility.png b/doc/talks/2024-02-03-fosdem/assets/compatibility.png new file mode 100644 index 00000000..ce364a9b Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/compatibility.png differ diff --git a/doc/talks/2024-02-03-fosdem/assets/consensus.svg b/doc/talks/2024-02-03-fosdem/assets/consensus.svg new file mode 100644 index 00000000..8321e383 --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/consensus.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + $\bot$ + + + + $x$ + + + $propose(x) / x$ + $propose(y) / x$ + + + diff --git a/doc/talks/2024-02-03-fosdem/assets/garage.drawio.pdf b/doc/talks/2024-02-03-fosdem/assets/garage.drawio.pdf new file mode 100644 index 00000000..a54a163c Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/garage.drawio.pdf differ diff --git a/doc/talks/2024-02-03-fosdem/assets/garage.drawio.png b/doc/talks/2024-02-03-fosdem/assets/garage.drawio.png new file mode 100644 index 00000000..386dd862 Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/garage.drawio.png differ diff --git a/doc/talks/2024-02-03-fosdem/assets/garage_sync.drawio.pdf b/doc/talks/2024-02-03-fosdem/assets/garage_sync.drawio.pdf new file mode 100644 index 00000000..a94b3572 Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/garage_sync.drawio.pdf differ diff --git a/doc/talks/2024-02-03-fosdem/assets/garage_sync.drawio.png b/doc/talks/2024-02-03-fosdem/assets/garage_sync.drawio.png new file mode 100644 index 00000000..2e7b5af0 Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/garage_sync.drawio.png differ diff --git a/doc/talks/2024-02-03-fosdem/assets/lattice1.svg b/doc/talks/2024-02-03-fosdem/assets/lattice1.svg new file mode 100644 index 00000000..8bfa5aa7 --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/lattice1.svg @@ -0,0 +1,433 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + diff --git a/doc/talks/2024-02-03-fosdem/assets/lattice2.svg b/doc/talks/2024-02-03-fosdem/assets/lattice2.svg new file mode 100644 index 00000000..adcd92cb --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/lattice2.svg @@ -0,0 +1,514 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $\not\sqsupseteq \{a\}$ + $\not\sqsupseteq \{a\}$ + $\not\sqsupseteq \{a\}$ + + diff --git a/doc/talks/2024-02-03-fosdem/assets/lattice3.svg b/doc/talks/2024-02-03-fosdem/assets/lattice3.svg new file mode 100644 index 00000000..640dc468 --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/lattice3.svg @@ -0,0 +1,515 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $\sqsupseteq \{a\} \to$ OK + $\not\sqsupseteq \{a\}$ + $\not\sqsupseteq \{a\}$ + + diff --git a/doc/talks/2024-02-03-fosdem/assets/lattice4.svg b/doc/talks/2024-02-03-fosdem/assets/lattice4.svg new file mode 100644 index 00000000..b2a99e28 --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/lattice4.svg @@ -0,0 +1,525 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $\sqsupseteq \{a\} \to$ OK + $\sqsupseteq \{a\} \to$ OK + $\not\sqsupseteq \{a\}$ + return OK + + diff --git a/doc/talks/2024-02-03-fosdem/assets/lattice5.svg b/doc/talks/2024-02-03-fosdem/assets/lattice5.svg new file mode 100644 index 00000000..bc6b7195 --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/lattice5.svg @@ -0,0 +1,536 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $read()$: + $\sqsupseteq \{a\} \to$ OK + $\sqsupseteq \{a\} \to$ OK + $\not\sqsupseteq \{a\}$ + return OK + + diff --git a/doc/talks/2024-02-03-fosdem/assets/lattice6.svg b/doc/talks/2024-02-03-fosdem/assets/lattice6.svg new file mode 100644 index 00000000..176b1715 --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/lattice6.svg @@ -0,0 +1,553 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $read()$: + $\sqsupseteq \{a\} \to$ OK + $\sqsupseteq \{a\} \to$ OK + $\not\sqsupseteq \{a\}$ + + $\to \{\}$ + return OK + + diff --git a/doc/talks/2024-02-03-fosdem/assets/lattice7.svg b/doc/talks/2024-02-03-fosdem/assets/lattice7.svg new file mode 100644 index 00000000..7ce8bda8 --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/lattice7.svg @@ -0,0 +1,581 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $read()$: + $\sqsupseteq \{a\} \to$ OK + $\sqsupseteq \{a\} \to$ OK + $\not\sqsupseteq \{a\}$ + + $\to \{\}$ + return OK + return $\{\}\sqcup\{a\}=\{a\}$ + + $\to \{a\}$ + + diff --git a/doc/talks/2024-02-03-fosdem/assets/lattice8.svg b/doc/talks/2024-02-03-fosdem/assets/lattice8.svg new file mode 100644 index 00000000..c94a69b2 --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/lattice8.svg @@ -0,0 +1,581 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $read()$: + $\sqsupseteq \{a\} \to$ OK + $\sqsupseteq \{a\} \to$ OK + $\sqsupseteq \{a\}$ + + $\to \{\}$ + return OK + return $\{\}\sqcup\{a\}=\{a\}$ + + $\to \{a\}$ + + diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_1.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_1.svg new file mode 100644 index 00000000..92232a1b --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/latticeB_1.svg @@ -0,0 +1,576 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $\not\sqsupseteq \{a\}$ + $\not\sqsupseteq \{a\}$ + $\not\sqsupseteq \{a\}$ + + + + $write(\{b\})$: + $\not\sqsupseteq \{b\}$ + $\not\sqsupseteq \{b\}$ + $\not\sqsupseteq \{b\}$ + + diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_10.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_10.svg new file mode 100644 index 00000000..34c24e0d --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/latticeB_10.svg @@ -0,0 +1,715 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $\sqsupseteq \{a\} \to$ OK + $\not\sqsupseteq \{a\}$ + $\not\sqsupseteq \{a\}$ + + + + $write(\{b\})$: + $read()$: + $\not\sqsupseteq \{b\}$ + $\sqsupseteq \{b\} \to$ OK + $\not\sqsupseteq \{b\}$ + + + $\to \{a\}$ + return $\{a\}$ + + $\to \{\}$ + + $\to \{\}$ + $read()$: + ; + return $\{b\}$ + + $\to \{b\}$ + ${\Large\textbf{??!}}$~~~~~$\{a\} \not\sqsubseteq \{b\}$ + + diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_2.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_2.svg new file mode 100644 index 00000000..c07cba2b --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/latticeB_2.svg @@ -0,0 +1,576 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $\sqsupseteq \{a\} \to$ OK + $\not\sqsupseteq \{a\}$ + $\not\sqsupseteq \{a\}$ + + + + $write(\{b\})$: + $\not\sqsupseteq \{b\}$ + $\not\sqsupseteq \{b\}$ + $\not\sqsupseteq \{b\}$ + + diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_3.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_3.svg new file mode 100644 index 00000000..198d1f5d --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/latticeB_3.svg @@ -0,0 +1,576 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $\sqsupseteq \{a\} \to$ OK + $\not\sqsupseteq \{a\}$ + $\not\sqsupseteq \{a\}$ + + + + $write(\{b\})$: + $\not\sqsupseteq \{b\}$ + $\sqsupseteq \{b\} \to$ OK + $\not\sqsupseteq \{b\}$ + + + diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_4.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_4.svg new file mode 100644 index 00000000..c5f6148d --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/latticeB_4.svg @@ -0,0 +1,587 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $\sqsupseteq \{a\} \to$ OK + $\not\sqsupseteq \{a\}$ + $\not\sqsupseteq \{a\}$ + + + + $write(\{b\})$: + $read()$: + $\not\sqsupseteq \{b\}$ + $\sqsupseteq \{b\} \to$ OK + $\not\sqsupseteq \{b\}$ + + + diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_5.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_5.svg new file mode 100644 index 00000000..c2b668be --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/latticeB_5.svg @@ -0,0 +1,604 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $\sqsupseteq \{a\} \to$ OK + $\not\sqsupseteq \{a\}$ + $\not\sqsupseteq \{a\}$ + + + + $write(\{b\})$: + $read()$: + $\not\sqsupseteq \{b\}$ + $\sqsupseteq \{b\} \to$ OK + $\not\sqsupseteq \{b\}$ + + + $\to \{a\}$ + + diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_6.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_6.svg new file mode 100644 index 00000000..980823fc --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/latticeB_6.svg @@ -0,0 +1,632 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $\sqsupseteq \{a\} \to$ OK + $\not\sqsupseteq \{a\}$ + $\not\sqsupseteq \{a\}$ + + + + $write(\{b\})$: + $read()$: + $\not\sqsupseteq \{b\}$ + $\sqsupseteq \{b\} \to$ OK + $\not\sqsupseteq \{b\}$ + + + $\to \{a\}$ + return $\{a\}$ + + $\to \{\}$ + + diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_7.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_7.svg new file mode 100644 index 00000000..154c0b7d --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/latticeB_7.svg @@ -0,0 +1,654 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $\sqsupseteq \{a\} \to$ OK + $\not\sqsupseteq \{a\}$ + $\not\sqsupseteq \{a\}$ + + + + $write(\{b\})$: + $read()$: + $\not\sqsupseteq \{b\}$ + $\sqsupseteq \{b\} \to$ OK + $\not\sqsupseteq \{b\}$ + + + $\to \{a\}$ + return $\{a\}$ + + $\to \{\}$ + $read()$: + ; + + diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_8.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_8.svg new file mode 100644 index 00000000..21766415 --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/latticeB_8.svg @@ -0,0 +1,671 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $\sqsupseteq \{a\} \to$ OK + $\not\sqsupseteq \{a\}$ + $\not\sqsupseteq \{a\}$ + + + + $write(\{b\})$: + $read()$: + $\not\sqsupseteq \{b\}$ + $\sqsupseteq \{b\} \to$ OK + $\not\sqsupseteq \{b\}$ + + + $\to \{a\}$ + return $\{a\}$ + + $\to \{\}$ + + $\to \{\}$ + $read()$: + ; + + diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_9.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_9.svg new file mode 100644 index 00000000..b60f8afe --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/latticeB_9.svg @@ -0,0 +1,699 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $\sqsupseteq \{a\} \to$ OK + $\not\sqsupseteq \{a\}$ + $\not\sqsupseteq \{a\}$ + + + + $write(\{b\})$: + $read()$: + $\not\sqsupseteq \{b\}$ + $\sqsupseteq \{b\} \to$ OK + $\not\sqsupseteq \{b\}$ + + + $\to \{a\}$ + return $\{a\}$ + + $\to \{\}$ + + $\to \{\}$ + $read()$: + ; + return $\{b\}$ + + $\to \{b\}$ + + diff --git a/doc/talks/2024-02-03-fosdem/assets/rust_logo.png b/doc/talks/2024-02-03-fosdem/assets/rust_logo.png new file mode 100644 index 00000000..0e4809ec Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/rust_logo.png differ diff --git a/doc/talks/2024-02-03-fosdem/assets/scr_garage_stats.png b/doc/talks/2024-02-03-fosdem/assets/scr_garage_stats.png new file mode 100644 index 00000000..c92f0774 Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/scr_garage_stats.png differ diff --git a/doc/talks/2024-02-03-fosdem/assets/scr_garage_status.png b/doc/talks/2024-02-03-fosdem/assets/scr_garage_status.png new file mode 100644 index 00000000..849b8336 Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/scr_garage_status.png differ diff --git a/doc/talks/2024-02-03-fosdem/assets/scr_garage_status_broken.png b/doc/talks/2024-02-03-fosdem/assets/scr_garage_status_broken.png new file mode 100644 index 00000000..86dcce89 Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/scr_garage_status_broken.png differ diff --git a/doc/talks/2024-02-03-fosdem/assets/scr_garage_worker_get.png b/doc/talks/2024-02-03-fosdem/assets/scr_garage_worker_get.png new file mode 100644 index 00000000..e7d4e288 Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/scr_garage_worker_get.png differ diff --git a/doc/talks/2024-02-03-fosdem/assets/scr_garage_worker_list.png b/doc/talks/2024-02-03-fosdem/assets/scr_garage_worker_list.png new file mode 100644 index 00000000..472312a0 Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/scr_garage_worker_list.png differ diff --git a/doc/talks/2024-02-03-fosdem/assets/slideB1.png b/doc/talks/2024-02-03-fosdem/assets/slideB1.png new file mode 100644 index 00000000..b14b6070 Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/slideB1.png differ diff --git a/doc/talks/2024-02-03-fosdem/assets/slideB2.png b/doc/talks/2024-02-03-fosdem/assets/slideB2.png new file mode 100644 index 00000000..a881a796 Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/slideB2.png differ diff --git a/doc/talks/2024-02-03-fosdem/assets/slideB3.png b/doc/talks/2024-02-03-fosdem/assets/slideB3.png new file mode 100644 index 00000000..830709d2 Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/assets/slideB3.png differ diff --git a/doc/talks/2024-02-03-fosdem/assets/slides.svg b/doc/talks/2024-02-03-fosdem/assets/slides.svg new file mode 100644 index 00000000..9946c6fb --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/slides.svg @@ -0,0 +1,4326 @@ + + + + + + + + + + + + + + + + + + + + + + User-facing application + Database + Filesystem + + + + + + + + + + diff --git a/doc/talks/2024-02-03-fosdem/assets/slidesB.svg b/doc/talks/2024-02-03-fosdem/assets/slidesB.svg new file mode 100644 index 00000000..c0a6e97c --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/assets/slidesB.svg @@ -0,0 +1,444 @@ + + + +User-facing applicationDatabase*K2VObject storage*(not really a database)Database diff --git a/doc/talks/2024-02-03-fosdem/talk.pdf b/doc/talks/2024-02-03-fosdem/talk.pdf new file mode 100644 index 00000000..03fa8fcc Binary files /dev/null and b/doc/talks/2024-02-03-fosdem/talk.pdf differ diff --git a/doc/talks/2024-02-03-fosdem/talk.tex b/doc/talks/2024-02-03-fosdem/talk.tex new file mode 100644 index 00000000..4c4dcdbc --- /dev/null +++ b/doc/talks/2024-02-03-fosdem/talk.tex @@ -0,0 +1,1104 @@ +\nonstopmode +\documentclass[aspectratio=169]{beamer} +\usepackage[utf8]{inputenc} +% \usepackage[frenchb]{babel} +\usepackage{amsmath} +\usepackage{mathtools} +\usepackage{breqn} +\usepackage{multirow} +\usetheme{boxes} +\usepackage{graphicx} +\usepackage{import} +\usepackage{adjustbox} +%\useoutertheme[footline=authortitle,subsection=false]{miniframes} +%\useoutertheme[footline=authorinstitute,subsection=false]{miniframes} +\useoutertheme{infolines} +\setbeamertemplate{headline}{} + +\beamertemplatenavigationsymbolsempty + +\definecolor{TitleOrange}{RGB}{255,137,0} +\setbeamercolor{title}{fg=TitleOrange} +\setbeamercolor{frametitle}{fg=TitleOrange} + +\definecolor{ListOrange}{RGB}{255,145,5} +\setbeamertemplate{itemize item}{\color{ListOrange}$\blacktriangleright$} + +\definecolor{verygrey}{RGB}{70,70,70} +\setbeamercolor{normal text}{fg=verygrey} + + +\usepackage{tabu} +\usepackage{multicol} +\usepackage{vwcol} +\usepackage{stmaryrd} +\usepackage{graphicx} + +\usepackage[normalem]{ulem} + +\AtBeginSection[]{ + \begin{frame} + \vfill + \centering + \begin{beamercolorbox}[sep=8pt,center,shadow=true,rounded=true]{title} + \usebeamerfont{title}\insertsectionhead\par% + \end{beamercolorbox} + \vfill + \end{frame} +} + +\title{Garage, the low-tech storage platform for geo-distributed clusters} +\author{Alex Auvolat, Deuxfleurs} +\date{FOSDEM'24, 2024-02-03} + +\begin{document} + +\begin{frame} + \centering + \includegraphics[width=.3\linewidth]{../../sticker/Garage.png} + \vspace{1em} + + {\large\bf Alex Auvolat, Deuxfleurs Association} + \vspace{1em} + + \url{https://garagehq.deuxfleurs.fr/} + + Matrix channel: \texttt{\#garage:deuxfleurs.fr} +\end{frame} + +\begin{frame} + \frametitle{Who I am} + \begin{columns}[t] + \begin{column}{.2\textwidth} + \centering + \adjincludegraphics[width=.4\linewidth, valign=t]{../assets/alex.jpg} + \end{column} + \begin{column}{.6\textwidth} + \textbf{Alex Auvolat}\\ + PhD; co-founder of Deuxfleurs + \end{column} + \begin{column}{.2\textwidth} + ~ + \end{column} + \end{columns} + \vspace{2em} + + \begin{columns}[t] + \begin{column}{.2\textwidth} + \centering + \adjincludegraphics[width=.5\linewidth, valign=t]{../assets/deuxfleurs.pdf} + \end{column} + \begin{column}{.6\textwidth} + \textbf{Deuxfleurs}\\ + A non-profit self-hosting collective,\\ + member of the CHATONS network + \end{column} + \begin{column}{.2\textwidth} + \centering + \adjincludegraphics[width=.7\linewidth, valign=t]{../assets/logo_chatons.png} + \end{column} + \end{columns} + +\end{frame} + +\begin{frame} + \frametitle{Our objective at Deuxfleurs} + + \begin{center} + \textbf{Promote self-hosting and small-scale hosting\\ + as an alternative to large cloud providers} + \end{center} + \vspace{2em} + \visible<2->{ + Why is it hard? + } + \visible<3->{ + \vspace{2em} + \begin{center} + \textbf{\underline{Resilience}}\\ + {\footnotesize (we want good uptime/availability with low supervision)} + \end{center} + } +\end{frame} + +\begin{frame} + \frametitle{How to make a \underline{stable} system} + + Enterprise-grade systems typically employ: + \vspace{1em} + \begin{itemize} + \item RAID + \item Redundant power grid + UPS + \item Redundant Internet connections + \item Low-latency links + \item ... + \end{itemize} + \vspace{1em} + $\to$ it's costly and only worth it at DC scale +\end{frame} + +\begin{frame} + \frametitle{How to make a \underline{resilient} system} + + \only<1,4-5>{ + Instead, we use: + \vspace{1em} + \begin{itemize} + \item \textcolor<2->{gray}{Commodity hardware (e.g. old desktop PCs)} + \vspace{.5em} + \item<4-> \textcolor<5->{gray}{Commodity Internet (e.g. FTTB, FTTH) and power grid} + \vspace{.5em} + \item<5-> \textcolor<6->{gray}{\textbf{Geographical redundancy} (multi-site replication)} + \end{itemize} + } + \only<2>{ + \begin{center} + \includegraphics[width=.8\linewidth]{../assets/neptune.jpg} + \end{center} + } + \only<3>{ + \begin{center} + \includegraphics[width=.8\linewidth]{../assets/atuin.jpg} + \end{center} + } + \only<6>{ + \begin{center} + \includegraphics[width=.8\linewidth]{../assets/inframap_jdll2023.pdf} + \end{center} + } +\end{frame} + +\begin{frame} + \frametitle{Object storage: a crucial component} + \begin{center} + \includegraphics[height=6em]{../assets/Amazon-S3.jpg} + \hspace{3em} + \includegraphics[height=5em]{../assets/minio.png} + \hspace{3em} + \includegraphics[height=6em]{../../logo/garage_hires_crop.png} + \end{center} + \vspace{1em} + S3: a de-facto standard, many compatible applications + + \vspace{1em} + + MinIO is self-hostable but not suited for geo-distributed deployments + + \vspace{1em} + + \textbf{Garage is a self-hosted drop-in replacement for the Amazon S3 object store} +\end{frame} + +\begin{frame} + \frametitle{CRDTs / weak consistency instead of consensus} + Consensus can be implemented reasonably well in practice, so why avoid it? + \vspace{1em} + \begin{itemize} + \item \textbf{Software complexity} + \vspace{1em} + \item \textbf{Performance issues:} + \vspace{.5em} + \begin{itemize} + \item The leader is a \textbf{bottleneck} for all requests\\ + \vspace{.5em} + \item \textbf{Sensitive to higher latency} between nodes + \vspace{.5em} + \item \textbf{Takes time to reconverge} when disrupted (e.g. node going down) + \end{itemize} + \end{itemize} + \vspace{2em} + $\to$ Garage uses only CRDTs internally (conflict-free replicated data types) +\end{frame} + +\begin{frame} + \frametitle{The data model of object storage} + Object storage is basically a key-value store: + \vspace{1em} + + {\footnotesize + \begin{center} + \begin{tabular}{|l|p{8cm}|} + \hline + \textbf{Key: file path + name} & \textbf{Value: file data + metadata} \\ + \hline + \hline + \texttt{index.html} & + \texttt{Content-Type: text/html; charset=utf-8} \newline + \texttt{Content-Length: 24929} \newline + \texttt{} \\ + \hline + \texttt{img/logo.svg} & + \texttt{Content-Type: text/svg+xml} \newline + \texttt{Content-Length: 13429} \newline + \texttt{} \\ + \hline + \texttt{download/index.html} & + \texttt{Content-Type: text/html; charset=utf-8} \newline + \texttt{Content-Length: 26563} \newline + \texttt{} \\ + \hline + \end{tabular} + \end{center} + } + + \vspace{1em} + Simple interface, compatible with many existing applications + + \vspace{1em} + Maps well to CRDT data types +\end{frame} + +\begin{frame} + \frametitle{Performance gains in practice} + \begin{center} + \includegraphics[width=.8\linewidth]{../assets/endpoint_latency_0.7_0.8_minio.png} + \end{center} +\end{frame} + +\begin{frame} + \frametitle{Timeline} + \begin{center} + \includegraphics[width=.8\linewidth]{../assets/timeline-22-24.pdf} + \end{center} +\end{frame} + +% ====================== v0.7.0 =============================== + +\begin{frame} + \frametitle{April 2022 - Garage v0.7.0} + Focus on \underline{observability and ecosystem integration} + \vspace{2em} + \begin{itemize} + \item \textbf{Monitoring:} metrics and traces, using OpenTelemetry + \vspace{1em} + \item Alternative replication modes with 1 or 2 copies,\\ + modes with weaker consistency + \vspace{1em} + \item Kubernetes integration + \vspace{1em} + \item Admin API (v0.7.2) + \vspace{1em} + \item Experimental K2V API (v0.7.2) + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Metrics (Prometheus + Grafana)} + \begin{center} + \includegraphics[width=.9\linewidth]{../assets/grafana_dashboard.png} + \end{center} +\end{frame} + +\begin{frame} + \frametitle{Traces (Jaeger)} + \begin{center} + \includegraphics[width=.8\linewidth]{../assets/jaeger_listobjects.png} + \end{center} +\end{frame} + +% ====================== v0.8.0 =============================== + +\begin{frame} + \frametitle{November 2022 - Garage v0.8.0} + Focus on \underline{performance} + \vspace{2em} + \begin{itemize} + \item \textbf{Alternative metadata DB engines} (LMDB, Sqlite) + \vspace{1em} + \item \textbf{Performance improvements:} block streaming, various optimizations... + \vspace{1em} + \item Bucket quotas (max size, max \#objects) + \vspace{1em} + \item Quality of life improvements, observability, etc. + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{About metadata DB engines} + Issues with Sled: + \vspace{2em} + \begin{itemize} + \item Huge files on disk + \vspace{.5em} + \item Unpredictable performance, especially on HDD + \vspace{.5em} + \item API limitations + \vspace{.5em} + \item Not actively maintained + \end{itemize} + \vspace{2em} + LMDB: very stable, good performance, reasonably small files on disk + + \vspace{1em} + Sled will be removed in Garage v1.0 +\end{frame} + +\begin{frame} + \frametitle{DB engine performance comparison} + \begin{center} + \includegraphics[width=.6\linewidth]{../assets/db_engine.png} + \end{center} + NB: Sqlite was slow due to synchronous journaling mode, now configurable +\end{frame} + +\begin{frame} + \frametitle{Block streaming} + \begin{center} + \only<1>{\includegraphics[width=.8\linewidth]{../assets/schema-streaming-1.png}} + \only<2>{\includegraphics[width=.8\linewidth]{../assets/schema-streaming-2.png}} + \end{center} +\end{frame} + +\begin{frame} + \frametitle{TTFB benchmark} + \begin{center} + \includegraphics[width=.8\linewidth]{../assets/ttfb.png} + \end{center} +\end{frame} + +\begin{frame} + \frametitle{Throughput benchmark} + \begin{center} + \includegraphics[width=.7\linewidth]{../assets/io-0.7-0.8-minio.png} + \end{center} +\end{frame} + +% ====================== v0.9.0 =============================== + +\begin{frame} + \frametitle{October 2023 - Garage v0.9.0} + Focus on \underline{streamlining \& usability} + \vspace{2em} + \begin{itemize} + \item Support multiple HDDs per node + \vspace{1em} + \item S3 compatibility: + \vspace{1em} + \begin{itemize} + \item support basic lifecycle configurations + \vspace{.5em} + \item allow for multipart upload part retries + \end{itemize} + \vspace{1em} + \item LMDB by default, deprecation of Sled + \vspace{1em} + \item New layout computation algorithm + \end{itemize} +\end{frame} + + +\begin{frame} + \frametitle{Layout computation} + \begin{center} + \includegraphics[width=\linewidth]{../assets/location-aware.png} + \end{center} + \vspace{2em} + Garage replicates data on different zones when possible +\end{frame} + +\begin{frame} + \frametitle{Layout computation} + \begin{center} + \includegraphics[width=.8\linewidth]{../assets/map.png} + \end{center} +\end{frame} + +\begin{frame} + \frametitle{Optimal layout computation} + \begin{center} + \includegraphics[width=.6\linewidth]{../assets/geodistrib_paper.png} + \end{center} +\end{frame} + +\begin{frame} + \frametitle{What a "layout" is} + \textbf{A layout is a precomputed index table} + \vspace{2em} + + \begin{center} + \begin{tabular}{|l|l|l|l|} + \hline + \textbf{Partition} & \textbf{Node 1} & \textbf{Node 2} & \textbf{Node 3} \\ + \hline + \hline + Partition 0 & Io (jupiter) & Drosera (atuin) & Courgette (neptune) \\ + \hline + Partition 1 & Datura (atuin) & Courgette (neptune) & Io (jupiter) \\ + \hline + Partition 2 & Io(jupiter) & Celeri (neptune) & Drosera (atuin) \\ + \hline + \hspace{1em}$\vdots$ & \hspace{1em}$\vdots$ & \hspace{1em}$\vdots$ & \hspace{1em}$\vdots$ \\ + \hline + Partition 255 & Concombre (neptune) & Io (jupiter) & Drosera (atuin) \\ + \hline + \end{tabular} + \end{center} + + \vspace{1em} + The index table is built centrally using an optimal algorithm,\\ + then propagated to all nodes +\end{frame} + +\begin{frame} + \frametitle{The relationship between \emph{partition} and \emph{partition key}} + \begin{center} + \begin{tabular}{|l|l|l|l|} + \hline + \textbf{Partition key} & \textbf{Partition} & \textbf{Sort key} & \textbf{Value} \\ + \hline + \hline + \texttt{website} & Partition 12 & \texttt{index.html} & (file data) \\ + \hline + \texttt{website} & Partition 12 & \texttt{img/logo.svg} & (file data) \\ + \hline + \texttt{website} & Partition 12 &\texttt{download/index.html} & (file data) \\ + \hline + \hline + \texttt{backup} & Partition 42 & \texttt{borg/index.2822} & (file data) \\ + \hline + \texttt{backup} & Partition 42 & \texttt{borg/data/2/2329} & (file data) \\ + \hline + \texttt{backup} & Partition 42 & \texttt{borg/data/2/2680} & (file data) \\ + \hline + \hline + \texttt{private} & Partition 42 & \texttt{qq3a2nbe1qjq0ebbvo6ocsp6co} & (file data) \\ + \hline + \end{tabular} + \end{center} + \vspace{1em} + \textbf{To read or write an item:} hash partition key + \\ \hspace{5cm} $\to$ determine partition number (first 8 bits) + \\ \hspace{5cm} $\to$ find associated nodes +\end{frame} + +% ====================== v0.10.0 =============================== + +\begin{frame} + \frametitle{October 2023 - Garage v0.10.0 beta} + Focus on \underline{consistency} + \vspace{2em} + \begin{itemize} + \item Fix consistency issues when reshuffling data + \end{itemize} +\end{frame} + + + + +% -------------------------------------------------------------------- +% ================================================================================= +% ================================================================================= +% -------------------------------------------------------------------- +% -------------------------------------------------------------------- +% -------------------------------------------------------------------- +% ================================================================================= +% ================================================================================= +% -------------------------------------------------------------------- + + + + +\begin{frame} + \frametitle{Two big problems} + \begin{enumerate} + \item \textbf{How to place data on different nodes?}\\ + \vspace{1em} + \underline{Constraints:} heterogeneous hardware\\ + \underline{Objective:} $n$ copies of everything, maximize usable capacity, maximize resilience\\ + \vspace{1em} + $\to$ the Dynamo model + optimization algorithms + \vspace{2em} + \item<2-> \textbf{How to guarantee consistency?}\\ + \vspace{1em} + \underline{Constraints:} slow network (geographical distance), node unavailability/crashes\\ + \underline{Objective:} maximize availability, read-after-write guarantee\\ + \vspace{1em} + $\to$ CRDTs, monotonicity, read and write quorums + \end{enumerate} +\end{frame} + +\section{Problem 1: placing data} + +\begin{frame} + \frametitle{Key-value stores, upgraded: the Dynamo model} + \textbf{Two keys:} + \begin{itemize} + \item Partition key: used to divide data into partitions {\small (a.k.a.~shards)} + \item Sort key: used to identify items inside a partition + \end{itemize} + + \vspace{1em} + + \begin{center} + \begin{tabular}{|l|l|p{3cm}|} + \hline + \textbf{Partition key: bucket} & \textbf{Sort key: filename} & \textbf{Value} \\ + \hline + \hline + \texttt{website} & \texttt{index.html} & (file data) \\ + \hline + \texttt{website} & \texttt{img/logo.svg} & (file data) \\ + \hline + \texttt{website} & \texttt{download/index.html} & (file data) \\ + \hline + \hline + \texttt{backup} & \texttt{borg/index.2822} & (file data) \\ + \hline + \texttt{backup} & \texttt{borg/data/2/2329} & (file data) \\ + \hline + \texttt{backup} & \texttt{borg/data/2/2680} & (file data) \\ + \hline + \hline + \texttt{private} & \texttt{qq3a2nbe1qjq0ebbvo6ocsp6co} & (file data) \\ + \hline + \end{tabular} + \end{center} +\end{frame} + +\begin{frame} + \frametitle{Key-value stores, upgraded: the Dynamo model} + \begin{itemize} + \item Data with different partition keys is stored independently,\\ + on a different set of nodes\\ + \vspace{.5em} + $\to$ no easy way to list all partition keys\\ + $\to$ no cross-shard transactions\\ + \vspace{2em} + \item Placing data: hash the partition key, select nodes accordingly\\ + \vspace{.5em} + $\to$ distributed hash table (DHT) + \vspace{2em} + \item For a given value of the partition key, items can be listed using their sort keys + \end{itemize} +\end{frame} + + +\begin{frame} + \frametitle{Issues with consistent hashing} + \begin{itemize} + \item Consistent hashing doesn't dispatch data based on geographical location of nodes + \vspace{1em} + \item<2-> Geographically aware adaptation, try 1:\\ + data quantities not well balanced between nodes + \vspace{1em} + \item<3-> Geographically aware adaptation, try 2:\\ + too many reshuffles when adding/removing nodes + \end{itemize} +\end{frame} + + +\section{Problem 2: ensuring consistency} + +\begin{frame} + \frametitle{Consensus vs weak consistency} + + \hspace{1em} + \begin{minipage}{7cm} + \textbf{Consensus-based systems:} + \vspace{1em} + \begin{itemize} + \item \textbf{Leader-based:} a leader is elected to coordinate + all reads and writes + \vspace{1em} + \item \textbf{Linearizability} of all operations\\ + (strongest consistency guarantee) + \vspace{1em} + \item Any sequential specification can be implemented as a \textbf{replicated state machine} + \vspace{1em} + \item \textbf{Costly}, the leader is a bottleneck; + leader elections on failure take time + \end{itemize} + \end{minipage} + \hfill + \begin{minipage}{7cm} \visible<2->{ + \textbf{Weakly consistent systems:} + \vspace{1em} + \begin{itemize} + \item \textbf{Nodes are equivalent}, any node + can originate a read or write operation + \vspace{1em} + \item \textbf{Read-after-write consistency} with quorums, + eventual consistency without + \vspace{1em} + \item \textbf{Operations have to commute}, i.e.~we + can only implement CRDTs + \vspace{1em} + \item \textbf{Fast}, no single bottleneck;\\ + works the same with offline nodes + \end{itemize} + } \end{minipage} + \hspace{1em} +\end{frame} + +\begin{frame} + \frametitle{Consensus vs weak consistency} + \begin{center} + \textbf{From a theoretical point of view:}\\ + + \end{center} + \vspace{2em} + + \hspace{1em} + \begin{minipage}{6.5cm} + \underline{Consensus-based systems:} + + \vspace{1em} + + Require \textbf{additional assumptions} such as a fault detector or a strong RNG\\ + (FLP impossibility theorem) + \end{minipage} + \hfill + \begin{minipage}{6.5cm} + \underline{Weakly consistent systems:} + + \vspace{1em} + + Can be implemented in \textbf{any\\asynchronous message passing\\distributed system} with node crashes + \end{minipage} + \hspace{1em} + + \vspace{3em} + \begin{center} + They represent \textbf{different classes of computational capability}\\ + \end{center} +\end{frame} + +\begin{frame} + \frametitle{Consensus vs weak consistency} + \begin{center} + \textbf{The same objects cannot be implemented in both models.} + \end{center} + \vspace{2em} + + \hspace{1em} + \begin{minipage}{6.5cm} + \underline{Consensus-based systems:} + + \vspace{1em} + + \textbf{Any sequential specification}\\~ + + \vspace{1em} + \textbf{Easier to program for}: just write your program as if it were sequential on a single machine + + \end{minipage} + \hfill + \begin{minipage}{6.5cm} + \underline{Weakly consistent systems:} + + \vspace{1em} + + \textbf{Only CRDTs}\\(conflict-free replicated data types) + + \vspace{1em} + Part of the complexity is \textbf{reported to the consumer of the API}\\~ + \end{minipage} + \hspace{1em} +\end{frame} + +\begin{frame} + \frametitle{Understanding the power of consensus} + \textbf{Consensus:} an API with a single operation, $propose(x)$ + \begin{enumerate} + \item nodes all call $propose(x)$ with their proposed value; + \item nodes all receive the same value as a return value, which is one of the proposed values + \end{enumerate} + \vspace{1em} + + \visible<2->{ + \textbf{Equivalent to} a distributed algorithm that gives a total order on all requests + } + \vspace{1em} + + \visible<3->{ + \textbf{Implemented by} this simple replicated state machine: + \vspace{.5em} + \begin{figure} + \centering + \def\svgwidth{.5\textwidth} + \large + \import{assets/}{consensus.pdf_tex} + \end{figure} + \vspace{1em} + } +\end{frame} + +\begin{frame} + \frametitle{Can my object be implemented without consensus?} + \underline{Given the specification of an API:} + \vspace{2em} + \begin{itemize} + \item \textbf{Using this API, we can implement the consensus object} (the $propose$ function)\\ + $\to$ the API is equivalent to consensus/total ordering of messages\\ + $\to$ the API cannot be implemented in a weakly consistent system + \vspace{2em} + \item<2-> \textbf{This API can be implemented using only weak primitives}\\ + (e.g. in the asynchronous message passing model with no further assumption)\\ + $\to$ the API is strictly weaker than consensus\\ + $\to$ we can implement it in Garage! + \end{itemize} +\end{frame} + + +\begin{frame} + \frametitle{What can we implement without consensus?} + \begin{itemize} + \item Any \textbf{conflict-free replicated data type} (CRDT) + \vspace{1em} + \item<2-> Non-transactional key-value stores such as S3 are equivalent to a simple CRDT:\\ + a map of \textbf{last-writer-wins registers} (each key is its own CRDT) + \vspace{1em} + \item<3-> \textbf{Read-after-write consistency} can be implemented + using quorums on read and write operations + \vspace{1em} + \item<4-> \textbf{Monotonicity of reads} can be implemented with repair-on-read\\ + (makes reads more costly, not implemented in Garage) + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{CRDTs and quorums: read-after-write consistency} + \begin{figure} + \centering + \def\svgwidth{.8\textwidth} + \only<1>{\import{assets/}{lattice1.pdf_tex}}% + \only<2>{\import{assets/}{lattice2.pdf_tex}}% + \only<3>{\import{assets/}{lattice3.pdf_tex}}% + \only<4>{\import{assets/}{lattice4.pdf_tex}}% + \only<5>{\import{assets/}{lattice5.pdf_tex}}% + \only<6>{\import{assets/}{lattice6.pdf_tex}}% + \only<7>{\import{assets/}{lattice7.pdf_tex}}% + \only<8>{\import{assets/}{lattice8.pdf_tex}}% + \end{figure} +\end{frame} + +\begin{frame} + \frametitle{CRDTs and quorums: read-after-write consistency} + \textbf{Property:} If node $A$ did an operation $write(x)$ and received an OK response,\\ + \hspace{2cm} and node $B$ starts an operation $read()$ after $A$ received OK,\\ + \hspace{2cm} then $B$ will read a value $x' \sqsupseteq x$. + + \vspace{1em} + + \hspace{1em} + \begin{minipage}{6.8cm} + \textbf{Algorithm $write(x)$:} + \begin{enumerate} + \item Broadcast $write(x)$ to all nodes + \item Wait for $k > n/2$ nodes to reply OK + \item Return OK + \end{enumerate} + \end{minipage} + \hfill + \begin{minipage}{6.8cm} + \vspace{1em} + \textbf{Algorithm $read()$:} + \begin{enumerate} + \item Broadcast $read()$ to all nodes + \item Wait for $k > n/2$ nodes to reply\\ + with values $x_1, \dots, x_k$ + \item Return $x_1 \sqcup \dots \sqcup x_k$ + \end{enumerate} + \end{minipage} + \hspace{1em} + + \vspace{2em} + \textbf{Why does it work?} There is at least one node at the intersection between the two sets of nodes that replied to each request, that ``saw'' $x$ before the $read()$ started ($x_i \sqsupseteq x$). +\end{frame} + +\begin{frame} + \frametitle{CRDTs and quorums: monotonic-reads consistency} + \begin{figure} + \centering + \def\svgwidth{.8\textwidth} + \only<1>{\import{assets/}{latticeB_1.pdf_tex}}% + \only<2>{\import{assets/}{latticeB_2.pdf_tex}}% + \only<3>{\import{assets/}{latticeB_3.pdf_tex}}% + \only<4>{\import{assets/}{latticeB_4.pdf_tex}}% + \only<5>{\import{assets/}{latticeB_5.pdf_tex}}% + \only<6>{\import{assets/}{latticeB_6.pdf_tex}}% + \only<7>{\import{assets/}{latticeB_7.pdf_tex}}% + \only<8>{\import{assets/}{latticeB_8.pdf_tex}}% + \only<9>{\import{assets/}{latticeB_9.pdf_tex}}% + \only<10>{\import{assets/}{latticeB_10.pdf_tex}}% + \end{figure} +\end{frame} + +\begin{frame} + \frametitle{CRDTs and quorums: monotonic-reads consistency} + \textbf{Property:} If node $A$ did an operation $read()$ and received $x$ as a response,\\ + \hspace{2cm} and node $B$ starts an operation $read()$ after $A$ received $x$,\\ + \hspace{2cm} then $B$ will read a value $x' \sqsupseteq x$. + + \vspace{1em} + + \textbf{Algorithm $monotonic\_read()$:} {\small (a.k.a. repair-on-read)} + \begin{enumerate} + \item Broadcast $read()$ to all nodes + \item Wait for $k > n/2$ nodes to reply with values $x_1, \dots, x_k$ + \item If $x_i \ne x_j$ for some nodes $i$ and $j$,\\ + \hspace{1cm}then call $write(x_1 \sqcup \dots \sqcup x_k)$ and wait for OK from $k' > n/2$ nodes + \item Return $x_1 \sqcup \dots \sqcup x_k$ + \end{enumerate} + + \vspace{1em} + + This makes reads slower in some cases, and is \textbf{not implemented in Garage}. +\end{frame} + +\begin{frame} + \frametitle{A hard problem: layout changes} + \begin{itemize} + \item We rely on quorums $k > n/2$ within each partition:\\ + $$n=3,~~~~~~~k\ge 2$$ + \item<2-> When rebalancing, the set of nodes responsible for a partition can change:\\ + $$\{n_A, n_B, n_C\} \to \{n_A, n_D, n_E\}$$ + \vspace{.01em} + \item<3-> During the rebalancing, $D$ and $E$ don't yet have the data,\\ + ~~~~~~~~~~~~~~~~~~~and $B$ and $C$ want to get rid of the data to free up space\\ + \vspace{.2em} + $\to$ quorums only within the new set of nodes don't work\\ + $\to$ how to coordinate? \textbf{currently, we don't...} + + \end{itemize} +\end{frame} + +\section{Operating big Garage clusters} + +\begin{frame} + \frametitle{Operating Garage} + \begin{center} + \only<1-2>{ + \includegraphics[width=.9\linewidth]{assets/scr_garage_status.png} + \\\vspace{1em} + \visible<2>{\includegraphics[width=.85\linewidth]{assets/scr_garage_status_broken.png}} + } + \end{center} +\end{frame} + +\begin{frame} + \frametitle{Garage's architecture} + \begin{center} + \only<1>{\includegraphics[width=.45\linewidth]{assets/garage.drawio.pdf}}% + \only<2>{\includegraphics[width=.6\linewidth]{assets/garage_sync.drawio.pdf}}% + \end{center} +\end{frame} + +\begin{frame} + \frametitle{Digging deeper} + \begin{center} + \only<1>{\includegraphics[width=.9\linewidth]{assets/scr_garage_stats.png}} + \only<2>{\includegraphics[width=.6\linewidth]{assets/scr_garage_worker_list.png}} + \only<3>{\includegraphics[width=.6\linewidth]{assets/scr_garage_worker_get.png}} + \end{center} +\end{frame} + +\begin{frame} + \frametitle{Potential limitations and bottlenecks} + \begin{itemize} + \item Global: + \begin{itemize} + \item Max. $\sim$100 nodes per cluster (excluding gateways) + \end{itemize} + \vspace{1em} + \item Metadata: + \begin{itemize} + \item One big bucket = bottleneck, object list on 3 nodes only + \end{itemize} + \vspace{1em} + \item Block manager: + \begin{itemize} + \item Lots of small files on disk + \item Processing the resync queue can be slow + \item Multi-HDD support not yet released (soon!) + \end{itemize} + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Deployment advice for very large clusters} + \begin{itemize} + \item Metadata storage: + \begin{itemize} + \item ZFS mirror (x2) on fast NVMe + \item Use LMDB storage engine + \end{itemize} + \vspace{.5em} + \item Data block storage: + \begin{itemize} + \item Wait for v0.9 with multi-HDD support + \item XFS on individual drives + \item Increase block size (1MB $\to$ 10MB, requires more RAM and good networking) + \item Tune \texttt{resync-tranquility} and \texttt{resync-worker-count} dynamically + \end{itemize} + \vspace{.5em} + \item Other : + \begin{itemize} + \item Split data over several buckets + \item Use less than 100 storage nodes + \item Use gateway nodes + \end{itemize} + \vspace{.5em} + \end{itemize} + Current deployments: $< 10$ TB, we don't have much experience with more +\end{frame} + +\section{Going further than the S3 API} + +\begin{frame} + \frametitle{Using Garage for everything} + \begin{center} + \only<1>{\includegraphics[width=.8\linewidth]{assets/slideB1.png}}% + \only<2>{\includegraphics[width=.8\linewidth]{assets/slideB2.png}}% + \only<3>{\includegraphics[width=.8\linewidth]{assets/slideB3.png}}% + \end{center} +\end{frame} + +\begin{frame} + \frametitle{K2V Design} + \begin{itemize} + \item A new, custom, minimal API\\ + \vspace{.5em} + \begin{itemize} + \item Single-item operations + \item Operations on ranges and batches of items + \item Polling operations to help implement a PubSub pattern + \end{itemize} + \vspace{1em} + \item<2-> Exposes the partitoning mechanism of Garage\\ + K2V = partition key / sort key / value (like Dynamo) + \vspace{1em} + \item<3-> Weakly consistent, CRDT-friendly\\ + $\to$ no support for transactions (not ACID) + \vspace{1em} + \item<4-> Cryptography-friendly: values are binary blobs + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Handling concurrent values} + \textbf{How to handle concurrency?} Example: + \vspace{1em} + \begin{enumerate} + \item Client $A$ reads the initial value of a key, $x_0$ + \vspace{1em} + \item<2-> Client $B$ also reads the initial value $x_0$ of that key + \vspace{1em} + \item<3-> Client $A$ modifies $x_0$, and writes a new value $x_1$ + \vspace{1em} + \item<4-> Client $B$ also modifies $x_0$, and writes a new value $x'_1$,\\ + without having a chance to first read $x_1$\\ + \vspace{1em} + $\to$ what should the final state be? + \end{enumerate} +\end{frame} + +\begin{frame} + \frametitle{Handling concurrent values} + \begin{itemize} + \item If we keep only $x_1$ or $x'_1$, we risk \textbf{loosing application data} + \vspace{1.5em} + \item<2-> Values are opaque binary blobs, \textbf{K2V cannot resolve conflicts} by itself\\ + (e.g. by implementing a CRDT) + \vspace{1.5em} + \item<3-> Solution: \textbf{we keep both!}\\ + $\to$ the value of the key is now $\{x_1, x'_1\}$\\ + $\to$ the client application can decide how to resolve conflicts on the next read + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Keeping track of causality} + How does K2V know that $x_1$ and $x'_1$ are concurrent? + \vspace{1em} + \begin{itemize} + \item $read()$ returns \textbf{a set of values} and an associated \textbf{causality token}\\ + \vspace{1.5em} + \item<2-> When calling $write()$, the client sends \textbf{the causality token from its last read} + \vspace{1.5em} + \item<3-> The causality token represents the set of values \textbf{already seen by the client}\\ + $\to$ those values are the \textbf{causal past} of the write operation\\ + $\to$ K2V can keep concurrent values and overwrite all ones in the causal past + \vspace{1.5em} + \item<4-> Internally, the causality token is \textbf{a vector clock} + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Application: an e-mail storage server} + \begin{center} + \only<1>{\includegraphics[width=.9\linewidth]{assets/aerogramme.png}}% + \end{center} +\end{frame} + +\begin{frame} + \frametitle{Aerogramme data model} + \begin{center} + \only<1->{\includegraphics[width=.4\linewidth]{assets/aerogramme_datatype.drawio.pdf}}% + \end{center} + \visible<2->{Aerogramme encrypts all stored values for privacy\\ + (Garage server administrators can't read your mail)} +\end{frame} + +\begin{frame} + \frametitle{Different deployment scenarios} + \begin{center} + \only<1>{\includegraphics[width=.9\linewidth]{assets/aerogramme_components1.drawio.pdf}}% + \only<2>{\includegraphics[width=.9\linewidth]{assets/aerogramme_components2.drawio.pdf}}% + \end{center} +\end{frame} + +\begin{frame} + \frametitle{A new model for building resilient software} + How to build an application using only Garage as a data store: + \vspace{1em} + \begin{enumerate} + \item Design a data model suited to K2V\\ + {\footnotesize (see Cassandra docs on porting SQL data models to Cassandra)} + \vspace{1em} + \begin{itemize} + \item Use CRDTs or other eventually consistent data types (see e.g. Bayou) + \vspace{1em} + \item Store opaque binary blobs to provide End-to-End Encryption\\ + \end{itemize} + \vspace{1em} + \item<2-> Store big blobs (files) using the S3 API + \vspace{1em} + \item<3-> Let Garage manage sharding, replication, failover, etc. + \end{enumerate} +\end{frame} + +\section{Conclusion} + +\begin{frame} + \frametitle{Perspectives} + \begin{itemize} + \item Fix the consistency issue when rebalancing + \vspace{1em} + \item Write about Garage's architecture and properties,\\ + and about our proposed architecture for (E2EE) apps over K2V+S3 + \vspace{1em} + \item Continue developing Garage; finish Aerogramme; build new applications... + \vspace{1em} + \item Anything else? + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Where to find us} + \begin{center} + \includegraphics[width=.25\linewidth]{../../logo/garage_hires.png}\\ + \vspace{-1em} + \url{https://garagehq.deuxfleurs.fr/}\\ + \url{mailto:garagehq@deuxfleurs.fr}\\ + \texttt{\#garage:deuxfleurs.fr} on Matrix + + \vspace{1.5em} + \includegraphics[width=.06\linewidth]{assets/rust_logo.png} + \includegraphics[width=.13\linewidth]{assets/AGPLv3_Logo.png} + \end{center} +\end{frame} + +\end{document} + +%% vim: set ts=4 sw=4 tw=0 noet spelllang=en : diff --git a/doc/talks/assets/.gitignore b/doc/talks/assets/.gitignore index e483c28f..26848b92 100644 --- a/doc/talks/assets/.gitignore +++ b/doc/talks/assets/.gitignore @@ -1,2 +1,6 @@ # Files that are auto-generated when building pdfs deuxfleurs.pdf +timeline-22-24.pdf + +# tmp files generated by krita +*~ diff --git a/doc/talks/assets/Amazon-S3.jpg b/doc/talks/assets/Amazon-S3.jpg new file mode 100644 index 00000000..a9501973 Binary files /dev/null and b/doc/talks/assets/Amazon-S3.jpg differ diff --git a/doc/talks/assets/NGI0Entrust_tag.png b/doc/talks/assets/NGI0Entrust_tag.png new file mode 100644 index 00000000..064c4aee Binary files /dev/null and b/doc/talks/assets/NGI0Entrust_tag.png differ diff --git a/doc/talks/assets/NGI0Entrust_tag.svg b/doc/talks/assets/NGI0Entrust_tag.svg new file mode 100644 index 00000000..ca0d2814 --- /dev/null +++ b/doc/talks/assets/NGI0Entrust_tag.svg @@ -0,0 +1,149 @@ + + + +image/svg+xml + + + + + + +NGI Zero Entrust + + + + diff --git a/doc/talks/assets/capitole_du_libre.png b/doc/talks/assets/capitole_du_libre.png new file mode 100644 index 00000000..eaa521af Binary files /dev/null and b/doc/talks/assets/capitole_du_libre.png differ diff --git a/doc/talks/assets/db_engine.png b/doc/talks/assets/db_engine.png new file mode 100644 index 00000000..b1124b04 Binary files /dev/null and b/doc/talks/assets/db_engine.png differ diff --git a/doc/talks/assets/endpoint_latency_0.7_0.8_minio.png b/doc/talks/assets/endpoint_latency_0.7_0.8_minio.png new file mode 100644 index 00000000..92eac3fb Binary files /dev/null and b/doc/talks/assets/endpoint_latency_0.7_0.8_minio.png differ diff --git a/doc/talks/assets/fosdem22.png b/doc/talks/assets/fosdem22.png new file mode 100644 index 00000000..17332e4b Binary files /dev/null and b/doc/talks/assets/fosdem22.png differ diff --git a/doc/talks/assets/fosdem24.png b/doc/talks/assets/fosdem24.png new file mode 100644 index 00000000..11631695 Binary files /dev/null and b/doc/talks/assets/fosdem24.png differ diff --git a/doc/talks/assets/geodistrib_paper.png b/doc/talks/assets/geodistrib_paper.png new file mode 100644 index 00000000..318d8e55 Binary files /dev/null and b/doc/talks/assets/geodistrib_paper.png differ diff --git a/doc/talks/assets/grafana_dashboard.png b/doc/talks/assets/grafana_dashboard.png new file mode 100644 index 00000000..2df1fc41 Binary files /dev/null and b/doc/talks/assets/grafana_dashboard.png differ diff --git a/doc/talks/assets/io-0.7-0.8-minio.png b/doc/talks/assets/io-0.7-0.8-minio.png new file mode 100644 index 00000000..f581a22e Binary files /dev/null and b/doc/talks/assets/io-0.7-0.8-minio.png differ diff --git a/doc/talks/assets/jaeger_listobjects.png b/doc/talks/assets/jaeger_listobjects.png new file mode 100644 index 00000000..ab7d68f4 Binary files /dev/null and b/doc/talks/assets/jaeger_listobjects.png differ diff --git a/doc/talks/assets/jaeger_putobject.png b/doc/talks/assets/jaeger_putobject.png new file mode 100644 index 00000000..7966275e Binary files /dev/null and b/doc/talks/assets/jaeger_putobject.png differ diff --git a/doc/talks/assets/jdll.png b/doc/talks/assets/jdll.png new file mode 100644 index 00000000..a7cbe091 Binary files /dev/null and b/doc/talks/assets/jdll.png differ diff --git a/doc/talks/assets/location-aware.png b/doc/talks/assets/location-aware.png new file mode 100644 index 00000000..f5966865 Binary files /dev/null and b/doc/talks/assets/location-aware.png differ diff --git a/doc/talks/assets/ngi-pointer.png b/doc/talks/assets/ngi-pointer.png new file mode 100644 index 00000000..730ececa Binary files /dev/null and b/doc/talks/assets/ngi-pointer.png differ diff --git a/doc/talks/assets/nlnet.svg b/doc/talks/assets/nlnet.svg new file mode 100644 index 00000000..373c8d8f --- /dev/null +++ b/doc/talks/assets/nlnet.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/talks/assets/pses.png b/doc/talks/assets/pses.png new file mode 100644 index 00000000..da871f83 Binary files /dev/null and b/doc/talks/assets/pses.png differ diff --git a/doc/talks/assets/schema-streaming-1.png b/doc/talks/assets/schema-streaming-1.png new file mode 100644 index 00000000..4113f030 Binary files /dev/null and b/doc/talks/assets/schema-streaming-1.png differ diff --git a/doc/talks/assets/schema-streaming-2.png b/doc/talks/assets/schema-streaming-2.png new file mode 100644 index 00000000..2f97bb33 Binary files /dev/null and b/doc/talks/assets/schema-streaming-2.png differ diff --git a/doc/talks/assets/schema-streaming.png b/doc/talks/assets/schema-streaming.png new file mode 100644 index 00000000..3b24d910 Binary files /dev/null and b/doc/talks/assets/schema-streaming.png differ diff --git a/doc/talks/assets/timeline-22-24.svg b/doc/talks/assets/timeline-22-24.svg new file mode 100644 index 00000000..90fe5de4 --- /dev/null +++ b/doc/talks/assets/timeline-22-24.svg @@ -0,0 +1,327 @@ + + + +Feb 6, 2022Feb 3, 2024v0.6.0Feb 2, 2022v0.7.0Apr 8, 2022v0.8.0Nov 21, 2022v0.9.0Oct 10, 2023v0.10.0 betaTowards v1.0 ?Apr/May, 2024Nov 19, 2022Apr 1, 2023PSESJun 6, 2023 diff --git a/doc/talks/assets/ttfb.png b/doc/talks/assets/ttfb.png new file mode 100644 index 00000000..c0335bd9 Binary files /dev/null and b/doc/talks/assets/ttfb.png differ -- cgit v1.2.3 From c2541f280c0b267bbaf71702b2966c91a4c5105b Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Tue, 23 Jan 2024 16:50:30 +0100 Subject: [talk-fosdem-24] WIP, write talk, modify lots of assets --- doc/talks/2024-02-03-fosdem/Makefile | 29 +- doc/talks/2024-02-03-fosdem/assets/AGPLv3_Logo.png | Bin 32497 -> 0 bytes doc/talks/2024-02-03-fosdem/assets/aerogramme.png | Bin 117865 -> 0 bytes doc/talks/2024-02-03-fosdem/assets/aerogramme.svg | 1241 ------ .../assets/aerogramme_components1.drawio.pdf | Bin 31966 -> 0 bytes .../assets/aerogramme_components1.png | Bin 26898 -> 0 bytes .../assets/aerogramme_components2.drawio.pdf | Bin 31688 -> 0 bytes .../assets/aerogramme_components2.png | Bin 27405 -> 0 bytes .../assets/aerogramme_datatype.drawio.pdf | Bin 31073 -> 0 bytes .../assets/aerogramme_datatype.png | Bin 9090 -> 0 bytes .../assets/aerogramme_keys.drawio.pdf | Bin 25145 -> 0 bytes .../2024-02-03-fosdem/assets/aerogramme_keys.png | Bin 17869 -> 0 bytes .../2024-02-03-fosdem/assets/compatibility.png | Bin 84505 -> 0 bytes doc/talks/2024-02-03-fosdem/assets/consensus.svg | 137 - .../2024-02-03-fosdem/assets/garage.drawio.pdf | Bin 26098 -> 0 bytes .../2024-02-03-fosdem/assets/garage.drawio.png | Bin 13463 -> 0 bytes .../assets/garage_sync.drawio.pdf | Bin 34372 -> 0 bytes .../assets/garage_sync.drawio.png | Bin 31184 -> 0 bytes doc/talks/2024-02-03-fosdem/assets/lattice1.svg | 433 -- doc/talks/2024-02-03-fosdem/assets/lattice2.svg | 514 --- doc/talks/2024-02-03-fosdem/assets/lattice3.svg | 515 --- doc/talks/2024-02-03-fosdem/assets/lattice4.svg | 525 --- doc/talks/2024-02-03-fosdem/assets/lattice5.svg | 536 --- doc/talks/2024-02-03-fosdem/assets/lattice6.svg | 553 --- doc/talks/2024-02-03-fosdem/assets/lattice7.svg | 581 --- doc/talks/2024-02-03-fosdem/assets/lattice8.svg | 581 --- doc/talks/2024-02-03-fosdem/assets/latticeB_1.svg | 576 --- doc/talks/2024-02-03-fosdem/assets/latticeB_10.svg | 715 ---- doc/talks/2024-02-03-fosdem/assets/latticeB_2.svg | 576 --- doc/talks/2024-02-03-fosdem/assets/latticeB_3.svg | 576 --- doc/talks/2024-02-03-fosdem/assets/latticeB_4.svg | 587 --- doc/talks/2024-02-03-fosdem/assets/latticeB_5.svg | 604 --- doc/talks/2024-02-03-fosdem/assets/latticeB_6.svg | 632 --- doc/talks/2024-02-03-fosdem/assets/latticeB_7.svg | 654 --- doc/talks/2024-02-03-fosdem/assets/latticeB_8.svg | 671 --- doc/talks/2024-02-03-fosdem/assets/latticeB_9.svg | 699 ---- doc/talks/2024-02-03-fosdem/assets/rust_logo.png | Bin 14835 -> 0 bytes .../2024-02-03-fosdem/assets/scr_garage_stats.png | Bin 133013 -> 0 bytes .../2024-02-03-fosdem/assets/scr_garage_status.png | Bin 75685 -> 0 bytes .../assets/scr_garage_status_broken.png | Bin 54964 -> 0 bytes .../assets/scr_garage_worker_get.png | Bin 76007 -> 0 bytes .../assets/scr_garage_worker_list.png | Bin 115654 -> 0 bytes doc/talks/2024-02-03-fosdem/assets/slideB1.png | Bin 86072 -> 0 bytes doc/talks/2024-02-03-fosdem/assets/slideB2.png | Bin 83399 -> 0 bytes doc/talks/2024-02-03-fosdem/assets/slideB3.png | Bin 82581 -> 0 bytes doc/talks/2024-02-03-fosdem/assets/slides.svg | 4326 -------------------- doc/talks/2024-02-03-fosdem/assets/slidesB.svg | 444 -- doc/talks/2024-02-03-fosdem/talk.pdf | Bin 3919347 -> 4034990 bytes doc/talks/2024-02-03-fosdem/talk.tex | 844 +--- doc/talks/assets/.gitignore | 2 + doc/talks/assets/AGPLv3_Logo.png | Bin 32497 -> 0 bytes doc/talks/assets/Amazon-S3.jpg | Bin 45617 -> 0 bytes doc/talks/assets/NGI0Entrust_tag.png | Bin 78466 -> 0 bytes doc/talks/assets/NGI0Entrust_tag.svg | 149 - doc/talks/assets/capitole_du_libre.png | Bin 30578 -> 0 bytes doc/talks/assets/db_engine.png | Bin 181046 -> 0 bytes doc/talks/assets/deuxfleurs.svg | 91 - .../assets/endpoint_latency_0.7_0.8_minio.png | Bin 147625 -> 0 bytes doc/talks/assets/fosdem22.png | Bin 7383 -> 0 bytes doc/talks/assets/fosdem24.png | Bin 7819 -> 0 bytes doc/talks/assets/garage.drawio.pdf | Bin 0 -> 26098 bytes doc/talks/assets/garage.drawio.png | Bin 0 -> 13463 bytes doc/talks/assets/garage_sync.drawio.pdf | Bin 0 -> 34372 bytes doc/talks/assets/garage_sync.drawio.png | Bin 0 -> 31184 bytes doc/talks/assets/grafana_dashboard.png | Bin 468890 -> 0 bytes doc/talks/assets/io-0.7-0.8-minio.png | Bin 193869 -> 0 bytes doc/talks/assets/jaeger_listobjects.png | Bin 125264 -> 0 bytes doc/talks/assets/jaeger_putobject.png | Bin 139900 -> 0 bytes doc/talks/assets/jdll.png | Bin 10348 -> 0 bytes doc/talks/assets/jepsen-0.10.png | Bin 0 -> 354133 bytes doc/talks/assets/jepsen-0.9.png | Bin 0 -> 358576 bytes doc/talks/assets/lattice/lattice1.svg | 433 ++ doc/talks/assets/lattice/lattice2.svg | 514 +++ doc/talks/assets/lattice/lattice3.svg | 515 +++ doc/talks/assets/lattice/lattice4.svg | 525 +++ doc/talks/assets/lattice/lattice5.svg | 536 +++ doc/talks/assets/lattice/lattice6.svg | 553 +++ doc/talks/assets/lattice/lattice7.svg | 581 +++ doc/talks/assets/lattice/lattice8.svg | 581 +++ doc/talks/assets/location-aware.png | Bin 99269 -> 0 bytes doc/talks/assets/logo_chatons.png | Bin 203533 -> 0 bytes doc/talks/assets/logos/AGPLv3_Logo.png | Bin 0 -> 32497 bytes doc/talks/assets/logos/Amazon-S3.jpg | Bin 0 -> 45617 bytes doc/talks/assets/logos/NGI0Entrust_tag.png | Bin 0 -> 78466 bytes doc/talks/assets/logos/NGI0Entrust_tag.svg | 149 + doc/talks/assets/logos/capitole_du_libre.png | Bin 0 -> 30578 bytes doc/talks/assets/logos/deuxfleurs.svg | 91 + doc/talks/assets/logos/fosdem22.png | Bin 0 -> 7383 bytes doc/talks/assets/logos/fosdem24.png | Bin 0 -> 7819 bytes doc/talks/assets/logos/jdll.png | Bin 0 -> 10348 bytes doc/talks/assets/logos/logo_chatons.png | Bin 0 -> 203533 bytes doc/talks/assets/logos/minio.png | Bin 0 -> 13497 bytes doc/talks/assets/logos/ngi-pointer.png | Bin 0 -> 21593 bytes doc/talks/assets/logos/nlnet.svg | 34 + doc/talks/assets/logos/pses.png | Bin 0 -> 22379 bytes doc/talks/assets/logos/rust_logo.png | Bin 0 -> 14835 bytes doc/talks/assets/minio.png | Bin 13497 -> 0 bytes doc/talks/assets/ngi-pointer.png | Bin 21593 -> 0 bytes doc/talks/assets/nlnet.svg | 34 - doc/talks/assets/perf/db_engine.png | Bin 0 -> 181046 bytes .../assets/perf/endpoint_latency_0.7_0.8_minio.png | Bin 0 -> 147625 bytes doc/talks/assets/perf/io-0.7-0.8-minio.png | Bin 0 -> 193869 bytes doc/talks/assets/perf/ttfb.png | Bin 0 -> 131548 bytes doc/talks/assets/pses.png | Bin 22379 -> 0 bytes doc/talks/assets/rust_logo.png | Bin 14835 -> 0 bytes doc/talks/assets/screenshots/garage_stats_0.10.png | Bin 0 -> 129997 bytes .../assets/screenshots/garage_status_0.10.png | Bin 0 -> 50443 bytes .../assets/screenshots/garage_status_0.9_prod.png | Bin 0 -> 83731 bytes .../screenshots/garage_status_0.9_prod_zonehl.png | Bin 0 -> 74423 bytes .../screenshots/garage_status_unhealthy_0.10.png | Bin 0 -> 58585 bytes .../assets/screenshots/garage_worker_list_0.10.png | Bin 0 -> 192119 bytes .../screenshots/garage_worker_param_0.10.png | Bin 0 -> 68383 bytes doc/talks/assets/screenshots/grafana_dashboard.png | Bin 0 -> 468890 bytes .../assets/screenshots/jaeger_listobjects.png | Bin 0 -> 125264 bytes doc/talks/assets/screenshots/jaeger_putobject.png | Bin 0 -> 139900 bytes doc/talks/assets/ttfb.png | Bin 131548 -> 0 bytes doc/talks/shell.nix | 2 +- 117 files changed, 4751 insertions(+), 17588 deletions(-) delete mode 100644 doc/talks/2024-02-03-fosdem/assets/AGPLv3_Logo.png delete mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme.png delete mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme_components1.drawio.pdf delete mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme_components1.png delete mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme_components2.drawio.pdf delete mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme_components2.png delete mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme_datatype.drawio.pdf delete mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme_datatype.png delete mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme_keys.drawio.pdf delete mode 100644 doc/talks/2024-02-03-fosdem/assets/aerogramme_keys.png delete mode 100644 doc/talks/2024-02-03-fosdem/assets/compatibility.png delete mode 100644 doc/talks/2024-02-03-fosdem/assets/consensus.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/garage.drawio.pdf delete mode 100644 doc/talks/2024-02-03-fosdem/assets/garage.drawio.png delete mode 100644 doc/talks/2024-02-03-fosdem/assets/garage_sync.drawio.pdf delete mode 100644 doc/talks/2024-02-03-fosdem/assets/garage_sync.drawio.png delete mode 100644 doc/talks/2024-02-03-fosdem/assets/lattice1.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/lattice2.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/lattice3.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/lattice4.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/lattice5.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/lattice6.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/lattice7.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/lattice8.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_1.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_10.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_2.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_3.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_4.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_5.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_6.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_7.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_8.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/latticeB_9.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/rust_logo.png delete mode 100644 doc/talks/2024-02-03-fosdem/assets/scr_garage_stats.png delete mode 100644 doc/talks/2024-02-03-fosdem/assets/scr_garage_status.png delete mode 100644 doc/talks/2024-02-03-fosdem/assets/scr_garage_status_broken.png delete mode 100644 doc/talks/2024-02-03-fosdem/assets/scr_garage_worker_get.png delete mode 100644 doc/talks/2024-02-03-fosdem/assets/scr_garage_worker_list.png delete mode 100644 doc/talks/2024-02-03-fosdem/assets/slideB1.png delete mode 100644 doc/talks/2024-02-03-fosdem/assets/slideB2.png delete mode 100644 doc/talks/2024-02-03-fosdem/assets/slideB3.png delete mode 100644 doc/talks/2024-02-03-fosdem/assets/slides.svg delete mode 100644 doc/talks/2024-02-03-fosdem/assets/slidesB.svg delete mode 100644 doc/talks/assets/AGPLv3_Logo.png delete mode 100644 doc/talks/assets/Amazon-S3.jpg delete mode 100644 doc/talks/assets/NGI0Entrust_tag.png delete mode 100644 doc/talks/assets/NGI0Entrust_tag.svg delete mode 100644 doc/talks/assets/capitole_du_libre.png delete mode 100644 doc/talks/assets/db_engine.png delete mode 100644 doc/talks/assets/deuxfleurs.svg delete mode 100644 doc/talks/assets/endpoint_latency_0.7_0.8_minio.png delete mode 100644 doc/talks/assets/fosdem22.png delete mode 100644 doc/talks/assets/fosdem24.png create mode 100644 doc/talks/assets/garage.drawio.pdf create mode 100644 doc/talks/assets/garage.drawio.png create mode 100644 doc/talks/assets/garage_sync.drawio.pdf create mode 100644 doc/talks/assets/garage_sync.drawio.png delete mode 100644 doc/talks/assets/grafana_dashboard.png delete mode 100644 doc/talks/assets/io-0.7-0.8-minio.png delete mode 100644 doc/talks/assets/jaeger_listobjects.png delete mode 100644 doc/talks/assets/jaeger_putobject.png delete mode 100644 doc/talks/assets/jdll.png create mode 100644 doc/talks/assets/jepsen-0.10.png create mode 100644 doc/talks/assets/jepsen-0.9.png create mode 100644 doc/talks/assets/lattice/lattice1.svg create mode 100644 doc/talks/assets/lattice/lattice2.svg create mode 100644 doc/talks/assets/lattice/lattice3.svg create mode 100644 doc/talks/assets/lattice/lattice4.svg create mode 100644 doc/talks/assets/lattice/lattice5.svg create mode 100644 doc/talks/assets/lattice/lattice6.svg create mode 100644 doc/talks/assets/lattice/lattice7.svg create mode 100644 doc/talks/assets/lattice/lattice8.svg delete mode 100644 doc/talks/assets/location-aware.png delete mode 100644 doc/talks/assets/logo_chatons.png create mode 100644 doc/talks/assets/logos/AGPLv3_Logo.png create mode 100644 doc/talks/assets/logos/Amazon-S3.jpg create mode 100644 doc/talks/assets/logos/NGI0Entrust_tag.png create mode 100644 doc/talks/assets/logos/NGI0Entrust_tag.svg create mode 100644 doc/talks/assets/logos/capitole_du_libre.png create mode 100644 doc/talks/assets/logos/deuxfleurs.svg create mode 100644 doc/talks/assets/logos/fosdem22.png create mode 100644 doc/talks/assets/logos/fosdem24.png create mode 100644 doc/talks/assets/logos/jdll.png create mode 100644 doc/talks/assets/logos/logo_chatons.png create mode 100644 doc/talks/assets/logos/minio.png create mode 100644 doc/talks/assets/logos/ngi-pointer.png create mode 100644 doc/talks/assets/logos/nlnet.svg create mode 100644 doc/talks/assets/logos/pses.png create mode 100644 doc/talks/assets/logos/rust_logo.png delete mode 100644 doc/talks/assets/minio.png delete mode 100644 doc/talks/assets/ngi-pointer.png delete mode 100644 doc/talks/assets/nlnet.svg create mode 100644 doc/talks/assets/perf/db_engine.png create mode 100644 doc/talks/assets/perf/endpoint_latency_0.7_0.8_minio.png create mode 100644 doc/talks/assets/perf/io-0.7-0.8-minio.png create mode 100644 doc/talks/assets/perf/ttfb.png delete mode 100644 doc/talks/assets/pses.png delete mode 100644 doc/talks/assets/rust_logo.png create mode 100644 doc/talks/assets/screenshots/garage_stats_0.10.png create mode 100644 doc/talks/assets/screenshots/garage_status_0.10.png create mode 100644 doc/talks/assets/screenshots/garage_status_0.9_prod.png create mode 100644 doc/talks/assets/screenshots/garage_status_0.9_prod_zonehl.png create mode 100644 doc/talks/assets/screenshots/garage_status_unhealthy_0.10.png create mode 100644 doc/talks/assets/screenshots/garage_worker_list_0.10.png create mode 100644 doc/talks/assets/screenshots/garage_worker_param_0.10.png create mode 100644 doc/talks/assets/screenshots/grafana_dashboard.png create mode 100644 doc/talks/assets/screenshots/jaeger_listobjects.png create mode 100644 doc/talks/assets/screenshots/jaeger_putobject.png delete mode 100644 doc/talks/assets/ttfb.png (limited to 'doc') diff --git a/doc/talks/2024-02-03-fosdem/Makefile b/doc/talks/2024-02-03-fosdem/Makefile index 1440057c..f0aae6a8 100644 --- a/doc/talks/2024-02-03-fosdem/Makefile +++ b/doc/talks/2024-02-03-fosdem/Makefile @@ -1,23 +1,12 @@ -ASSETS=assets/consensus.pdf_tex \ - assets/lattice1.pdf_tex \ - assets/lattice2.pdf_tex \ - assets/lattice3.pdf_tex \ - assets/lattice4.pdf_tex \ - assets/lattice5.pdf_tex \ - assets/lattice6.pdf_tex \ - assets/lattice7.pdf_tex \ - assets/lattice8.pdf_tex \ - assets/latticeB_1.pdf_tex \ - assets/latticeB_2.pdf_tex \ - assets/latticeB_3.pdf_tex \ - assets/latticeB_4.pdf_tex \ - assets/latticeB_5.pdf_tex \ - assets/latticeB_6.pdf_tex \ - assets/latticeB_7.pdf_tex \ - assets/latticeB_8.pdf_tex \ - assets/latticeB_9.pdf_tex \ - assets/latticeB_10.pdf_tex \ - ../assets/deuxfleurs.pdf \ +ASSETS=../assets/lattice/lattice1.pdf_tex \ + ../assets/lattice/lattice2.pdf_tex \ + ../assets/lattice/lattice3.pdf_tex \ + ../assets/lattice/lattice4.pdf_tex \ + ../assets/lattice/lattice5.pdf_tex \ + ../assets/lattice/lattice6.pdf_tex \ + ../assets/lattice/lattice7.pdf_tex \ + ../assets/lattice/lattice8.pdf_tex \ + ../assets/logos/deuxfleurs.pdf \ ../assets/timeline-22-24.pdf talk.pdf: talk.tex $(ASSETS) diff --git a/doc/talks/2024-02-03-fosdem/assets/AGPLv3_Logo.png b/doc/talks/2024-02-03-fosdem/assets/AGPLv3_Logo.png deleted file mode 100644 index 445284a3..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/AGPLv3_Logo.png and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme.png b/doc/talks/2024-02-03-fosdem/assets/aerogramme.png deleted file mode 100644 index 3aabe3ad..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/aerogramme.png and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme.svg b/doc/talks/2024-02-03-fosdem/assets/aerogramme.svg deleted file mode 100644 index 0c1ee127..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/aerogramme.svg +++ /dev/null @@ -1,1241 +0,0 @@ - - - - - - K2V APIS3 APIAerogramme - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -IMAPIMAPIMAPMessageindexMessagebodies diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme_components1.drawio.pdf b/doc/talks/2024-02-03-fosdem/assets/aerogramme_components1.drawio.pdf deleted file mode 100644 index 71a90f26..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/aerogramme_components1.drawio.pdf and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme_components1.png b/doc/talks/2024-02-03-fosdem/assets/aerogramme_components1.png deleted file mode 100644 index fb81b460..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/aerogramme_components1.png and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme_components2.drawio.pdf b/doc/talks/2024-02-03-fosdem/assets/aerogramme_components2.drawio.pdf deleted file mode 100644 index 87e42eed..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/aerogramme_components2.drawio.pdf and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme_components2.png b/doc/talks/2024-02-03-fosdem/assets/aerogramme_components2.png deleted file mode 100644 index f9e2df14..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/aerogramme_components2.png and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme_datatype.drawio.pdf b/doc/talks/2024-02-03-fosdem/assets/aerogramme_datatype.drawio.pdf deleted file mode 100644 index 0606e059..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/aerogramme_datatype.drawio.pdf and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme_datatype.png b/doc/talks/2024-02-03-fosdem/assets/aerogramme_datatype.png deleted file mode 100644 index c3b015a1..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/aerogramme_datatype.png and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme_keys.drawio.pdf b/doc/talks/2024-02-03-fosdem/assets/aerogramme_keys.drawio.pdf deleted file mode 100644 index 8fea81c7..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/aerogramme_keys.drawio.pdf and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/aerogramme_keys.png b/doc/talks/2024-02-03-fosdem/assets/aerogramme_keys.png deleted file mode 100644 index ed2077d9..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/aerogramme_keys.png and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/compatibility.png b/doc/talks/2024-02-03-fosdem/assets/compatibility.png deleted file mode 100644 index ce364a9b..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/compatibility.png and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/consensus.svg b/doc/talks/2024-02-03-fosdem/assets/consensus.svg deleted file mode 100644 index 8321e383..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/consensus.svg +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - - - - - - - $\bot$ - - - - $x$ - - - $propose(x) / x$ - $propose(y) / x$ - - - diff --git a/doc/talks/2024-02-03-fosdem/assets/garage.drawio.pdf b/doc/talks/2024-02-03-fosdem/assets/garage.drawio.pdf deleted file mode 100644 index a54a163c..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/garage.drawio.pdf and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/garage.drawio.png b/doc/talks/2024-02-03-fosdem/assets/garage.drawio.png deleted file mode 100644 index 386dd862..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/garage.drawio.png and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/garage_sync.drawio.pdf b/doc/talks/2024-02-03-fosdem/assets/garage_sync.drawio.pdf deleted file mode 100644 index a94b3572..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/garage_sync.drawio.pdf and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/garage_sync.drawio.png b/doc/talks/2024-02-03-fosdem/assets/garage_sync.drawio.png deleted file mode 100644 index 2e7b5af0..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/garage_sync.drawio.png and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/lattice1.svg b/doc/talks/2024-02-03-fosdem/assets/lattice1.svg deleted file mode 100644 index 8bfa5aa7..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/lattice1.svg +++ /dev/null @@ -1,433 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $\{\}$ - $\{a,b,c\}$ - - $\{a\}$ - $\{b\}$ - $\{c\}$ - - - $\{a,c\}$ - $\{a,b\}$ - $\{b,c\}$ - - - - - - - - - - - - - - - diff --git a/doc/talks/2024-02-03-fosdem/assets/lattice2.svg b/doc/talks/2024-02-03-fosdem/assets/lattice2.svg deleted file mode 100644 index adcd92cb..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/lattice2.svg +++ /dev/null @@ -1,514 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $\{\}$ - $\{a,b,c\}$ - - $\{a\}$ - $\{b\}$ - $\{c\}$ - - - $\{a,c\}$ - $\{a,b\}$ - $\{b,c\}$ - - - - - - - - - - - - - - - - - - - - $write(\{a\})$: - $\not\sqsupseteq \{a\}$ - $\not\sqsupseteq \{a\}$ - $\not\sqsupseteq \{a\}$ - - diff --git a/doc/talks/2024-02-03-fosdem/assets/lattice3.svg b/doc/talks/2024-02-03-fosdem/assets/lattice3.svg deleted file mode 100644 index 640dc468..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/lattice3.svg +++ /dev/null @@ -1,515 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $\{\}$ - $\{a,b,c\}$ - - $\{a\}$ - $\{b\}$ - $\{c\}$ - - - $\{a,c\}$ - $\{a,b\}$ - $\{b,c\}$ - - - - - - - - - - - - - - - - - - - - $write(\{a\})$: - $\sqsupseteq \{a\} \to$ OK - $\not\sqsupseteq \{a\}$ - $\not\sqsupseteq \{a\}$ - - diff --git a/doc/talks/2024-02-03-fosdem/assets/lattice4.svg b/doc/talks/2024-02-03-fosdem/assets/lattice4.svg deleted file mode 100644 index b2a99e28..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/lattice4.svg +++ /dev/null @@ -1,525 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $\{\}$ - $\{a,b,c\}$ - - $\{a\}$ - $\{b\}$ - $\{c\}$ - - - $\{a,c\}$ - $\{a,b\}$ - $\{b,c\}$ - - - - - - - - - - - - - - - - - - - - $write(\{a\})$: - $\sqsupseteq \{a\} \to$ OK - $\sqsupseteq \{a\} \to$ OK - $\not\sqsupseteq \{a\}$ - return OK - - diff --git a/doc/talks/2024-02-03-fosdem/assets/lattice5.svg b/doc/talks/2024-02-03-fosdem/assets/lattice5.svg deleted file mode 100644 index bc6b7195..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/lattice5.svg +++ /dev/null @@ -1,536 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $\{\}$ - $\{a,b,c\}$ - - $\{a\}$ - $\{b\}$ - $\{c\}$ - - - $\{a,c\}$ - $\{a,b\}$ - $\{b,c\}$ - - - - - - - - - - - - - - - - - - - - $write(\{a\})$: - $read()$: - $\sqsupseteq \{a\} \to$ OK - $\sqsupseteq \{a\} \to$ OK - $\not\sqsupseteq \{a\}$ - return OK - - diff --git a/doc/talks/2024-02-03-fosdem/assets/lattice6.svg b/doc/talks/2024-02-03-fosdem/assets/lattice6.svg deleted file mode 100644 index 176b1715..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/lattice6.svg +++ /dev/null @@ -1,553 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $\{\}$ - $\{a,b,c\}$ - - $\{a\}$ - $\{b\}$ - $\{c\}$ - - - $\{a,c\}$ - $\{a,b\}$ - $\{b,c\}$ - - - - - - - - - - - - - - - - - - - - $write(\{a\})$: - $read()$: - $\sqsupseteq \{a\} \to$ OK - $\sqsupseteq \{a\} \to$ OK - $\not\sqsupseteq \{a\}$ - - $\to \{\}$ - return OK - - diff --git a/doc/talks/2024-02-03-fosdem/assets/lattice7.svg b/doc/talks/2024-02-03-fosdem/assets/lattice7.svg deleted file mode 100644 index 7ce8bda8..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/lattice7.svg +++ /dev/null @@ -1,581 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $\{\}$ - $\{a,b,c\}$ - - $\{a\}$ - $\{b\}$ - $\{c\}$ - - - $\{a,c\}$ - $\{a,b\}$ - $\{b,c\}$ - - - - - - - - - - - - - - - - - - - - $write(\{a\})$: - $read()$: - $\sqsupseteq \{a\} \to$ OK - $\sqsupseteq \{a\} \to$ OK - $\not\sqsupseteq \{a\}$ - - $\to \{\}$ - return OK - return $\{\}\sqcup\{a\}=\{a\}$ - - $\to \{a\}$ - - diff --git a/doc/talks/2024-02-03-fosdem/assets/lattice8.svg b/doc/talks/2024-02-03-fosdem/assets/lattice8.svg deleted file mode 100644 index c94a69b2..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/lattice8.svg +++ /dev/null @@ -1,581 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $\{\}$ - $\{a,b,c\}$ - - $\{a\}$ - $\{b\}$ - $\{c\}$ - - - $\{a,c\}$ - $\{a,b\}$ - $\{b,c\}$ - - - - - - - - - - - - - - - - - - - - $write(\{a\})$: - $read()$: - $\sqsupseteq \{a\} \to$ OK - $\sqsupseteq \{a\} \to$ OK - $\sqsupseteq \{a\}$ - - $\to \{\}$ - return OK - return $\{\}\sqcup\{a\}=\{a\}$ - - $\to \{a\}$ - - diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_1.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_1.svg deleted file mode 100644 index 92232a1b..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/latticeB_1.svg +++ /dev/null @@ -1,576 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $\{\}$ - $\{a,b,c\}$ - - $\{a\}$ - $\{b\}$ - $\{c\}$ - - - $\{a,c\}$ - $\{a,b\}$ - $\{b,c\}$ - - - - - - - - - - - - - - - - - - - - $write(\{a\})$: - $\not\sqsupseteq \{a\}$ - $\not\sqsupseteq \{a\}$ - $\not\sqsupseteq \{a\}$ - - - - $write(\{b\})$: - $\not\sqsupseteq \{b\}$ - $\not\sqsupseteq \{b\}$ - $\not\sqsupseteq \{b\}$ - - diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_10.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_10.svg deleted file mode 100644 index 34c24e0d..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/latticeB_10.svg +++ /dev/null @@ -1,715 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $\{\}$ - $\{a,b,c\}$ - - $\{a\}$ - $\{b\}$ - $\{c\}$ - - - $\{a,c\}$ - $\{a,b\}$ - $\{b,c\}$ - - - - - - - - - - - - - - - - - - - $write(\{a\})$: - $\sqsupseteq \{a\} \to$ OK - $\not\sqsupseteq \{a\}$ - $\not\sqsupseteq \{a\}$ - - - - $write(\{b\})$: - $read()$: - $\not\sqsupseteq \{b\}$ - $\sqsupseteq \{b\} \to$ OK - $\not\sqsupseteq \{b\}$ - - - $\to \{a\}$ - return $\{a\}$ - - $\to \{\}$ - - $\to \{\}$ - $read()$: - ; - return $\{b\}$ - - $\to \{b\}$ - ${\Large\textbf{??!}}$~~~~~$\{a\} \not\sqsubseteq \{b\}$ - - diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_2.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_2.svg deleted file mode 100644 index c07cba2b..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/latticeB_2.svg +++ /dev/null @@ -1,576 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $\{\}$ - $\{a,b,c\}$ - - $\{a\}$ - $\{b\}$ - $\{c\}$ - - - $\{a,c\}$ - $\{a,b\}$ - $\{b,c\}$ - - - - - - - - - - - - - - - - - - - - $write(\{a\})$: - $\sqsupseteq \{a\} \to$ OK - $\not\sqsupseteq \{a\}$ - $\not\sqsupseteq \{a\}$ - - - - $write(\{b\})$: - $\not\sqsupseteq \{b\}$ - $\not\sqsupseteq \{b\}$ - $\not\sqsupseteq \{b\}$ - - diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_3.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_3.svg deleted file mode 100644 index 198d1f5d..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/latticeB_3.svg +++ /dev/null @@ -1,576 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $\{\}$ - $\{a,b,c\}$ - - $\{a\}$ - $\{b\}$ - $\{c\}$ - - - $\{a,c\}$ - $\{a,b\}$ - $\{b,c\}$ - - - - - - - - - - - - - - - - - - - $write(\{a\})$: - $\sqsupseteq \{a\} \to$ OK - $\not\sqsupseteq \{a\}$ - $\not\sqsupseteq \{a\}$ - - - - $write(\{b\})$: - $\not\sqsupseteq \{b\}$ - $\sqsupseteq \{b\} \to$ OK - $\not\sqsupseteq \{b\}$ - - - diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_4.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_4.svg deleted file mode 100644 index c5f6148d..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/latticeB_4.svg +++ /dev/null @@ -1,587 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $\{\}$ - $\{a,b,c\}$ - - $\{a\}$ - $\{b\}$ - $\{c\}$ - - - $\{a,c\}$ - $\{a,b\}$ - $\{b,c\}$ - - - - - - - - - - - - - - - - - - - $write(\{a\})$: - $\sqsupseteq \{a\} \to$ OK - $\not\sqsupseteq \{a\}$ - $\not\sqsupseteq \{a\}$ - - - - $write(\{b\})$: - $read()$: - $\not\sqsupseteq \{b\}$ - $\sqsupseteq \{b\} \to$ OK - $\not\sqsupseteq \{b\}$ - - - diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_5.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_5.svg deleted file mode 100644 index c2b668be..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/latticeB_5.svg +++ /dev/null @@ -1,604 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $\{\}$ - $\{a,b,c\}$ - - $\{a\}$ - $\{b\}$ - $\{c\}$ - - - $\{a,c\}$ - $\{a,b\}$ - $\{b,c\}$ - - - - - - - - - - - - - - - - - - - $write(\{a\})$: - $\sqsupseteq \{a\} \to$ OK - $\not\sqsupseteq \{a\}$ - $\not\sqsupseteq \{a\}$ - - - - $write(\{b\})$: - $read()$: - $\not\sqsupseteq \{b\}$ - $\sqsupseteq \{b\} \to$ OK - $\not\sqsupseteq \{b\}$ - - - $\to \{a\}$ - - diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_6.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_6.svg deleted file mode 100644 index 980823fc..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/latticeB_6.svg +++ /dev/null @@ -1,632 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $\{\}$ - $\{a,b,c\}$ - - $\{a\}$ - $\{b\}$ - $\{c\}$ - - - $\{a,c\}$ - $\{a,b\}$ - $\{b,c\}$ - - - - - - - - - - - - - - - - - - - $write(\{a\})$: - $\sqsupseteq \{a\} \to$ OK - $\not\sqsupseteq \{a\}$ - $\not\sqsupseteq \{a\}$ - - - - $write(\{b\})$: - $read()$: - $\not\sqsupseteq \{b\}$ - $\sqsupseteq \{b\} \to$ OK - $\not\sqsupseteq \{b\}$ - - - $\to \{a\}$ - return $\{a\}$ - - $\to \{\}$ - - diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_7.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_7.svg deleted file mode 100644 index 154c0b7d..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/latticeB_7.svg +++ /dev/null @@ -1,654 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $\{\}$ - $\{a,b,c\}$ - - $\{a\}$ - $\{b\}$ - $\{c\}$ - - - $\{a,c\}$ - $\{a,b\}$ - $\{b,c\}$ - - - - - - - - - - - - - - - - - - - $write(\{a\})$: - $\sqsupseteq \{a\} \to$ OK - $\not\sqsupseteq \{a\}$ - $\not\sqsupseteq \{a\}$ - - - - $write(\{b\})$: - $read()$: - $\not\sqsupseteq \{b\}$ - $\sqsupseteq \{b\} \to$ OK - $\not\sqsupseteq \{b\}$ - - - $\to \{a\}$ - return $\{a\}$ - - $\to \{\}$ - $read()$: - ; - - diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_8.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_8.svg deleted file mode 100644 index 21766415..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/latticeB_8.svg +++ /dev/null @@ -1,671 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $\{\}$ - $\{a,b,c\}$ - - $\{a\}$ - $\{b\}$ - $\{c\}$ - - - $\{a,c\}$ - $\{a,b\}$ - $\{b,c\}$ - - - - - - - - - - - - - - - - - - - $write(\{a\})$: - $\sqsupseteq \{a\} \to$ OK - $\not\sqsupseteq \{a\}$ - $\not\sqsupseteq \{a\}$ - - - - $write(\{b\})$: - $read()$: - $\not\sqsupseteq \{b\}$ - $\sqsupseteq \{b\} \to$ OK - $\not\sqsupseteq \{b\}$ - - - $\to \{a\}$ - return $\{a\}$ - - $\to \{\}$ - - $\to \{\}$ - $read()$: - ; - - diff --git a/doc/talks/2024-02-03-fosdem/assets/latticeB_9.svg b/doc/talks/2024-02-03-fosdem/assets/latticeB_9.svg deleted file mode 100644 index b60f8afe..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/latticeB_9.svg +++ /dev/null @@ -1,699 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $\{\}$ - $\{a,b,c\}$ - - $\{a\}$ - $\{b\}$ - $\{c\}$ - - - $\{a,c\}$ - $\{a,b\}$ - $\{b,c\}$ - - - - - - - - - - - - - - - - - - - $write(\{a\})$: - $\sqsupseteq \{a\} \to$ OK - $\not\sqsupseteq \{a\}$ - $\not\sqsupseteq \{a\}$ - - - - $write(\{b\})$: - $read()$: - $\not\sqsupseteq \{b\}$ - $\sqsupseteq \{b\} \to$ OK - $\not\sqsupseteq \{b\}$ - - - $\to \{a\}$ - return $\{a\}$ - - $\to \{\}$ - - $\to \{\}$ - $read()$: - ; - return $\{b\}$ - - $\to \{b\}$ - - diff --git a/doc/talks/2024-02-03-fosdem/assets/rust_logo.png b/doc/talks/2024-02-03-fosdem/assets/rust_logo.png deleted file mode 100644 index 0e4809ec..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/rust_logo.png and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/scr_garage_stats.png b/doc/talks/2024-02-03-fosdem/assets/scr_garage_stats.png deleted file mode 100644 index c92f0774..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/scr_garage_stats.png and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/scr_garage_status.png b/doc/talks/2024-02-03-fosdem/assets/scr_garage_status.png deleted file mode 100644 index 849b8336..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/scr_garage_status.png and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/scr_garage_status_broken.png b/doc/talks/2024-02-03-fosdem/assets/scr_garage_status_broken.png deleted file mode 100644 index 86dcce89..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/scr_garage_status_broken.png and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/scr_garage_worker_get.png b/doc/talks/2024-02-03-fosdem/assets/scr_garage_worker_get.png deleted file mode 100644 index e7d4e288..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/scr_garage_worker_get.png and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/scr_garage_worker_list.png b/doc/talks/2024-02-03-fosdem/assets/scr_garage_worker_list.png deleted file mode 100644 index 472312a0..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/scr_garage_worker_list.png and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/slideB1.png b/doc/talks/2024-02-03-fosdem/assets/slideB1.png deleted file mode 100644 index b14b6070..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/slideB1.png and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/slideB2.png b/doc/talks/2024-02-03-fosdem/assets/slideB2.png deleted file mode 100644 index a881a796..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/slideB2.png and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/slideB3.png b/doc/talks/2024-02-03-fosdem/assets/slideB3.png deleted file mode 100644 index 830709d2..00000000 Binary files a/doc/talks/2024-02-03-fosdem/assets/slideB3.png and /dev/null differ diff --git a/doc/talks/2024-02-03-fosdem/assets/slides.svg b/doc/talks/2024-02-03-fosdem/assets/slides.svg deleted file mode 100644 index 9946c6fb..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/slides.svg +++ /dev/null @@ -1,4326 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - User-facing application - Database - Filesystem - - - - - - - - - - diff --git a/doc/talks/2024-02-03-fosdem/assets/slidesB.svg b/doc/talks/2024-02-03-fosdem/assets/slidesB.svg deleted file mode 100644 index c0a6e97c..00000000 --- a/doc/talks/2024-02-03-fosdem/assets/slidesB.svg +++ /dev/null @@ -1,444 +0,0 @@ - - - -User-facing applicationDatabase*K2VObject storage*(not really a database)Database diff --git a/doc/talks/2024-02-03-fosdem/talk.pdf b/doc/talks/2024-02-03-fosdem/talk.pdf index 03fa8fcc..7e6aa41a 100644 Binary files a/doc/talks/2024-02-03-fosdem/talk.pdf and b/doc/talks/2024-02-03-fosdem/talk.pdf differ diff --git a/doc/talks/2024-02-03-fosdem/talk.tex b/doc/talks/2024-02-03-fosdem/talk.tex index 4c4dcdbc..b7254dc2 100644 --- a/doc/talks/2024-02-03-fosdem/talk.tex +++ b/doc/talks/2024-02-03-fosdem/talk.tex @@ -10,6 +10,7 @@ \usepackage{graphicx} \usepackage{import} \usepackage{adjustbox} +\usepackage[absolute,overlay]{textpos} %\useoutertheme[footline=authortitle,subsection=false]{miniframes} %\useoutertheme[footline=authorinstitute,subsection=false]{miniframes} \useoutertheme{infolines} @@ -86,7 +87,7 @@ \begin{columns}[t] \begin{column}{.2\textwidth} \centering - \adjincludegraphics[width=.5\linewidth, valign=t]{../assets/deuxfleurs.pdf} + \adjincludegraphics[width=.5\linewidth, valign=t]{../assets/logos/deuxfleurs.pdf} \end{column} \begin{column}{.6\textwidth} \textbf{Deuxfleurs}\\ @@ -95,7 +96,7 @@ \end{column} \begin{column}{.2\textwidth} \centering - \adjincludegraphics[width=.7\linewidth, valign=t]{../assets/logo_chatons.png} + \adjincludegraphics[width=.7\linewidth, valign=t]{../assets/logos/logo_chatons.png} \end{column} \end{columns} @@ -116,39 +117,25 @@ \vspace{2em} \begin{center} \textbf{\underline{Resilience}}\\ - {\footnotesize (we want good uptime/availability with low supervision)} + {\footnotesize we want good uptime/availability with low supervision} \end{center} } \end{frame} \begin{frame} - \frametitle{How to make a \underline{stable} system} + \frametitle{Building a resilient system with cheap stuff} - Enterprise-grade systems typically employ: - \vspace{1em} - \begin{itemize} - \item RAID - \item Redundant power grid + UPS - \item Redundant Internet connections - \item Low-latency links - \item ... - \end{itemize} - \vspace{1em} - $\to$ it's costly and only worth it at DC scale -\end{frame} - -\begin{frame} - \frametitle{How to make a \underline{resilient} system} - - \only<1,4-5>{ - Instead, we use: - \vspace{1em} + \only<1,4-7>{ \begin{itemize} - \item \textcolor<2->{gray}{Commodity hardware (e.g. old desktop PCs)} + \item \textcolor<5->{gray}{Commodity hardware (e.g. old desktop PCs)\\ \vspace{.5em} - \item<4-> \textcolor<5->{gray}{Commodity Internet (e.g. FTTB, FTTH) and power grid} + \visible<4->{{\footnotesize (can die at any time)}}} + \vspace{1.5em} + \item<5-> \textcolor<7->{gray}{Regular Internet (e.g. FTTB, FTTH) and power grid connections\\ \vspace{.5em} - \item<5-> \textcolor<6->{gray}{\textbf{Geographical redundancy} (multi-site replication)} + \visible<6->{{\footnotesize (can be unavailable randomly)}}} + \vspace{1.5em} + \item<7-> \textbf{Geographical redundancy} (multi-site replication) \end{itemize} } \only<2>{ @@ -161,7 +148,7 @@ \includegraphics[width=.8\linewidth]{../assets/atuin.jpg} \end{center} } - \only<6>{ + \only<8>{ \begin{center} \includegraphics[width=.8\linewidth]{../assets/inframap_jdll2023.pdf} \end{center} @@ -171,22 +158,20 @@ \begin{frame} \frametitle{Object storage: a crucial component} \begin{center} - \includegraphics[height=6em]{../assets/Amazon-S3.jpg} + \includegraphics[height=6em]{../assets/logos/Amazon-S3.jpg} \hspace{3em} - \includegraphics[height=5em]{../assets/minio.png} + \visible<2->{\includegraphics[height=5em]{../assets/logos/minio.png}} \hspace{3em} - \includegraphics[height=6em]{../../logo/garage_hires_crop.png} + \visible<3>{\includegraphics[height=6em]{../../logo/garage_hires_crop.png}} \end{center} \vspace{1em} S3: a de-facto standard, many compatible applications \vspace{1em} - - MinIO is self-hostable but not suited for geo-distributed deployments + \visible<2->{MinIO is self-hostable but not suited for geo-distributed deployments} \vspace{1em} - - \textbf{Garage is a self-hosted drop-in replacement for the Amazon S3 object store} + \visible<3->{\textbf{Garage is a self-hosted drop-in replacement for the Amazon S3 object store}} \end{frame} \begin{frame} @@ -194,30 +179,30 @@ Consensus can be implemented reasonably well in practice, so why avoid it? \vspace{1em} \begin{itemize} - \item \textbf{Software complexity} + \item<2-> \textbf{Software complexity} \vspace{1em} - \item \textbf{Performance issues:} + \item<3-> \textbf{Performance issues:} \vspace{.5em} \begin{itemize} - \item The leader is a \textbf{bottleneck} for all requests\\ + \item<4-> The leader is a \textbf{bottleneck} for all requests\\ \vspace{.5em} - \item \textbf{Sensitive to higher latency} between nodes + \item<5-> \textbf{Sensitive to higher latency} between nodes \vspace{.5em} - \item \textbf{Takes time to reconverge} when disrupted (e.g. node going down) + \item<6-> \textbf{Takes time to reconverge} when disrupted (e.g. node going down) \end{itemize} \end{itemize} \vspace{2em} - $\to$ Garage uses only CRDTs internally (conflict-free replicated data types) + \visible<7->{\underline{Internally, Garage uses only CRDTs} (conflict-free replicated data types)} \end{frame} \begin{frame} \frametitle{The data model of object storage} - Object storage is basically a key-value store: - \vspace{1em} + Object storage is basically a \textbf{key-value store}: + \vspace{.5em} - {\footnotesize + {\scriptsize \begin{center} - \begin{tabular}{|l|p{8cm}|} + \begin{tabular}{|l|p{7cm}|} \hline \textbf{Key: file path + name} & \textbf{Value: file data + metadata} \\ \hline @@ -242,28 +227,33 @@ } \vspace{1em} - Simple interface, compatible with many existing applications - - \vspace{1em} - Maps well to CRDT data types + \begin{itemize} + \item<2> Maps well to CRDT data types + \end{itemize} \end{frame} \begin{frame} \frametitle{Performance gains in practice} \begin{center} - \includegraphics[width=.8\linewidth]{../assets/endpoint_latency_0.7_0.8_minio.png} + \includegraphics[width=.8\linewidth]{../assets/perf/endpoint_latency_0.7_0.8_minio.png} \end{center} \end{frame} + +% ======================================== TIMELINE +% ======================================== TIMELINE +% ======================================== TIMELINE + +\section{Recent developments} + +% ====================== v0.7.0 =============================== + \begin{frame} - \frametitle{Timeline} \begin{center} \includegraphics[width=.8\linewidth]{../assets/timeline-22-24.pdf} \end{center} \end{frame} -% ====================== v0.7.0 =============================== - \begin{frame} \frametitle{April 2022 - Garage v0.7.0} Focus on \underline{observability and ecosystem integration} @@ -271,8 +261,7 @@ \begin{itemize} \item \textbf{Monitoring:} metrics and traces, using OpenTelemetry \vspace{1em} - \item Alternative replication modes with 1 or 2 copies,\\ - modes with weaker consistency + \item Replication modes with 1 or 2 copies / weaker consistency \vspace{1em} \item Kubernetes integration \vspace{1em} @@ -285,19 +274,25 @@ \begin{frame} \frametitle{Metrics (Prometheus + Grafana)} \begin{center} - \includegraphics[width=.9\linewidth]{../assets/grafana_dashboard.png} + \includegraphics[width=.9\linewidth]{../assets/screenshots/grafana_dashboard.png} \end{center} \end{frame} \begin{frame} \frametitle{Traces (Jaeger)} \begin{center} - \includegraphics[width=.8\linewidth]{../assets/jaeger_listobjects.png} + \includegraphics[width=.8\linewidth]{../assets/screenshots/jaeger_listobjects.png} \end{center} \end{frame} % ====================== v0.8.0 =============================== +\begin{frame} + \begin{center} + \includegraphics[width=.8\linewidth]{../assets/timeline-22-24.pdf} + \end{center} +\end{frame} + \begin{frame} \frametitle{November 2022 - Garage v0.8.0} Focus on \underline{performance} @@ -315,8 +310,8 @@ \begin{frame} \frametitle{About metadata DB engines} - Issues with Sled: - \vspace{2em} + \textbf{Issues with Sled:} + \vspace{1em} \begin{itemize} \item Huge files on disk \vspace{.5em} @@ -326,8 +321,9 @@ \vspace{.5em} \item Not actively maintained \end{itemize} + \vspace{2em} - LMDB: very stable, good performance, reasonably small files on disk + \textbf{LMDB:} very stable, good performance, reasonably small files on disk \vspace{1em} Sled will be removed in Garage v1.0 @@ -336,7 +332,7 @@ \begin{frame} \frametitle{DB engine performance comparison} \begin{center} - \includegraphics[width=.6\linewidth]{../assets/db_engine.png} + \includegraphics[width=.6\linewidth]{../assets/perf/db_engine.png} \end{center} NB: Sqlite was slow due to synchronous journaling mode, now configurable \end{frame} @@ -352,19 +348,25 @@ \begin{frame} \frametitle{TTFB benchmark} \begin{center} - \includegraphics[width=.8\linewidth]{../assets/ttfb.png} + \includegraphics[width=.8\linewidth]{../assets/perf/ttfb.png} \end{center} \end{frame} \begin{frame} \frametitle{Throughput benchmark} \begin{center} - \includegraphics[width=.7\linewidth]{../assets/io-0.7-0.8-minio.png} + \includegraphics[width=.7\linewidth]{../assets/perf/io-0.7-0.8-minio.png} \end{center} \end{frame} % ====================== v0.9.0 =============================== +\begin{frame} + \begin{center} + \includegraphics[width=.8\linewidth]{../assets/timeline-22-24.pdf} + \end{center} +\end{frame} + \begin{frame} \frametitle{October 2023 - Garage v0.9.0} Focus on \underline{streamlining \& usability} @@ -389,90 +391,71 @@ \begin{frame} \frametitle{Layout computation} - \begin{center} - \includegraphics[width=\linewidth]{../assets/location-aware.png} - \end{center} - \vspace{2em} - Garage replicates data on different zones when possible -\end{frame} - -\begin{frame} - \frametitle{Layout computation} + \begin{overprint} + \onslide<1> \begin{center} - \includegraphics[width=.8\linewidth]{../assets/map.png} + \includegraphics[width=\linewidth, trim=0 0 0 -4cm]{../assets/screenshots/garage_status_0.9_prod_zonehl.png} \end{center} -\end{frame} - -\begin{frame} - \frametitle{Optimal layout computation} + \onslide<2> \begin{center} - \includegraphics[width=.6\linewidth]{../assets/geodistrib_paper.png} + \includegraphics[width=.7\linewidth]{../assets/map.png} \end{center} + \end{overprint} + \vspace{1em} + Garage stores replicas on different zones when possible \end{frame} \begin{frame} \frametitle{What a "layout" is} - \textbf{A layout is a precomputed index table} - \vspace{2em} + \textbf{A layout is a precomputed index table:} + \vspace{1em} - \begin{center} - \begin{tabular}{|l|l|l|l|} - \hline - \textbf{Partition} & \textbf{Node 1} & \textbf{Node 2} & \textbf{Node 3} \\ - \hline - \hline - Partition 0 & Io (jupiter) & Drosera (atuin) & Courgette (neptune) \\ - \hline - Partition 1 & Datura (atuin) & Courgette (neptune) & Io (jupiter) \\ - \hline - Partition 2 & Io(jupiter) & Celeri (neptune) & Drosera (atuin) \\ - \hline - \hspace{1em}$\vdots$ & \hspace{1em}$\vdots$ & \hspace{1em}$\vdots$ & \hspace{1em}$\vdots$ \\ - \hline - Partition 255 & Concombre (neptune) & Io (jupiter) & Drosera (atuin) \\ - \hline - \end{tabular} - \end{center} + {\footnotesize + \begin{center} + \begin{tabular}{|l|l|l|l|} + \hline + \textbf{Partition} & \textbf{Node 1} & \textbf{Node 2} & \textbf{Node 3} \\ + \hline + \hline + Partition 0 & Io (jupiter) & Drosera (atuin) & Courgette (neptune) \\ + \hline + Partition 1 & Datura (atuin) & Courgette (neptune) & Io (jupiter) \\ + \hline + Partition 2 & Io(jupiter) & Celeri (neptune) & Drosera (atuin) \\ + \hline + \hspace{1em}$\vdots$ & \hspace{1em}$\vdots$ & \hspace{1em}$\vdots$ & \hspace{1em}$\vdots$ \\ + \hline + Partition 255 & Concombre (neptune) & Io (jupiter) & Drosera (atuin) \\ + \hline + \end{tabular} + \end{center} + } - \vspace{1em} + \vspace{2em} + \visible<2->{ The index table is built centrally using an optimal algorithm,\\ then propagated to all nodes + } \end{frame} \begin{frame} - \frametitle{The relationship between \emph{partition} and \emph{partition key}} - \begin{center} - \begin{tabular}{|l|l|l|l|} - \hline - \textbf{Partition key} & \textbf{Partition} & \textbf{Sort key} & \textbf{Value} \\ - \hline - \hline - \texttt{website} & Partition 12 & \texttt{index.html} & (file data) \\ - \hline - \texttt{website} & Partition 12 & \texttt{img/logo.svg} & (file data) \\ - \hline - \texttt{website} & Partition 12 &\texttt{download/index.html} & (file data) \\ - \hline - \hline - \texttt{backup} & Partition 42 & \texttt{borg/index.2822} & (file data) \\ - \hline - \texttt{backup} & Partition 42 & \texttt{borg/data/2/2329} & (file data) \\ - \hline - \texttt{backup} & Partition 42 & \texttt{borg/data/2/2680} & (file data) \\ - \hline - \hline - \texttt{private} & Partition 42 & \texttt{qq3a2nbe1qjq0ebbvo6ocsp6co} & (file data) \\ - \hline - \end{tabular} - \end{center} - \vspace{1em} - \textbf{To read or write an item:} hash partition key - \\ \hspace{5cm} $\to$ determine partition number (first 8 bits) - \\ \hspace{5cm} $\to$ find associated nodes + \frametitle{Optimal layout computation} + \begin{figure} + \center + \includegraphics[width=.6\linewidth]{../assets/geodistrib_paper.png} + \end{figure} \end{frame} + + % ====================== v0.10.0 =============================== +\begin{frame} + \begin{center} + \includegraphics[width=.8\linewidth]{../assets/timeline-22-24.pdf} + \end{center} +\end{frame} + \begin{frame} \frametitle{October 2023 - Garage v0.10.0 beta} Focus on \underline{consistency} @@ -482,386 +465,150 @@ \end{itemize} \end{frame} - - - -% -------------------------------------------------------------------- -% ================================================================================= -% ================================================================================= -% -------------------------------------------------------------------- -% -------------------------------------------------------------------- -% -------------------------------------------------------------------- -% ================================================================================= -% ================================================================================= -% -------------------------------------------------------------------- - - - - \begin{frame} - \frametitle{Two big problems} - \begin{enumerate} - \item \textbf{How to place data on different nodes?}\\ - \vspace{1em} - \underline{Constraints:} heterogeneous hardware\\ - \underline{Objective:} $n$ copies of everything, maximize usable capacity, maximize resilience\\ - \vspace{1em} - $\to$ the Dynamo model + optimization algorithms - \vspace{2em} - \item<2-> \textbf{How to guarantee consistency?}\\ + \frametitle{Working with weak consistency} + Not using consensus limits us to the following: + \vspace{2em} + \begin{itemize} + \item<2-> \textbf{Conflict-free replicated data types} (CRDT)\\ \vspace{1em} - \underline{Constraints:} slow network (geographical distance), node unavailability/crashes\\ - \underline{Objective:} maximize availability, read-after-write guarantee\\ + {\footnotesize Non-transactional key-value stores such as S3 are equivalent to a simple CRDT:\\ + a map of \textbf{last-writer-wins registers} (each key is its own CRDT)} + \vspace{1.5em} + \item<3-> \textbf{Read-after-write consistency}\\ \vspace{1em} - $\to$ CRDTs, monotonicity, read and write quorums - \end{enumerate} + {\footnotesize Can be implemented using quorums on read and write operations} + \end{itemize} \end{frame} -\section{Problem 1: placing data} - -\begin{frame} - \frametitle{Key-value stores, upgraded: the Dynamo model} - \textbf{Two keys:} - \begin{itemize} - \item Partition key: used to divide data into partitions {\small (a.k.a.~shards)} - \item Sort key: used to identify items inside a partition - \end{itemize} +\begin{frame}[t] + \frametitle{CRDT read-after-write consistency using quorums} \vspace{1em} + {\small + \textbf{Property:} If node $A$ did an operation $write(x)$ and received an OK response,\\ + \hspace{2cm} and node $B$ starts an operation $read()$ after $A$ received OK,\\ + \hspace{2cm} then $B$ will read a value $x' \sqsupseteq x$. + } - \begin{center} - \begin{tabular}{|l|l|p{3cm}|} - \hline - \textbf{Partition key: bucket} & \textbf{Sort key: filename} & \textbf{Value} \\ - \hline - \hline - \texttt{website} & \texttt{index.html} & (file data) \\ - \hline - \texttt{website} & \texttt{img/logo.svg} & (file data) \\ - \hline - \texttt{website} & \texttt{download/index.html} & (file data) \\ - \hline - \hline - \texttt{backup} & \texttt{borg/index.2822} & (file data) \\ - \hline - \texttt{backup} & \texttt{borg/data/2/2329} & (file data) \\ - \hline - \texttt{backup} & \texttt{borg/data/2/2680} & (file data) \\ - \hline - \hline - \texttt{private} & \texttt{qq3a2nbe1qjq0ebbvo6ocsp6co} & (file data) \\ - \hline - \end{tabular} - \end{center} -\end{frame} - -\begin{frame} - \frametitle{Key-value stores, upgraded: the Dynamo model} - \begin{itemize} - \item Data with different partition keys is stored independently,\\ - on a different set of nodes\\ - \vspace{.5em} - $\to$ no easy way to list all partition keys\\ - $\to$ no cross-shard transactions\\ - \vspace{2em} - \item Placing data: hash the partition key, select nodes accordingly\\ - \vspace{.5em} - $\to$ distributed hash table (DHT) - \vspace{2em} - \item For a given value of the partition key, items can be listed using their sort keys - \end{itemize} + \vspace{1.5em} + \begin{overprint} + \onslide<2-9> + \begin{figure} + \centering + \footnotesize + \def\svgwidth{.7\textwidth} + \only<2>{\import{../assets/lattice/}{lattice1.pdf_tex}}% + \only<3>{\import{../assets/lattice/}{lattice2.pdf_tex}}% + \only<4>{\import{../assets/lattice/}{lattice3.pdf_tex}}% + \only<5>{\import{../assets/lattice/}{lattice4.pdf_tex}}% + \only<6>{\import{../assets/lattice/}{lattice5.pdf_tex}}% + \only<7>{\import{../assets/lattice/}{lattice6.pdf_tex}}% + \only<8>{\import{../assets/lattice/}{lattice7.pdf_tex}}% + \only<9>{\import{../assets/lattice/}{lattice8.pdf_tex}}% + \end{figure} + + \onslide<10> + \begin{minipage}{.10\textwidth} + ~ + \end{minipage} + \begin{minipage}{.40\textwidth} + \footnotesize + \textbf{Algorithm $write(x)$:} + \begin{enumerate} + \item Broadcast $write(x)$ to all nodes + \item Wait for $k > n/2$ nodes to reply OK + \item Return OK + \end{enumerate} + \end{minipage} + \begin{minipage}{.40\textwidth} + \footnotesize + \vspace{1em} + \textbf{Algorithm $read()$:} + \begin{enumerate} + \item Broadcast $read()$ to all nodes + \item Wait for $k > n/2$ nodes to reply\\ + with values $x_1, \dots, x_k$ + \item Return $x_1 \sqcup \dots \sqcup x_k$ + \end{enumerate} + \end{minipage} + \end{overprint} \end{frame} - \begin{frame} - \frametitle{Issues with consistent hashing} + \frametitle{A hard problem: layout changes} \begin{itemize} - \item Consistent hashing doesn't dispatch data based on geographical location of nodes - \vspace{1em} - \item<2-> Geographically aware adaptation, try 1:\\ - data quantities not well balanced between nodes - \vspace{1em} - \item<3-> Geographically aware adaptation, try 2:\\ - too many reshuffles when adding/removing nodes + \item We rely on quorums $k > n/2$ within each partition:\\ + $$n=3,~~~~~~~k\ge 2$$ + \item<2-> When rebalancing, the set of nodes responsible for a partition can change:\\ + $$\{A, B, C\} \to \{A, D, E\}$$ + \vspace{.01em} + \item<3-> During the rebalancing, $D$ and $E$ don't yet have the data,\\ + ~~~~~~~~~~~~~~~~~~~and $B$ and $C$ want to get rid of the data to free up space\\ + \vspace{1.2em} + $\to$ risk of inconsistency, \textbf{how to coordinate?} \end{itemize} \end{frame} - -\section{Problem 2: ensuring consistency} - \begin{frame} - \frametitle{Consensus vs weak consistency} - - \hspace{1em} - \begin{minipage}{7cm} - \textbf{Consensus-based systems:} - \vspace{1em} + \frametitle{Handling layout changes without losing consistency} + \begin{minipage}{.55\textwidth} \begin{itemize} - \item \textbf{Leader-based:} a leader is elected to coordinate - all reads and writes - \vspace{1em} - \item \textbf{Linearizability} of all operations\\ - (strongest consistency guarantee) + \item \textbf{Solution:}\\ + \vspace{.5em} + \begin{itemize} + \item keep track of data transfer to new nodes + \vspace{.5em} + \item use multiple write quorums\\ + (new nodes + old nodes\\ + while data transfer is in progress) + \vspace{.5em} + \item switching reads to new nodes\\ + only once copy is finished + \end{itemize} \vspace{1em} - \item Any sequential specification can be implemented as a \textbf{replicated state machine} + \item \textbf{Implemented} in v0.10 \vspace{1em} - \item \textbf{Costly}, the leader is a bottleneck; - leader elections on failure take time + \item \textbf{Validated} with Jepsen testing \end{itemize} \end{minipage} - \hfill - \begin{minipage}{7cm} \visible<2->{ - \textbf{Weakly consistent systems:} - \vspace{1em} - \begin{itemize} - \item \textbf{Nodes are equivalent}, any node - can originate a read or write operation - \vspace{1em} - \item \textbf{Read-after-write consistency} with quorums, - eventual consistency without - \vspace{1em} - \item \textbf{Operations have to commute}, i.e.~we - can only implement CRDTs - \vspace{1em} - \item \textbf{Fast}, no single bottleneck;\\ - works the same with offline nodes - \end{itemize} - } \end{minipage} - \hspace{1em} -\end{frame} - -\begin{frame} - \frametitle{Consensus vs weak consistency} - \begin{center} - \textbf{From a theoretical point of view:}\\ - - \end{center} - \vspace{2em} - - \hspace{1em} - \begin{minipage}{6.5cm} - \underline{Consensus-based systems:} - - \vspace{1em} - - Require \textbf{additional assumptions} such as a fault detector or a strong RNG\\ - (FLP impossibility theorem) + \begin{minipage}{.23\textwidth} + \includegraphics[width=3cm]{../assets/jepsen-0.9.png}\\ + {\footnotesize Garage v0.9.0} \end{minipage} - \hfill - \begin{minipage}{6.5cm} - \underline{Weakly consistent systems:} - - \vspace{1em} - - Can be implemented in \textbf{any\\asynchronous message passing\\distributed system} with node crashes + \begin{minipage}{.2\textwidth} + \includegraphics[width=3cm]{../assets/jepsen-0.10.png}\\ + {\footnotesize Garage v0.10 beta} \end{minipage} - \hspace{1em} - - \vspace{3em} - \begin{center} - They represent \textbf{different classes of computational capability}\\ - \end{center} \end{frame} +% ====================== v0.10.0 =============================== + \begin{frame} - \frametitle{Consensus vs weak consistency} \begin{center} - \textbf{The same objects cannot be implemented in both models.} + \includegraphics[width=.8\linewidth]{../assets/timeline-22-24.pdf} \end{center} - \vspace{2em} - - \hspace{1em} - \begin{minipage}{6.5cm} - \underline{Consensus-based systems:} - - \vspace{1em} - - \textbf{Any sequential specification}\\~ - - \vspace{1em} - \textbf{Easier to program for}: just write your program as if it were sequential on a single machine - - \end{minipage} - \hfill - \begin{minipage}{6.5cm} - \underline{Weakly consistent systems:} - - \vspace{1em} - - \textbf{Only CRDTs}\\(conflict-free replicated data types) - - \vspace{1em} - Part of the complexity is \textbf{reported to the consumer of the API}\\~ - \end{minipage} - \hspace{1em} -\end{frame} - -\begin{frame} - \frametitle{Understanding the power of consensus} - \textbf{Consensus:} an API with a single operation, $propose(x)$ - \begin{enumerate} - \item nodes all call $propose(x)$ with their proposed value; - \item nodes all receive the same value as a return value, which is one of the proposed values - \end{enumerate} - \vspace{1em} - - \visible<2->{ - \textbf{Equivalent to} a distributed algorithm that gives a total order on all requests - } - \vspace{1em} - - \visible<3->{ - \textbf{Implemented by} this simple replicated state machine: - \vspace{.5em} - \begin{figure} - \centering - \def\svgwidth{.5\textwidth} - \large - \import{assets/}{consensus.pdf_tex} - \end{figure} - \vspace{1em} - } \end{frame} \begin{frame} - \frametitle{Can my object be implemented without consensus?} - \underline{Given the specification of an API:} + \frametitle{Towards v1.0} + Focus on \underline{security \& stability} \vspace{2em} \begin{itemize} - \item \textbf{Using this API, we can implement the consensus object} (the $propose$ function)\\ - $\to$ the API is equivalent to consensus/total ordering of messages\\ - $\to$ the API cannot be implemented in a weakly consistent system - \vspace{2em} - \item<2-> \textbf{This API can be implemented using only weak primitives}\\ - (e.g. in the asynchronous message passing model with no further assumption)\\ - $\to$ the API is strictly weaker than consensus\\ - $\to$ we can implement it in Garage! - \end{itemize} -\end{frame} - - -\begin{frame} - \frametitle{What can we implement without consensus?} - \begin{itemize} - \item Any \textbf{conflict-free replicated data type} (CRDT) + \item \textbf{Security audit} in progress by Radically Open Security \vspace{1em} - \item<2-> Non-transactional key-value stores such as S3 are equivalent to a simple CRDT:\\ - a map of \textbf{last-writer-wins registers} (each key is its own CRDT) + \item Misc. S3 features (SSE-C, ...) and compatibility fixes \vspace{1em} - \item<3-> \textbf{Read-after-write consistency} can be implemented - using quorums on read and write operations + \item Improve UX \vspace{1em} - \item<4-> \textbf{Monotonicity of reads} can be implemented with repair-on-read\\ - (makes reads more costly, not implemented in Garage) + \item Fix bugs \end{itemize} \end{frame} -\begin{frame} - \frametitle{CRDTs and quorums: read-after-write consistency} - \begin{figure} - \centering - \def\svgwidth{.8\textwidth} - \only<1>{\import{assets/}{lattice1.pdf_tex}}% - \only<2>{\import{assets/}{lattice2.pdf_tex}}% - \only<3>{\import{assets/}{lattice3.pdf_tex}}% - \only<4>{\import{assets/}{lattice4.pdf_tex}}% - \only<5>{\import{assets/}{lattice5.pdf_tex}}% - \only<6>{\import{assets/}{lattice6.pdf_tex}}% - \only<7>{\import{assets/}{lattice7.pdf_tex}}% - \only<8>{\import{assets/}{lattice8.pdf_tex}}% - \end{figure} -\end{frame} - -\begin{frame} - \frametitle{CRDTs and quorums: read-after-write consistency} - \textbf{Property:} If node $A$ did an operation $write(x)$ and received an OK response,\\ - \hspace{2cm} and node $B$ starts an operation $read()$ after $A$ received OK,\\ - \hspace{2cm} then $B$ will read a value $x' \sqsupseteq x$. - - \vspace{1em} - - \hspace{1em} - \begin{minipage}{6.8cm} - \textbf{Algorithm $write(x)$:} - \begin{enumerate} - \item Broadcast $write(x)$ to all nodes - \item Wait for $k > n/2$ nodes to reply OK - \item Return OK - \end{enumerate} - \end{minipage} - \hfill - \begin{minipage}{6.8cm} - \vspace{1em} - \textbf{Algorithm $read()$:} - \begin{enumerate} - \item Broadcast $read()$ to all nodes - \item Wait for $k > n/2$ nodes to reply\\ - with values $x_1, \dots, x_k$ - \item Return $x_1 \sqcup \dots \sqcup x_k$ - \end{enumerate} - \end{minipage} - \hspace{1em} - - \vspace{2em} - \textbf{Why does it work?} There is at least one node at the intersection between the two sets of nodes that replied to each request, that ``saw'' $x$ before the $read()$ started ($x_i \sqsupseteq x$). -\end{frame} - -\begin{frame} - \frametitle{CRDTs and quorums: monotonic-reads consistency} - \begin{figure} - \centering - \def\svgwidth{.8\textwidth} - \only<1>{\import{assets/}{latticeB_1.pdf_tex}}% - \only<2>{\import{assets/}{latticeB_2.pdf_tex}}% - \only<3>{\import{assets/}{latticeB_3.pdf_tex}}% - \only<4>{\import{assets/}{latticeB_4.pdf_tex}}% - \only<5>{\import{assets/}{latticeB_5.pdf_tex}}% - \only<6>{\import{assets/}{latticeB_6.pdf_tex}}% - \only<7>{\import{assets/}{latticeB_7.pdf_tex}}% - \only<8>{\import{assets/}{latticeB_8.pdf_tex}}% - \only<9>{\import{assets/}{latticeB_9.pdf_tex}}% - \only<10>{\import{assets/}{latticeB_10.pdf_tex}}% - \end{figure} -\end{frame} - -\begin{frame} - \frametitle{CRDTs and quorums: monotonic-reads consistency} - \textbf{Property:} If node $A$ did an operation $read()$ and received $x$ as a response,\\ - \hspace{2cm} and node $B$ starts an operation $read()$ after $A$ received $x$,\\ - \hspace{2cm} then $B$ will read a value $x' \sqsupseteq x$. - - \vspace{1em} - - \textbf{Algorithm $monotonic\_read()$:} {\small (a.k.a. repair-on-read)} - \begin{enumerate} - \item Broadcast $read()$ to all nodes - \item Wait for $k > n/2$ nodes to reply with values $x_1, \dots, x_k$ - \item If $x_i \ne x_j$ for some nodes $i$ and $j$,\\ - \hspace{1cm}then call $write(x_1 \sqcup \dots \sqcup x_k)$ and wait for OK from $k' > n/2$ nodes - \item Return $x_1 \sqcup \dots \sqcup x_k$ - \end{enumerate} - - \vspace{1em} - - This makes reads slower in some cases, and is \textbf{not implemented in Garage}. -\end{frame} - -\begin{frame} - \frametitle{A hard problem: layout changes} - \begin{itemize} - \item We rely on quorums $k > n/2$ within each partition:\\ - $$n=3,~~~~~~~k\ge 2$$ - \item<2-> When rebalancing, the set of nodes responsible for a partition can change:\\ - $$\{n_A, n_B, n_C\} \to \{n_A, n_D, n_E\}$$ - \vspace{.01em} - \item<3-> During the rebalancing, $D$ and $E$ don't yet have the data,\\ - ~~~~~~~~~~~~~~~~~~~and $B$ and $C$ want to get rid of the data to free up space\\ - \vspace{.2em} - $\to$ quorums only within the new set of nodes don't work\\ - $\to$ how to coordinate? \textbf{currently, we don't...} +% ======================================== OPERATING +% ======================================== OPERATING +% ======================================== OPERATING - \end{itemize} -\end{frame} \section{Operating big Garage clusters} @@ -869,9 +616,9 @@ \frametitle{Operating Garage} \begin{center} \only<1-2>{ - \includegraphics[width=.9\linewidth]{assets/scr_garage_status.png} + \includegraphics[width=.9\linewidth]{../assets/screenshots/garage_status_0.10.png} \\\vspace{1em} - \visible<2>{\includegraphics[width=.85\linewidth]{assets/scr_garage_status_broken.png}} + \visible<2>{\includegraphics[width=.9\linewidth]{../assets/screenshots/garage_status_unhealthy_0.10.png}} } \end{center} \end{frame} @@ -879,17 +626,17 @@ \begin{frame} \frametitle{Garage's architecture} \begin{center} - \only<1>{\includegraphics[width=.45\linewidth]{assets/garage.drawio.pdf}}% - \only<2>{\includegraphics[width=.6\linewidth]{assets/garage_sync.drawio.pdf}}% + \only<1>{\includegraphics[width=.45\linewidth]{../assets/garage.drawio.pdf}}% + \only<2>{\includegraphics[width=.6\linewidth]{../assets/garage_sync.drawio.pdf}}% \end{center} \end{frame} \begin{frame} \frametitle{Digging deeper} \begin{center} - \only<1>{\includegraphics[width=.9\linewidth]{assets/scr_garage_stats.png}} - \only<2>{\includegraphics[width=.6\linewidth]{assets/scr_garage_worker_list.png}} - \only<3>{\includegraphics[width=.6\linewidth]{assets/scr_garage_worker_get.png}} + \only<1>{\includegraphics[width=.9\linewidth]{../assets/screenshots/garage_stats_0.10.png}} + \only<2>{\includegraphics[width=.5\linewidth]{../assets/screenshots/garage_worker_list_0.10.png}} + \only<3>{\includegraphics[width=.6\linewidth]{../assets/screenshots/garage_worker_param_0.10.png}} \end{center} \end{frame} @@ -910,7 +657,6 @@ \begin{itemize} \item Lots of small files on disk \item Processing the resync queue can be slow - \item Multi-HDD support not yet released (soon!) \end{itemize} \end{itemize} \end{frame} @@ -926,7 +672,7 @@ \vspace{.5em} \item Data block storage: \begin{itemize} - \item Wait for v0.9 with multi-HDD support + \item Use Garage's native multi-HDD support \item XFS on individual drives \item Increase block size (1MB $\to$ 10MB, requires more RAM and good networking) \item Tune \texttt{resync-tranquility} and \texttt{resync-worker-count} dynamically @@ -943,146 +689,10 @@ Current deployments: $< 10$ TB, we don't have much experience with more \end{frame} -\section{Going further than the S3 API} - -\begin{frame} - \frametitle{Using Garage for everything} - \begin{center} - \only<1>{\includegraphics[width=.8\linewidth]{assets/slideB1.png}}% - \only<2>{\includegraphics[width=.8\linewidth]{assets/slideB2.png}}% - \only<3>{\includegraphics[width=.8\linewidth]{assets/slideB3.png}}% - \end{center} -\end{frame} - -\begin{frame} - \frametitle{K2V Design} - \begin{itemize} - \item A new, custom, minimal API\\ - \vspace{.5em} - \begin{itemize} - \item Single-item operations - \item Operations on ranges and batches of items - \item Polling operations to help implement a PubSub pattern - \end{itemize} - \vspace{1em} - \item<2-> Exposes the partitoning mechanism of Garage\\ - K2V = partition key / sort key / value (like Dynamo) - \vspace{1em} - \item<3-> Weakly consistent, CRDT-friendly\\ - $\to$ no support for transactions (not ACID) - \vspace{1em} - \item<4-> Cryptography-friendly: values are binary blobs - \end{itemize} -\end{frame} - -\begin{frame} - \frametitle{Handling concurrent values} - \textbf{How to handle concurrency?} Example: - \vspace{1em} - \begin{enumerate} - \item Client $A$ reads the initial value of a key, $x_0$ - \vspace{1em} - \item<2-> Client $B$ also reads the initial value $x_0$ of that key - \vspace{1em} - \item<3-> Client $A$ modifies $x_0$, and writes a new value $x_1$ - \vspace{1em} - \item<4-> Client $B$ also modifies $x_0$, and writes a new value $x'_1$,\\ - without having a chance to first read $x_1$\\ - \vspace{1em} - $\to$ what should the final state be? - \end{enumerate} -\end{frame} - -\begin{frame} - \frametitle{Handling concurrent values} - \begin{itemize} - \item If we keep only $x_1$ or $x'_1$, we risk \textbf{loosing application data} - \vspace{1.5em} - \item<2-> Values are opaque binary blobs, \textbf{K2V cannot resolve conflicts} by itself\\ - (e.g. by implementing a CRDT) - \vspace{1.5em} - \item<3-> Solution: \textbf{we keep both!}\\ - $\to$ the value of the key is now $\{x_1, x'_1\}$\\ - $\to$ the client application can decide how to resolve conflicts on the next read - \end{itemize} -\end{frame} - -\begin{frame} - \frametitle{Keeping track of causality} - How does K2V know that $x_1$ and $x'_1$ are concurrent? - \vspace{1em} - \begin{itemize} - \item $read()$ returns \textbf{a set of values} and an associated \textbf{causality token}\\ - \vspace{1.5em} - \item<2-> When calling $write()$, the client sends \textbf{the causality token from its last read} - \vspace{1.5em} - \item<3-> The causality token represents the set of values \textbf{already seen by the client}\\ - $\to$ those values are the \textbf{causal past} of the write operation\\ - $\to$ K2V can keep concurrent values and overwrite all ones in the causal past - \vspace{1.5em} - \item<4-> Internally, the causality token is \textbf{a vector clock} - \end{itemize} -\end{frame} - -\begin{frame} - \frametitle{Application: an e-mail storage server} - \begin{center} - \only<1>{\includegraphics[width=.9\linewidth]{assets/aerogramme.png}}% - \end{center} -\end{frame} - -\begin{frame} - \frametitle{Aerogramme data model} - \begin{center} - \only<1->{\includegraphics[width=.4\linewidth]{assets/aerogramme_datatype.drawio.pdf}}% - \end{center} - \visible<2->{Aerogramme encrypts all stored values for privacy\\ - (Garage server administrators can't read your mail)} -\end{frame} - -\begin{frame} - \frametitle{Different deployment scenarios} - \begin{center} - \only<1>{\includegraphics[width=.9\linewidth]{assets/aerogramme_components1.drawio.pdf}}% - \only<2>{\includegraphics[width=.9\linewidth]{assets/aerogramme_components2.drawio.pdf}}% - \end{center} -\end{frame} - -\begin{frame} - \frametitle{A new model for building resilient software} - How to build an application using only Garage as a data store: - \vspace{1em} - \begin{enumerate} - \item Design a data model suited to K2V\\ - {\footnotesize (see Cassandra docs on porting SQL data models to Cassandra)} - \vspace{1em} - \begin{itemize} - \item Use CRDTs or other eventually consistent data types (see e.g. Bayou) - \vspace{1em} - \item Store opaque binary blobs to provide End-to-End Encryption\\ - \end{itemize} - \vspace{1em} - \item<2-> Store big blobs (files) using the S3 API - \vspace{1em} - \item<3-> Let Garage manage sharding, replication, failover, etc. - \end{enumerate} -\end{frame} - -\section{Conclusion} -\begin{frame} - \frametitle{Perspectives} - \begin{itemize} - \item Fix the consistency issue when rebalancing - \vspace{1em} - \item Write about Garage's architecture and properties,\\ - and about our proposed architecture for (E2EE) apps over K2V+S3 - \vspace{1em} - \item Continue developing Garage; finish Aerogramme; build new applications... - \vspace{1em} - \item Anything else? - \end{itemize} -\end{frame} +% ======================================== END +% ======================================== END +% ======================================== END \begin{frame} \frametitle{Where to find us} @@ -1094,8 +704,8 @@ \texttt{\#garage:deuxfleurs.fr} on Matrix \vspace{1.5em} - \includegraphics[width=.06\linewidth]{assets/rust_logo.png} - \includegraphics[width=.13\linewidth]{assets/AGPLv3_Logo.png} + \includegraphics[width=.06\linewidth]{../assets/logos/rust_logo.png} + \includegraphics[width=.13\linewidth]{../assets/logos/AGPLv3_Logo.png} \end{center} \end{frame} diff --git a/doc/talks/assets/.gitignore b/doc/talks/assets/.gitignore index 26848b92..9ce0997d 100644 --- a/doc/talks/assets/.gitignore +++ b/doc/talks/assets/.gitignore @@ -1,6 +1,8 @@ # Files that are auto-generated when building pdfs deuxfleurs.pdf timeline-22-24.pdf +lattice*.pdf_tex +lattice*.pdf # tmp files generated by krita *~ diff --git a/doc/talks/assets/AGPLv3_Logo.png b/doc/talks/assets/AGPLv3_Logo.png deleted file mode 100644 index 445284a3..00000000 Binary files a/doc/talks/assets/AGPLv3_Logo.png and /dev/null differ diff --git a/doc/talks/assets/Amazon-S3.jpg b/doc/talks/assets/Amazon-S3.jpg deleted file mode 100644 index a9501973..00000000 Binary files a/doc/talks/assets/Amazon-S3.jpg and /dev/null differ diff --git a/doc/talks/assets/NGI0Entrust_tag.png b/doc/talks/assets/NGI0Entrust_tag.png deleted file mode 100644 index 064c4aee..00000000 Binary files a/doc/talks/assets/NGI0Entrust_tag.png and /dev/null differ diff --git a/doc/talks/assets/NGI0Entrust_tag.svg b/doc/talks/assets/NGI0Entrust_tag.svg deleted file mode 100644 index ca0d2814..00000000 --- a/doc/talks/assets/NGI0Entrust_tag.svg +++ /dev/null @@ -1,149 +0,0 @@ - - - -image/svg+xml - - - - - - -NGI Zero Entrust - - - - diff --git a/doc/talks/assets/capitole_du_libre.png b/doc/talks/assets/capitole_du_libre.png deleted file mode 100644 index eaa521af..00000000 Binary files a/doc/talks/assets/capitole_du_libre.png and /dev/null differ diff --git a/doc/talks/assets/db_engine.png b/doc/talks/assets/db_engine.png deleted file mode 100644 index b1124b04..00000000 Binary files a/doc/talks/assets/db_engine.png and /dev/null differ diff --git a/doc/talks/assets/deuxfleurs.svg b/doc/talks/assets/deuxfleurs.svg deleted file mode 100644 index c298c22b..00000000 --- a/doc/talks/assets/deuxfleurs.svg +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - D - F - diff --git a/doc/talks/assets/endpoint_latency_0.7_0.8_minio.png b/doc/talks/assets/endpoint_latency_0.7_0.8_minio.png deleted file mode 100644 index 92eac3fb..00000000 Binary files a/doc/talks/assets/endpoint_latency_0.7_0.8_minio.png and /dev/null differ diff --git a/doc/talks/assets/fosdem22.png b/doc/talks/assets/fosdem22.png deleted file mode 100644 index 17332e4b..00000000 Binary files a/doc/talks/assets/fosdem22.png and /dev/null differ diff --git a/doc/talks/assets/fosdem24.png b/doc/talks/assets/fosdem24.png deleted file mode 100644 index 11631695..00000000 Binary files a/doc/talks/assets/fosdem24.png and /dev/null differ diff --git a/doc/talks/assets/garage.drawio.pdf b/doc/talks/assets/garage.drawio.pdf new file mode 100644 index 00000000..a54a163c Binary files /dev/null and b/doc/talks/assets/garage.drawio.pdf differ diff --git a/doc/talks/assets/garage.drawio.png b/doc/talks/assets/garage.drawio.png new file mode 100644 index 00000000..386dd862 Binary files /dev/null and b/doc/talks/assets/garage.drawio.png differ diff --git a/doc/talks/assets/garage_sync.drawio.pdf b/doc/talks/assets/garage_sync.drawio.pdf new file mode 100644 index 00000000..a94b3572 Binary files /dev/null and b/doc/talks/assets/garage_sync.drawio.pdf differ diff --git a/doc/talks/assets/garage_sync.drawio.png b/doc/talks/assets/garage_sync.drawio.png new file mode 100644 index 00000000..2e7b5af0 Binary files /dev/null and b/doc/talks/assets/garage_sync.drawio.png differ diff --git a/doc/talks/assets/grafana_dashboard.png b/doc/talks/assets/grafana_dashboard.png deleted file mode 100644 index 2df1fc41..00000000 Binary files a/doc/talks/assets/grafana_dashboard.png and /dev/null differ diff --git a/doc/talks/assets/io-0.7-0.8-minio.png b/doc/talks/assets/io-0.7-0.8-minio.png deleted file mode 100644 index f581a22e..00000000 Binary files a/doc/talks/assets/io-0.7-0.8-minio.png and /dev/null differ diff --git a/doc/talks/assets/jaeger_listobjects.png b/doc/talks/assets/jaeger_listobjects.png deleted file mode 100644 index ab7d68f4..00000000 Binary files a/doc/talks/assets/jaeger_listobjects.png and /dev/null differ diff --git a/doc/talks/assets/jaeger_putobject.png b/doc/talks/assets/jaeger_putobject.png deleted file mode 100644 index 7966275e..00000000 Binary files a/doc/talks/assets/jaeger_putobject.png and /dev/null differ diff --git a/doc/talks/assets/jdll.png b/doc/talks/assets/jdll.png deleted file mode 100644 index a7cbe091..00000000 Binary files a/doc/talks/assets/jdll.png and /dev/null differ diff --git a/doc/talks/assets/jepsen-0.10.png b/doc/talks/assets/jepsen-0.10.png new file mode 100644 index 00000000..d7895e31 Binary files /dev/null and b/doc/talks/assets/jepsen-0.10.png differ diff --git a/doc/talks/assets/jepsen-0.9.png b/doc/talks/assets/jepsen-0.9.png new file mode 100644 index 00000000..3f654038 Binary files /dev/null and b/doc/talks/assets/jepsen-0.9.png differ diff --git a/doc/talks/assets/lattice/lattice1.svg b/doc/talks/assets/lattice/lattice1.svg new file mode 100644 index 00000000..8bfa5aa7 --- /dev/null +++ b/doc/talks/assets/lattice/lattice1.svg @@ -0,0 +1,433 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + diff --git a/doc/talks/assets/lattice/lattice2.svg b/doc/talks/assets/lattice/lattice2.svg new file mode 100644 index 00000000..adcd92cb --- /dev/null +++ b/doc/talks/assets/lattice/lattice2.svg @@ -0,0 +1,514 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $\not\sqsupseteq \{a\}$ + $\not\sqsupseteq \{a\}$ + $\not\sqsupseteq \{a\}$ + + diff --git a/doc/talks/assets/lattice/lattice3.svg b/doc/talks/assets/lattice/lattice3.svg new file mode 100644 index 00000000..640dc468 --- /dev/null +++ b/doc/talks/assets/lattice/lattice3.svg @@ -0,0 +1,515 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $\sqsupseteq \{a\} \to$ OK + $\not\sqsupseteq \{a\}$ + $\not\sqsupseteq \{a\}$ + + diff --git a/doc/talks/assets/lattice/lattice4.svg b/doc/talks/assets/lattice/lattice4.svg new file mode 100644 index 00000000..b2a99e28 --- /dev/null +++ b/doc/talks/assets/lattice/lattice4.svg @@ -0,0 +1,525 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $\sqsupseteq \{a\} \to$ OK + $\sqsupseteq \{a\} \to$ OK + $\not\sqsupseteq \{a\}$ + return OK + + diff --git a/doc/talks/assets/lattice/lattice5.svg b/doc/talks/assets/lattice/lattice5.svg new file mode 100644 index 00000000..bc6b7195 --- /dev/null +++ b/doc/talks/assets/lattice/lattice5.svg @@ -0,0 +1,536 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $read()$: + $\sqsupseteq \{a\} \to$ OK + $\sqsupseteq \{a\} \to$ OK + $\not\sqsupseteq \{a\}$ + return OK + + diff --git a/doc/talks/assets/lattice/lattice6.svg b/doc/talks/assets/lattice/lattice6.svg new file mode 100644 index 00000000..176b1715 --- /dev/null +++ b/doc/talks/assets/lattice/lattice6.svg @@ -0,0 +1,553 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $read()$: + $\sqsupseteq \{a\} \to$ OK + $\sqsupseteq \{a\} \to$ OK + $\not\sqsupseteq \{a\}$ + + $\to \{\}$ + return OK + + diff --git a/doc/talks/assets/lattice/lattice7.svg b/doc/talks/assets/lattice/lattice7.svg new file mode 100644 index 00000000..7ce8bda8 --- /dev/null +++ b/doc/talks/assets/lattice/lattice7.svg @@ -0,0 +1,581 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $read()$: + $\sqsupseteq \{a\} \to$ OK + $\sqsupseteq \{a\} \to$ OK + $\not\sqsupseteq \{a\}$ + + $\to \{\}$ + return OK + return $\{\}\sqcup\{a\}=\{a\}$ + + $\to \{a\}$ + + diff --git a/doc/talks/assets/lattice/lattice8.svg b/doc/talks/assets/lattice/lattice8.svg new file mode 100644 index 00000000..c94a69b2 --- /dev/null +++ b/doc/talks/assets/lattice/lattice8.svg @@ -0,0 +1,581 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $\{\}$ + $\{a,b,c\}$ + + $\{a\}$ + $\{b\}$ + $\{c\}$ + + + $\{a,c\}$ + $\{a,b\}$ + $\{b,c\}$ + + + + + + + + + + + + + + + + + + + + $write(\{a\})$: + $read()$: + $\sqsupseteq \{a\} \to$ OK + $\sqsupseteq \{a\} \to$ OK + $\sqsupseteq \{a\}$ + + $\to \{\}$ + return OK + return $\{\}\sqcup\{a\}=\{a\}$ + + $\to \{a\}$ + + diff --git a/doc/talks/assets/location-aware.png b/doc/talks/assets/location-aware.png deleted file mode 100644 index f5966865..00000000 Binary files a/doc/talks/assets/location-aware.png and /dev/null differ diff --git a/doc/talks/assets/logo_chatons.png b/doc/talks/assets/logo_chatons.png deleted file mode 100644 index 890cf17e..00000000 Binary files a/doc/talks/assets/logo_chatons.png and /dev/null differ diff --git a/doc/talks/assets/logos/AGPLv3_Logo.png b/doc/talks/assets/logos/AGPLv3_Logo.png new file mode 100644 index 00000000..445284a3 Binary files /dev/null and b/doc/talks/assets/logos/AGPLv3_Logo.png differ diff --git a/doc/talks/assets/logos/Amazon-S3.jpg b/doc/talks/assets/logos/Amazon-S3.jpg new file mode 100644 index 00000000..a9501973 Binary files /dev/null and b/doc/talks/assets/logos/Amazon-S3.jpg differ diff --git a/doc/talks/assets/logos/NGI0Entrust_tag.png b/doc/talks/assets/logos/NGI0Entrust_tag.png new file mode 100644 index 00000000..064c4aee Binary files /dev/null and b/doc/talks/assets/logos/NGI0Entrust_tag.png differ diff --git a/doc/talks/assets/logos/NGI0Entrust_tag.svg b/doc/talks/assets/logos/NGI0Entrust_tag.svg new file mode 100644 index 00000000..ca0d2814 --- /dev/null +++ b/doc/talks/assets/logos/NGI0Entrust_tag.svg @@ -0,0 +1,149 @@ + + + +image/svg+xml + + + + + + +NGI Zero Entrust + + + + diff --git a/doc/talks/assets/logos/capitole_du_libre.png b/doc/talks/assets/logos/capitole_du_libre.png new file mode 100644 index 00000000..eaa521af Binary files /dev/null and b/doc/talks/assets/logos/capitole_du_libre.png differ diff --git a/doc/talks/assets/logos/deuxfleurs.svg b/doc/talks/assets/logos/deuxfleurs.svg new file mode 100644 index 00000000..c298c22b --- /dev/null +++ b/doc/talks/assets/logos/deuxfleurs.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + D + F + diff --git a/doc/talks/assets/logos/fosdem22.png b/doc/talks/assets/logos/fosdem22.png new file mode 100644 index 00000000..17332e4b Binary files /dev/null and b/doc/talks/assets/logos/fosdem22.png differ diff --git a/doc/talks/assets/logos/fosdem24.png b/doc/talks/assets/logos/fosdem24.png new file mode 100644 index 00000000..11631695 Binary files /dev/null and b/doc/talks/assets/logos/fosdem24.png differ diff --git a/doc/talks/assets/logos/jdll.png b/doc/talks/assets/logos/jdll.png new file mode 100644 index 00000000..a7cbe091 Binary files /dev/null and b/doc/talks/assets/logos/jdll.png differ diff --git a/doc/talks/assets/logos/logo_chatons.png b/doc/talks/assets/logos/logo_chatons.png new file mode 100644 index 00000000..890cf17e Binary files /dev/null and b/doc/talks/assets/logos/logo_chatons.png differ diff --git a/doc/talks/assets/logos/minio.png b/doc/talks/assets/logos/minio.png new file mode 100644 index 00000000..a71e9ccc Binary files /dev/null and b/doc/talks/assets/logos/minio.png differ diff --git a/doc/talks/assets/logos/ngi-pointer.png b/doc/talks/assets/logos/ngi-pointer.png new file mode 100644 index 00000000..730ececa Binary files /dev/null and b/doc/talks/assets/logos/ngi-pointer.png differ diff --git a/doc/talks/assets/logos/nlnet.svg b/doc/talks/assets/logos/nlnet.svg new file mode 100644 index 00000000..373c8d8f --- /dev/null +++ b/doc/talks/assets/logos/nlnet.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/talks/assets/logos/pses.png b/doc/talks/assets/logos/pses.png new file mode 100644 index 00000000..da871f83 Binary files /dev/null and b/doc/talks/assets/logos/pses.png differ diff --git a/doc/talks/assets/logos/rust_logo.png b/doc/talks/assets/logos/rust_logo.png new file mode 100644 index 00000000..0e4809ec Binary files /dev/null and b/doc/talks/assets/logos/rust_logo.png differ diff --git a/doc/talks/assets/minio.png b/doc/talks/assets/minio.png deleted file mode 100644 index a71e9ccc..00000000 Binary files a/doc/talks/assets/minio.png and /dev/null differ diff --git a/doc/talks/assets/ngi-pointer.png b/doc/talks/assets/ngi-pointer.png deleted file mode 100644 index 730ececa..00000000 Binary files a/doc/talks/assets/ngi-pointer.png and /dev/null differ diff --git a/doc/talks/assets/nlnet.svg b/doc/talks/assets/nlnet.svg deleted file mode 100644 index 373c8d8f..00000000 --- a/doc/talks/assets/nlnet.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/talks/assets/perf/db_engine.png b/doc/talks/assets/perf/db_engine.png new file mode 100644 index 00000000..b1124b04 Binary files /dev/null and b/doc/talks/assets/perf/db_engine.png differ diff --git a/doc/talks/assets/perf/endpoint_latency_0.7_0.8_minio.png b/doc/talks/assets/perf/endpoint_latency_0.7_0.8_minio.png new file mode 100644 index 00000000..92eac3fb Binary files /dev/null and b/doc/talks/assets/perf/endpoint_latency_0.7_0.8_minio.png differ diff --git a/doc/talks/assets/perf/io-0.7-0.8-minio.png b/doc/talks/assets/perf/io-0.7-0.8-minio.png new file mode 100644 index 00000000..f581a22e Binary files /dev/null and b/doc/talks/assets/perf/io-0.7-0.8-minio.png differ diff --git a/doc/talks/assets/perf/ttfb.png b/doc/talks/assets/perf/ttfb.png new file mode 100644 index 00000000..c0335bd9 Binary files /dev/null and b/doc/talks/assets/perf/ttfb.png differ diff --git a/doc/talks/assets/pses.png b/doc/talks/assets/pses.png deleted file mode 100644 index da871f83..00000000 Binary files a/doc/talks/assets/pses.png and /dev/null differ diff --git a/doc/talks/assets/rust_logo.png b/doc/talks/assets/rust_logo.png deleted file mode 100644 index 0e4809ec..00000000 Binary files a/doc/talks/assets/rust_logo.png and /dev/null differ diff --git a/doc/talks/assets/screenshots/garage_stats_0.10.png b/doc/talks/assets/screenshots/garage_stats_0.10.png new file mode 100644 index 00000000..78a36ead Binary files /dev/null and b/doc/talks/assets/screenshots/garage_stats_0.10.png differ diff --git a/doc/talks/assets/screenshots/garage_status_0.10.png b/doc/talks/assets/screenshots/garage_status_0.10.png new file mode 100644 index 00000000..510717ca Binary files /dev/null and b/doc/talks/assets/screenshots/garage_status_0.10.png differ diff --git a/doc/talks/assets/screenshots/garage_status_0.9_prod.png b/doc/talks/assets/screenshots/garage_status_0.9_prod.png new file mode 100644 index 00000000..e1a05899 Binary files /dev/null and b/doc/talks/assets/screenshots/garage_status_0.9_prod.png differ diff --git a/doc/talks/assets/screenshots/garage_status_0.9_prod_zonehl.png b/doc/talks/assets/screenshots/garage_status_0.9_prod_zonehl.png new file mode 100644 index 00000000..99d46f98 Binary files /dev/null and b/doc/talks/assets/screenshots/garage_status_0.9_prod_zonehl.png differ diff --git a/doc/talks/assets/screenshots/garage_status_unhealthy_0.10.png b/doc/talks/assets/screenshots/garage_status_unhealthy_0.10.png new file mode 100644 index 00000000..b167687d Binary files /dev/null and b/doc/talks/assets/screenshots/garage_status_unhealthy_0.10.png differ diff --git a/doc/talks/assets/screenshots/garage_worker_list_0.10.png b/doc/talks/assets/screenshots/garage_worker_list_0.10.png new file mode 100644 index 00000000..078f0607 Binary files /dev/null and b/doc/talks/assets/screenshots/garage_worker_list_0.10.png differ diff --git a/doc/talks/assets/screenshots/garage_worker_param_0.10.png b/doc/talks/assets/screenshots/garage_worker_param_0.10.png new file mode 100644 index 00000000..39ee11aa Binary files /dev/null and b/doc/talks/assets/screenshots/garage_worker_param_0.10.png differ diff --git a/doc/talks/assets/screenshots/grafana_dashboard.png b/doc/talks/assets/screenshots/grafana_dashboard.png new file mode 100644 index 00000000..2df1fc41 Binary files /dev/null and b/doc/talks/assets/screenshots/grafana_dashboard.png differ diff --git a/doc/talks/assets/screenshots/jaeger_listobjects.png b/doc/talks/assets/screenshots/jaeger_listobjects.png new file mode 100644 index 00000000..ab7d68f4 Binary files /dev/null and b/doc/talks/assets/screenshots/jaeger_listobjects.png differ diff --git a/doc/talks/assets/screenshots/jaeger_putobject.png b/doc/talks/assets/screenshots/jaeger_putobject.png new file mode 100644 index 00000000..7966275e Binary files /dev/null and b/doc/talks/assets/screenshots/jaeger_putobject.png differ diff --git a/doc/talks/assets/ttfb.png b/doc/talks/assets/ttfb.png deleted file mode 100644 index c0335bd9..00000000 Binary files a/doc/talks/assets/ttfb.png and /dev/null differ diff --git a/doc/talks/shell.nix b/doc/talks/shell.nix index 161a61e1..bbee0714 100644 --- a/doc/talks/shell.nix +++ b/doc/talks/shell.nix @@ -5,7 +5,7 @@ let scheme-basic beamer amsmath mathtools breqn environ - multirow graphics import adjustbox tabu vwcol stmaryrd ulem ragged2e + multirow graphics import adjustbox tabu vwcol stmaryrd ulem ragged2e textpos dvisvgm dvipng wrapfig hyperref capt-of; }); in pkgs.mkShell { nativeBuildInputs = [ pkgs.gnumake latex ]; } -- cgit v1.2.3 From c7dad980b72e8f61033b8f42e4422ae5239d6d01 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Tue, 23 Jan 2024 17:25:45 +0100 Subject: [talk-fosdem-24] remove geodistrib paper shot --- doc/talks/2024-02-03-fosdem/talk.pdf | Bin 4034990 -> 3782274 bytes doc/talks/2024-02-03-fosdem/talk.tex | 14 ++++++-------- 2 files changed, 6 insertions(+), 8 deletions(-) (limited to 'doc') diff --git a/doc/talks/2024-02-03-fosdem/talk.pdf b/doc/talks/2024-02-03-fosdem/talk.pdf index 7e6aa41a..4345bf0a 100644 Binary files a/doc/talks/2024-02-03-fosdem/talk.pdf and b/doc/talks/2024-02-03-fosdem/talk.pdf differ diff --git a/doc/talks/2024-02-03-fosdem/talk.tex b/doc/talks/2024-02-03-fosdem/talk.tex index b7254dc2..6c3e47f0 100644 --- a/doc/talks/2024-02-03-fosdem/talk.tex +++ b/doc/talks/2024-02-03-fosdem/talk.tex @@ -334,7 +334,7 @@ \begin{center} \includegraphics[width=.6\linewidth]{../assets/perf/db_engine.png} \end{center} - NB: Sqlite was slow due to synchronous journaling mode, now configurable + NB: Sqlite was slow due to synchronous mode, now configurable \end{frame} \begin{frame} @@ -436,14 +436,12 @@ The index table is built centrally using an optimal algorithm,\\ then propagated to all nodes } -\end{frame} -\begin{frame} - \frametitle{Optimal layout computation} - \begin{figure} - \center - \includegraphics[width=.6\linewidth]{../assets/geodistrib_paper.png} - \end{figure} + \vspace{1em} + \visible<3->{ + \footnotesize + Oulamara, M., \& Auvolat, A. (2023). \emph{An algorithm for geo-distributed and redundant storage in Garage}.\\ arXiv preprint arXiv:2302.13798. + } \end{frame} -- cgit v1.2.3 From 91a51dd3e876bde7d9b6199b478c26c620994348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arma=C3=ABl=20Gu=C3=A9neau?= Date: Sat, 27 Jan 2024 14:51:15 +0100 Subject: doc: fix some typos --- doc/book/operations/durability-repairs.md | 4 ++-- doc/book/operations/layout.md | 12 ++++++------ doc/book/operations/upgrading.md | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) (limited to 'doc') diff --git a/doc/book/operations/durability-repairs.md b/doc/book/operations/durability-repairs.md index b0d2c78a..578899a8 100644 --- a/doc/book/operations/durability-repairs.md +++ b/doc/book/operations/durability-repairs.md @@ -49,7 +49,7 @@ verifications. Of course, scrubbing the entire data store will also take longer. ## Block check and resync In some cases, nodes hold a reference to a block but do not actually have the block -stored on disk. Conversely, they may also have on disk blocks that are not referenced +stored on disk. Conversely, they may also have on-disk blocks that are not referenced any more. To fix both cases, a block repair may be run with `garage repair blocks`. This will scan the entire block reference counter table to check that the blocks exist on disk, and will scan the entire disk store to check that stored blocks @@ -95,7 +95,7 @@ using the `garage block purge` command. In [multi-HDD setups](@/documentation/operations/multi-hdd.md), to ensure that data blocks are well balanced between storage locations, you may run a -rebalance operation using `garage repair rebalance`. This is usefull when +rebalance operation using `garage repair rebalance`. This is useful when adding storage locations or when capacities of the storage locations have been changed. Once this is finished, Garage will know for each block of a single possible location where it can be, which can increase access speed. This diff --git a/doc/book/operations/layout.md b/doc/book/operations/layout.md index ee05aba1..cf1372b0 100644 --- a/doc/book/operations/layout.md +++ b/doc/book/operations/layout.md @@ -13,7 +13,7 @@ In Garage, all of the data that can be stored in a given cluster is divided into slices which we call *partitions*. Each partition is stored by one or several nodes in the cluster (see [`replication_mode`](@/documentation/reference-manual/configuration.md#replication_mode)). -The layout determines the correspondence between these partition, +The layout determines the correspondence between these partitions, which exist on a logical level, and actual storage nodes. ## How cluster layouts work in Garage @@ -94,10 +94,10 @@ follow the following recommendations: ## Understanding unexpected layout calculations When adding, removing or modifying nodes in a cluster layout, sometimes -unexpected assigntations of partitions to node can occur. These assignations -are in fact normal and logical, given the objectives of the algorihtm. Indeed, -**the layout algorithm prioritizes moving less data between nodes over the fact -of achieving equal distribution of load. It also tries to use all links between +unexpected assignations of partitions to node can occur. These assignations +are in fact normal and logical, given the objectives of the algorithm. Indeed, +**the layout algorithm prioritizes moving less data between nodes over +achieving equal distribution of load. It also tries to use all links between pairs of nodes in equal proportions when moving data.** This section presents two examples and illustrates how one can control Garage's behavior to obtain the desired results. @@ -270,5 +270,5 @@ that is moved to node1). This illustrates the second principle of the layout computation: **if there is a choice in moving data out of some nodes, then all links between pairs of nodes are used in equal proportions** (this is approximately true, there is -randomness in the algorihtm to achieve this so there might be some small +randomness in the algorithm to achieve this so there might be some small fluctuations, as we see above). diff --git a/doc/book/operations/upgrading.md b/doc/book/operations/upgrading.md index 9a738282..6b6ea26d 100644 --- a/doc/book/operations/upgrading.md +++ b/doc/book/operations/upgrading.md @@ -9,7 +9,7 @@ On a new version release, there is 2 possibilities: - protocols and data structures remained the same ➡️ this is a **minor upgrade** - protocols or data structures changed ➡️ this is a **major upgrade** -You can quickly now what type of update you will have to operate by looking at the version identifier: +You can quickly know what type of update you will have to operate by looking at the version identifier: when we require our users to do a major upgrade, we will always bump the first nonzero component of the version identifier (e.g. from v0.7.2 to v0.8.0). Conversely, for versions that only require a minor upgrade, the first nonzero component will always stay the same (e.g. from v0.8.0 to v0.8.1). -- cgit v1.2.3 From 1d30cf36c8ffb979d0868195c9172a60894c2d56 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Tue, 30 Jan 2024 14:27:39 +0100 Subject: [talk-fosdem-24] improve fosdem 24 talk --- doc/talks/2024-02-03-fosdem/talk.pdf | Bin 3782274 -> 3803923 bytes doc/talks/2024-02-03-fosdem/talk.tex | 94 ++++++++++++++++----- doc/talks/assets/screenshots/grafana_dashboard.png | Bin 468890 -> 403062 bytes doc/talks/assets/survey_requested_features.png | Bin 0 -> 80833 bytes 4 files changed, 73 insertions(+), 21 deletions(-) create mode 100644 doc/talks/assets/survey_requested_features.png (limited to 'doc') diff --git a/doc/talks/2024-02-03-fosdem/talk.pdf b/doc/talks/2024-02-03-fosdem/talk.pdf index 4345bf0a..4096835c 100644 Binary files a/doc/talks/2024-02-03-fosdem/talk.pdf and b/doc/talks/2024-02-03-fosdem/talk.pdf differ diff --git a/doc/talks/2024-02-03-fosdem/talk.tex b/doc/talks/2024-02-03-fosdem/talk.tex index 6c3e47f0..cebdb6b6 100644 --- a/doc/talks/2024-02-03-fosdem/talk.tex +++ b/doc/talks/2024-02-03-fosdem/talk.tex @@ -1,5 +1,5 @@ \nonstopmode -\documentclass[aspectratio=169]{beamer} +\documentclass[aspectratio=169,xcolor={svgnames}]{beamer} \usepackage[utf8]{inputenc} % \usepackage[frenchb]{babel} \usepackage{amsmath} @@ -176,7 +176,12 @@ \begin{frame} \frametitle{CRDTs / weak consistency instead of consensus} - Consensus can be implemented reasonably well in practice, so why avoid it? + + \underline{Internally, Garage uses only CRDTs} (conflict-free replicated data types) + + \vspace{2em} + No Raft, ... Why? + \vspace{1em} \begin{itemize} \item<2-> \textbf{Software complexity} @@ -191,8 +196,6 @@ \item<6-> \textbf{Takes time to reconverge} when disrupted (e.g. node going down) \end{itemize} \end{itemize} - \vspace{2em} - \visible<7->{\underline{Internally, Garage uses only CRDTs} (conflict-free replicated data types)} \end{frame} \begin{frame} @@ -263,11 +266,9 @@ \vspace{1em} \item Replication modes with 1 or 2 copies / weaker consistency \vspace{1em} - \item Kubernetes integration + \item Kubernetes integration for node discovery \vspace{1em} \item Admin API (v0.7.2) - \vspace{1em} - \item Experimental K2V API (v0.7.2) \end{itemize} \end{frame} @@ -323,7 +324,8 @@ \end{itemize} \vspace{2em} - \textbf{LMDB:} very stable, good performance, reasonably small files on disk + \textbf{LMDB:} very stable, good performance, file size is reasonable\\ + \textbf{Sqlite} also available as a second choice \vspace{1em} Sled will be removed in Garage v1.0 @@ -417,15 +419,15 @@ \textbf{Partition} & \textbf{Node 1} & \textbf{Node 2} & \textbf{Node 3} \\ \hline \hline - Partition 0 & Io (jupiter) & Drosera (atuin) & Courgette (neptune) \\ + Partition 0 & df-ymk (bespin) & Abricot (scorpio) & Courgette (neptune) \\ \hline - Partition 1 & Datura (atuin) & Courgette (neptune) & Io (jupiter) \\ + Partition 1 & Ananas (scorpio) & Courgette (neptune) & df-ykl (bespin) \\ \hline - Partition 2 & Io(jupiter) & Celeri (neptune) & Drosera (atuin) \\ + Partition 2 & df-ymf (bespin) & Celeri (neptune) & Abricot (scorpio) \\ \hline \hspace{1em}$\vdots$ & \hspace{1em}$\vdots$ & \hspace{1em}$\vdots$ & \hspace{1em}$\vdots$ \\ \hline - Partition 255 & Concombre (neptune) & Io (jupiter) & Drosera (atuin) \\ + Partition 255 & Concombre (neptune) & df-ykl (bespin) & Abricot (scorpio) \\ \hline \end{tabular} \end{center} @@ -484,9 +486,9 @@ \vspace{1em} {\small - \textbf{Property:} If node $A$ did an operation $write(x)$ and received an OK response,\\ - \hspace{2cm} and node $B$ starts an operation $read()$ after $A$ received OK,\\ - \hspace{2cm} then $B$ will read a value $x' \sqsupseteq x$. + \textbf{Property:} If client 1 did an operation $write(x)$ and received an OK response,\\ + \hspace{2cm} and client 2 starts an operation $read()$ after client 1 received OK,\\ + \hspace{2cm} then client 2 will read a value $x' \sqsupseteq x$. } \vspace{1.5em} @@ -539,10 +541,53 @@ \item We rely on quorums $k > n/2$ within each partition:\\ $$n=3,~~~~~~~k\ge 2$$ \item<2-> When rebalancing, the set of nodes responsible for a partition can change:\\ - $$\{A, B, C\} \to \{A, D, E\}$$ - \vspace{.01em} - \item<3-> During the rebalancing, $D$ and $E$ don't yet have the data,\\ - ~~~~~~~~~~~~~~~~~~~and $B$ and $C$ want to get rid of the data to free up space\\ + + \vspace{1em} + \begin{minipage}{.04\linewidth}~ + \end{minipage} + \begin{minipage}{.40\linewidth} + {\tiny + \begin{tabular}{|l|l|l|l|} + \hline + \textbf{Partition} & \textbf{Node 1} & \textbf{Node 2} & \textbf{Node 3} \\ + \hline + \hline + Partition 0 & \textcolor{Crimson}{df-ymk} & Abricot & \textcolor{Crimson}{Courgette} \\ + \hline + Partition 1 & Ananas & \textcolor{Crimson}{Courgette} & \textcolor{Crimson}{df-ykl} \\ + \hline + Partition 2 & \textcolor{Crimson}{df-ymf} & \textcolor{Crimson}{Celeri} & Abricot \\ + \hline + \hspace{1em}$\dots$ & \hspace{1em}$\dots$ & \hspace{1em}$\dots$ & \hspace{1em}$\dots$ \\ + \hline + \end{tabular} + } + \end{minipage} + \begin{minipage}{.04\linewidth} + $\to$ + \end{minipage} + \begin{minipage}{.40\linewidth} + {\tiny + \begin{tabular}{|l|l|l|l|} + \hline + \textbf{Partition} & \textbf{Node 1} & \textbf{Node 2} & \textbf{Node 3} \\ + \hline + \hline + Partition 0 & \textcolor{ForestGreen}{Dahlia} & Abricot & \textcolor{ForestGreen}{Eucalyptus} \\ + \hline + Partition 1 & Ananas & \textcolor{ForestGreen}{Euphorbe} & \textcolor{ForestGreen}{Doradille} \\ + \hline + Partition 2 & \textcolor{ForestGreen}{Dahlia} & \textcolor{ForestGreen}{Echinops} & Abricot \\ + \hline + \hspace{1em}$\dots$ & \hspace{1em}$\dots$ & \hspace{1em}$\dots$ & \hspace{1em}$\dots$ \\ + \hline + \end{tabular} + } + \end{minipage} + + \vspace{2em} + \item<3-> During the rebalancing, new nodes don't yet have the data,\\ + ~~~~~~~~~~~~~~~~~~~and old nodes want to get rid of the data to free up space\\ \vspace{1.2em} $\to$ risk of inconsistency, \textbf{how to coordinate?} \end{itemize} @@ -589,7 +634,7 @@ \end{frame} \begin{frame} - \frametitle{Towards v1.0} + \frametitle{Towards v1.0...} Focus on \underline{security \& stability} \vspace{2em} \begin{itemize} @@ -603,6 +648,13 @@ \end{itemize} \end{frame} +\begin{frame} + \frametitle{...and beyond!} + \begin{center} + \includegraphics[width=.6\linewidth]{../assets/survey_requested_features.png} + \end{center} +\end{frame} + % ======================================== OPERATING % ======================================== OPERATING % ======================================== OPERATING @@ -684,7 +736,7 @@ \end{itemize} \vspace{.5em} \end{itemize} - Current deployments: $< 10$ TB, we don't have much experience with more + Our deployments: $< 10$ TB. Some people have done more! \end{frame} diff --git a/doc/talks/assets/screenshots/grafana_dashboard.png b/doc/talks/assets/screenshots/grafana_dashboard.png index 2df1fc41..bda2d732 100644 Binary files a/doc/talks/assets/screenshots/grafana_dashboard.png and b/doc/talks/assets/screenshots/grafana_dashboard.png differ diff --git a/doc/talks/assets/survey_requested_features.png b/doc/talks/assets/survey_requested_features.png new file mode 100644 index 00000000..07247c46 Binary files /dev/null and b/doc/talks/assets/survey_requested_features.png differ -- cgit v1.2.3 From 76e09c047269995cb0f0b6dca53124a54d68da65 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Thu, 1 Feb 2024 11:43:21 +0100 Subject: [talk-fosdem-24] small change in talk --- doc/talks/2024-02-03-fosdem/talk.pdf | Bin 3803923 -> 3804091 bytes doc/talks/2024-02-03-fosdem/talk.tex | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) (limited to 'doc') diff --git a/doc/talks/2024-02-03-fosdem/talk.pdf b/doc/talks/2024-02-03-fosdem/talk.pdf index 4096835c..ef3f5c81 100644 Binary files a/doc/talks/2024-02-03-fosdem/talk.pdf and b/doc/talks/2024-02-03-fosdem/talk.pdf differ diff --git a/doc/talks/2024-02-03-fosdem/talk.tex b/doc/talks/2024-02-03-fosdem/talk.tex index cebdb6b6..b36bf893 100644 --- a/doc/talks/2024-02-03-fosdem/talk.tex +++ b/doc/talks/2024-02-03-fosdem/talk.tex @@ -180,7 +180,7 @@ \underline{Internally, Garage uses only CRDTs} (conflict-free replicated data types) \vspace{2em} - No Raft, ... Why? + Why not Raft, Paxos, ...? Issues of consensus algorithms: \vspace{1em} \begin{itemize} -- cgit v1.2.3 From fe37202f8fc2cf5397dfe71e253726964099c3e5 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Mon, 5 Feb 2024 12:16:09 +0100 Subject: [talk-fosdem-24] remove abstract.md --- doc/talks/2024-02-03-fosdem/abstract.md | 39 --------------------------------- 1 file changed, 39 deletions(-) delete mode 100644 doc/talks/2024-02-03-fosdem/abstract.md (limited to 'doc') diff --git a/doc/talks/2024-02-03-fosdem/abstract.md b/doc/talks/2024-02-03-fosdem/abstract.md deleted file mode 100644 index b2658868..00000000 --- a/doc/talks/2024-02-03-fosdem/abstract.md +++ /dev/null @@ -1,39 +0,0 @@ -### (fr) Garage, un système de stockage de données géo-distribué léger et robuste - -Garage est un système de stockage de données léger, géo-distribué, qui -implémente le protocole de stockage S3 de Amazon. Garage est destiné -principalement à l'auto-hébergement sur du matériel courant d'occasion. À ce -titre, il doit tolérer un grand nombre de pannes: coupures de courant, coupures -de connexion Internet, pannes de machines, ... Il doit également être facile à -déployer et à maintenir, afin de pouvoir être facilement utilisé par des -amateurs ou des petites organisations. - -Cette présentation vous proposera un aperçu de Garage et du choix technique -principal qui rend un système comme Garage possible: le refus d'utiliser des -algorithmes de consensus, remplacés avantageusement par des méthodes à -cohérence faible. Notre modèle est fortement inspiré de la base de donnée -Dynamo (DeCandia et al, 2007), et fait usage des types de données CRDT (Shapiro -et al, 2011). Nous exploreront comment ces méthodes s'appliquent à la -construction de l'abstraction "stockage objet" dans un système distribué, et -quelles autres abstractions peuvent ou ne peuvent pas être construites dans ce -modèle. - -### (en) Garage, a lightweight and robust geo-distributed data storage system - -Garage is a lightweight geo-distributed data store that implements the Amazon -S3 object storage protocol. Garage is meant primarily for self-hosting at home -on second-hand commodity hardware, meaning it has to tolerate a wide variety of -failure scenarios such as power cuts, Internet disconnections and machine -crashes. It also has to be easy to deploy and maintain, so that hobbyists and -small organizations can use it without trouble. - -This talk will present Garage and the key technical choice that made Garage -possible: refusing to use consensus algorithms and using instead weak -consistency methods, with a model that is loosely based on that of the Dynamo -database (DeCandia et al, 2007) and that makes heavy use of conflict-free -replicated data types (Shapiro et al, 2011). We will explore how these methods -are suited to building the "object store" abstraction in a distributed system, -and what other abstractions are possible or impossible to build in this model. - - - -- cgit v1.2.3 From 561fad0b44f78372357c1c76e3708a062d703b33 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Fri, 9 Feb 2024 12:19:16 +0100 Subject: [nix-improvements] get rid of Drone --- doc/book/design/goals.md | 2 -- doc/book/development/devenv.md | 2 +- doc/book/development/miscellaneous-notes.md | 8 ++--- doc/book/development/release-process.md | 55 +++++++++-------------------- 4 files changed, 21 insertions(+), 46 deletions(-) (limited to 'doc') diff --git a/doc/book/design/goals.md b/doc/book/design/goals.md index 78ac7978..4efb6349 100644 --- a/doc/book/design/goals.md +++ b/doc/book/design/goals.md @@ -48,7 +48,5 @@ locations. They use Garage themselves for the following tasks: - As a backup target using `rclone` and `restic` -- In the Drone continuous integration platform to store task logs - The Deuxfleurs Garage cluster is a multi-site cluster currently composed of 9 nodes in 3 physical locations. diff --git a/doc/book/development/devenv.md b/doc/book/development/devenv.md index dd3bdec0..88f8ba06 100644 --- a/doc/book/development/devenv.md +++ b/doc/book/development/devenv.md @@ -80,7 +80,7 @@ nix-build \ --git_version $(git rev-parse HEAD) ``` -*The result is located in `result/bin`. You can pass arguments to cross compile: check `.drone.yml` for examples.* +*The result is located in `result/bin`. You can pass arguments to cross compile: check `.woodpecker/release.yml` for examples.* If you modify a `Cargo.toml` or regenerate any `Cargo.lock`, you must run `cargo2nix`: diff --git a/doc/book/development/miscellaneous-notes.md b/doc/book/development/miscellaneous-notes.md index f0083ae5..a421943f 100644 --- a/doc/book/development/miscellaneous-notes.md +++ b/doc/book/development/miscellaneous-notes.md @@ -81,12 +81,9 @@ Our cache will be checked. - http://www.lpenz.org/articles/nixchannel/index.html -## Drone +## Woodpecker -Do not try to set a build as trusted from the interface or the CLI tool, -your request would be ignored. Instead, directly edit the database (table `repos`, column `repo_trusted`). - -Drone can do parallelism both at the step and the pipeline level. At the step level, parallelism is restricted to the same runner. +Woodpecker can do parallelism both at the step and the pipeline level. At the step level, parallelism is restricted to the same runner. ## Building Docker containers @@ -99,3 +96,4 @@ We were: - Unable to use the kaniko container provided by Google as we can't run arbitrary logic: we need to put our secret in .docker/config.json. Finally we chose to build kaniko through nix and use it in a `nix-shell`. +We then switched to using kaniko from nixpkgs when it was packaged. diff --git a/doc/book/development/release-process.md b/doc/book/development/release-process.md index 3fed4add..0c6701c0 100644 --- a/doc/book/development/release-process.md +++ b/doc/book/development/release-process.md @@ -42,7 +42,7 @@ and the docker containers on Docker Hub. ## Automation -We automated our release process with Nix and Drone to make it more reliable. +We automated our release process with Nix and Woodpecker to make it more reliable. Here we describe how we have done in case you want to debug or improve it. ### Caching build steps @@ -62,52 +62,31 @@ Sending to the cache is done through `nix copy`, for example: nix copy --to 's3://nix?endpoint=garage.deuxfleurs.fr®ion=garage&secret-key=/etc/nix/signing-key.sec' result ``` -*Note that you need the signing key. In our case, it is stored as a secret in Drone.* +*The signing key possessed by the Garage maintainers is required to update the Nix cache.* -The previous command will only send the built packet and not its dependencies. -To send its dependency, a tool named `nix-copy-closure` has been created but it is not compatible with the S3 protocol. - -Instead, you can use the following commands to list all the runtime dependencies: +The previous command will only send the built package and not its dependencies. +In the case of our CI pipeline, we want to cache all intermediate build steps +as well. This can be done using this quite involved command (here as an example +for the `pkgs.amd64.relase` package): ```bash -nix copy \ - --to 's3://nix?endpoint=garage.deuxfleurs.fr®ion=garage&secret-key=/etc/nix/signing-key.sec' \ - $(nix-store -qR result/) +nix copy -j8 \ + --to 's3://nix?endpoint=garage.deuxfleurs.fr®ion=garage&secret-key=/etc/nix/nix-signing-key.sec' \ + $(nix path-info pkgs.amd64.release --file default.nix --derivation --recursive | sed 's/\.drv$/.drv^*/') ``` -*We could also write this expression with xargs but this tool is not available in our container.* - -But in certain cases, we want to cache compile time dependencies also. -For example, the Nix project does not provide binaries for cross compiling to i686 and thus we need to compile gcc on our own. -We do not want to compile gcc each time, so even if it is a compile time dependency, we want to cache it. +This command will simultaneously build all of the required Nix paths (using at +most 8 parallel Nix builder jobs) and send the resulting objects to the cache. -This time, the command is a bit more involved: - -```bash -nix copy --to \ - 's3://nix?endpoint=garage.deuxfleurs.fr®ion=garage&secret-key=/etc/nix/signing-key.sec' \ - $(nix-store -qR --include-outputs \ - $(nix-instantiate)) -``` - -This is the command we use in our CI as we expect the final binary to change, so we mainly focus on -caching our development dependencies. - -*Currently there is no automatic garbage collection of the cache: we should monitor its growth. -Hopefully, we can erase it totally without breaking any build, the next build will only be slower.* - -In practise, we concluded that we do not want to cache all the compilation dependencies. -Instead, we want to cache the toolchain we use to build Garage each time we change it. -So we removed from Drone any automatic update of the cache and instead handle them manually with: +This can be run for all the Garage packages we build using the following command: ``` source ~/.awsrc -nix-shell --run 'refresh_toolchain' +nix-shell --attr cache --run 'refresh_cache' ``` -Internally, it will run `nix-build` on `nix/toolchain.nix` and send the output plus its depedencies to the cache. - -To erase the cache: +We don't automate this step at each CI build, as *there is currently no automatic garbage collection of the cache.* +This means we should also monitor the cache's size; if it ever becomes too big we can erase it with: ``` mc rm --recursive --force 'garage/nix/' @@ -157,9 +136,9 @@ nix-shell --run refresh_index If you want to compile for different architectures, you will need to repeat all these commands for each architecture. -**In practise, and except for debugging, you will never directly run these commands. Release is handled by drone** +**In practice, and except for debugging, you will never directly run these commands. Release is handled by Woodpecker.** -### Drone +### Drone (obsolete) Our instance is available at [https://drone.deuxfleurs.fr](https://drone.deuxfleurs.fr). You need an account on [https://git.deuxfleurs.fr](https://git.deuxfleurs.fr) to use it. -- cgit v1.2.3 From c86ac264cb6789fdc4c83378f275b76d57d88132 Mon Sep 17 00:00:00 2001 From: emilylange Date: Mon, 12 Feb 2024 17:51:01 +0100 Subject: doc: mention `warn` and `error` as available log levels For some users, this might be their first time being interacting with the `env_logger` crate. As such, they might not be aware that less verbose log levels exist. Some might not want to log every incoming request, for example. This commit also adds syntax hints to the code-fence for bash for better syntax highlighting of that section, and repeats itself multiple times, that `info` is, in fact, the default. No changes to the recommendation of log levels were made. --- doc/book/quick-start/_index.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'doc') diff --git a/doc/book/quick-start/_index.md b/doc/book/quick-start/_index.md index 1b129f36..cf6eabde 100644 --- a/doc/book/quick-start/_index.md +++ b/doc/book/quick-start/_index.md @@ -110,10 +110,11 @@ garage -c path/to/garage.toml server If you have placed the `garage.toml` file in `/etc` (its default location), you can simply run `garage server`. -You can tune Garage's verbosity as follows (from less verbose to more verbose): +You can tune Garage's verbosity by setting the `RUST_LOG=` environment variable. \ +Available log levels are (from less verbose to more verbose): `error`, `warn`, `info` *(default)*, `debug` and `trace`. -``` -RUST_LOG=garage=info garage server +```bash +RUST_LOG=garage=info garage server # default RUST_LOG=garage=debug garage server RUST_LOG=garage=trace garage server ``` -- cgit v1.2.3