156 lines
5.7 KiB
TeX
156 lines
5.7 KiB
TeX
% Copyright (c) 2004-2010 Evolix <info@evolix.fr>
|
|
% 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 <password>
|
|
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 <IP> <port>} 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
|
|
<password>}, avec le mot de passe du master.
|
|
|
|
|