From e4e405947edfeb2999a2bce84c347404c1fc00bd Mon Sep 17 00:00:00 2001 From: Romain Dessort Date: Mon, 21 May 2012 16:52:07 +0000 Subject: [PATCH] Add a first version of redis.tex (to be reread/completed). --- support/redis.tex | 157 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 support/redis.tex diff --git a/support/redis.tex b/support/redis.tex new file mode 100644 index 0000000..42a4086 --- /dev/null +++ b/support/redis.tex @@ -0,0 +1,157 @@ +% Copyright (c) 2004-2010 Evolix +% Permission is granted to copy, distribute and/or modify this document +% under the terms of the GNU Free Documentation License, Version 1.2 +% or any later version published by the Free Software Foundation; +% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +% A copy of the license is included at http://www.gcolpart.com/howto/fdl.html + +\chapter{Redis} + +Site officiel: \url{http://redis.io/} + +\section{Présentation} + +Redis est un jeune projet (première version sortie en 2009) de système de +gestion de bases de données no-SQL (\emph{Not Only SQL}) de type clé-valeur. Il +est écrit en C et son but est d'être hautement performant.\\ +Les données stockées peuvent être des chaines de caractères, tableaux, listes, +etc\dots + +Une caractéristique notable de Redis est que tout est stocké dans la RAM. Des +syncrhonisations sont faites de manière régulière sur le disque afin de rendre +les données persistantes. + +\section{Installation} + +Sous Debian Squeeze, la version 1.2.6 est présente dans les dépôts, et peut +être installée simplement: +\begin{verbatim} +# aptitude install redis-server +\end{verbatim} + +Cependant, il peut être utile d'avoir une version plus récente, et on peut +utiliser un backport du paquet qui fourni la version 2.4.2. Pour cela, si ce +n'est pas le cas, il faut ajouter le dépôt backport au \texttt{sources.list}: +\begin{verbatim} +deb http://backports.debian.org/debian-backports squeeze-backports main +\end{verbatim} + +Pour s'assurer d'avoir les mises à jour ultérieures sur le paquet +\texttt{redis-server}, il est nécessaire de rajouter dans le fichier +\texttt{/etc/apt/preferences.d/redis}: +\begin{verbatim}Package: redis-server +Pin: release a=squeeze-backports +Pin-Priority: 999 +\end{verbatim} + +\section{Configuration} + +La configuration de Redis se fait dans le fichier +\texttt{/etc/redis/redis.conf}, dont voici un exemple: +\begin{verbatim} +daemonize yes +pidfile /var/run/redis.pid +port 6379 +unixsocket /var/run/redis/redis.sock +bind 127.0.0.1 +timeout 300 +loglevel notice +logfile /var/log/redis/redis-server.log +databases 16 +save 900 1 +save 300 10 +save 60 10000 +dbfilename dump.rdb +dir /var/lib/redis +#requirepass +maxclients 128 +maxmemory 104857600 +\end{verbatim} + +\section{Sécurité} + +Il faut bien faire attention à restreindre l'accès aux données stockées dans les +bases de données Redis. Par défaut, aucune authentification n'est configurée. + +Redis peut être configuré pour écouter soit sur un socket réseau (par défaut +\texttt{127.0.0.1:6379}) soit via un socket unix. Dans le second cas, il est +aisé de positionner les bons droits unix sur le socket pour restreindre l'accès +à tout le monde. Pour cette raison, il est préférable de faire écouter Redis sur +un socket unix.\\ +Si le choix ne peut se poser et que Redis doit obligatoirement écouter sur un +socket réseau (en local ou non), il est important de configurer une +authentification sur les bases de données. + +Redis implémente une couche d'authentification extrêmement minimaliste: pas de +gestion de comptes, mais un unique mot de passe défini en clair dans le fichier +de configuration de Redis. Il sera alors nécessaire, après chaque connexion à la +base, d'exécuter la commande Redis \texttt{AUTH} suivie du mot de passe. + +Étant donné que Redis est capable de traité un nombre très élevé de requêtes par +seconde, les attaques par brute-force se font plus rapide et il est donc +conseillé de définir un mot de passe très long. + +\section{Utilisation} + +Voici un aperçu de l'utilisation de Redis: +\begin{itemize} + \item Connexion au serveur (via un socket unix): + \begin{verbatim}$ redis-cli -s /var/run/redis/redis.sock\end{verbatim} + \item Ajout d'une entrée: + \begin{verbatim}redis> set foo 3 +OK\end{verbatim} + \item Ajout de plusieurs entrée: + \begin{verbatim}redis> mset un 1 deux 2 trois 3 quatre 4 +OK\end{verbatim} + \item Récupération d'une entrée: + \begin{verbatim}redis> get foo +(nil)\end{verbatim} + \item Listage des clé: + \begin{verbatim}redis> keys * +1) "un" +2) "foo" +3) "deux" +4) "trois" +5) "quatre"\end{verbatim} + \item Récupération des entrées qui contiennent \emph{r}: + \begin{verbatim}redis> *keys *r* +1) "quatre" +2) "trois"\end{verbatim} +\end{itemize} + +\section{Sauvegardes} + +Redis sauvegarde régulièrement le contenu de sa base de donnée (en RAM) sur le +disque, dans le seul fichier \texttt{/var/lib/redis/dump.rdb} (par défaut). Il +suffit donc de copier ce fichier pour en faire une sauvegarde. + +La restauration consiste à éteindre Redis, copier le fichier sauvegardé à son +bon emplacement, et redémarrer Redis. + +\section{Réplication} + +\subsection{Fonctionnement} + +Redis supporte la réplication master-slaves, avec quelques caractéristiques +intéressantes: un master peut avoir plusieurs slave, et un slave peut être +master d'un autre slave (ce qui permet de faire de la réplication +cascadée). + +Après ça mise en place, la réplication se passe en deux temps. Premièrement, le +master va envoyer l'intégralité de sa base de données au(x) slave(s). Les +données seront alors créés sur le disque, puis chargé en mémoire. Une fois que +les données sont identiques entre le master et le(s) slave(s), le master +transmet au(x) slave(s) les modifications qui sont effectuées. Les commandes +transmises sont les mêmes que pour interagir avec le master. + +\subsection{Configuration} + +La mise en place de la réplication est extrêmement simple: il suffit de rajouter +la directive \texttt{slaveof } dans la configuration de Redis, en +prenant bien sûr soin d'adapter l'IP et le port du master. + +Si le master demande une authentification (ce qui devrait être le cas si il est +correctement configuré), il faut ajouter la directive \texttt{masterauth +}, avec le mot de passe du master. + +