% 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 synchronisations 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 traiter 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ées: \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és: \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 sa 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ées 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.