evoformations/support/redis.tex

156 lines
5.7 KiB
TeX
Raw Normal View History

% 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<EFBFBD>sentation}
Redis est un jeune projet (premi<6D>re version sortie en 2009) de syst<73>me de
gestion de bases de donn<6E>es no-SQL (\emph{Not Only SQL}) de type cl<63>-valeur. Il
est <20>crit en C et son but est d'<27>tre hautement performant.\\
Les donn<6E>es stock<63>es peuvent <20>tre des chaines de caract<63>res, tableaux, listes,
etc\dots
Une caract<63>ristique notable de Redis est que tout est stock<63> dans la RAM. Des
2012-05-22 03:42:54 +02:00
synchronisations sont faites de mani<6E>re r<>guli<6C>re sur le disque afin de rendre
les donn<6E>es persistantes.
\section{Installation}
Sous Debian Squeeze, la version 1.2.6 est pr<70>sente dans les d<>p<EFBFBD>ts, et peut
<EFBFBD>tre install<6C>e simplement:
\begin{verbatim}
# aptitude install redis-server
\end{verbatim}
Cependant, il peut <20>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<EFBFBD>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 <20> jour ult<6C>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<EFBFBD>curit<EFBFBD>}
Il faut bien faire attention <20> restreindre l'acc<63>s aux donn<6E>es stock<63>es dans les
bases de donn<6E>es Redis. Par d<>faut, aucune authentification n'est configur<75>e.
Redis peut <20>tre configur<75> pour <20>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<EFBFBD> de positionner les bons droits unix sur le socket pour restreindre l'acc<63>s
<EFBFBD> tout le monde. Pour cette raison, il est pr<70>f<EFBFBD>rable de faire <20>couter Redis sur
un socket unix.\\
Si le choix ne peut se poser et que Redis doit obligatoirement <20>couter sur un
socket r<>seau (en local ou non), il est important de configurer une
authentification sur les bases de donn<6E>es.
Redis impl<70>mente une couche d'authentification extr<74>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<70>s chaque connexion <20> la
base, d'ex<65>cuter la commande Redis \texttt{AUTH} suivie du mot de passe.
2012-05-21 23:48:06 +02:00
<EFBFBD>tant donn<6E> que Redis est capable de traiter un nombre tr<74>s <20>lev<65> de requ<71>tes par seconde, les attaques par brute-force se font plus rapide et il est donc conseill<6C> de d<>finir un mot de passe tr<74>s long.
\section{Utilisation}
Voici un aper<65>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<74>e:
\begin{verbatim}redis> set foo 3
OK\end{verbatim}
2012-05-21 23:48:06 +02:00
\item Ajout de plusieurs entr<74>es:
\begin{verbatim}redis> mset un 1 deux 2 trois 3 quatre 4
OK\end{verbatim}
\item R<>cup<75>ration d'une entr<74>e:
\begin{verbatim}redis> get foo
(nil)\end{verbatim}
2012-05-21 23:48:06 +02:00
\item Listage des cl<63>s:
\begin{verbatim}redis> keys *
1) "un"
2) "foo"
3) "deux"
4) "trois"
5) "quatre"\end{verbatim}
\item R<>cup<75>ration des entr<74>es qui contiennent \emph{r}:
\begin{verbatim}redis> *keys *r*
1) "quatre"
2) "trois"\end{verbatim}
\end{itemize}
\section{Sauvegardes}
Redis sauvegarde r<>guli<6C>rement le contenu de sa base de donn<6E>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 <20> <20>teindre Redis, copier le fichier sauvegard<72> <20> son
bon emplacement, et red<65>marrer Redis.
\section{R<EFBFBD>plication}
\subsection{Fonctionnement}
Redis supporte la r<>plication master-slaves, avec quelques caract<63>ristiques
int<EFBFBD>ressantes: un master peut avoir plusieurs slave, et un slave peut <20>tre
master d'un autre slave (ce qui permet de faire de la r<>plication
cascad<EFBFBD>e).
2012-05-21 23:48:06 +02:00
Apr<EFBFBD>s sa mise en place, la r<>plication se passe en deux temps. Premi<6D>rement, le
master va envoyer l'int<6E>gralit<69> de sa base de donn<6E>es au(x) slave(s). Les
2012-05-21 23:48:06 +02:00
donn<EFBFBD>es seront alors cr<63><72>s sur le disque, puis charg<72>es en m<>moire. Une fois que
les donn<6E>es sont identiques entre le master et le(s) slave(s), le master
transmet au(x) slave(s) les modifications qui sont effectu<74>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<74>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 <20>tre le cas si il est
correctement configur<75>), il faut ajouter la directive \texttt{masterauth
<password>}, avec le mot de passe du master.