Memcached Install · 7 min read · Jan 20, 2026
ComeInstallare Memcached Con repcached "Replica Lato Server Integrata" Su Debian Lenny
ComeInstallare Memcached Con repcached “Replica Lato Server Integrata” Su Debian Lenny
Le persone probabilmente conoscono memcached ( http://memcached.org/) e la sua interfaccia di cache di oggetti in memoria basata su nome-valore ad alte prestazioni. Il suo scopo principale è fornire un motore di caching distribuito facile da usare in un ambiente multinodo. Hai mai voluto lasciare che memcached gestisse la replica?
Se desideri aggiungere capacità di alta disponibilità, ti consiglio di lasciare che il client (-libreria) gestisca la replica dei tuoi dati su tutti i nodi. Supponiamo che l’uso di memcached come backend di archiviazione per le sessioni php sia configurato come segue:
# configurazione per il modulo php memcache
extension=memcache.so
session.save_handler = memcache
session.save_path = "tcp://192.168.168.61:11211?persistent=1,tcp://192.168.168.62:11211?persistent=1"Ora le sessioni vengono distribuite (non replicate) attraverso entrambi i nodi. Non appena un nodo va giù, perderai tutti quei dati. Finché usi solo memcached come potenziatore di prestazioni e distributore di alcuni dati “cacheabili”, non dovrebbe essere un problema: i dati persi vengono ripristinati come sono stati creati durante la creazione delle voci di cache.
Per replicare i tuoi dati di sessione, dovrai utilizzare un gestore di sessione personalizzato che si connette a ciascuno di questi nodi da solo… per la replica. Lo stesso se desideri scrivere alcuni oggetti memorizzati nel tuo amato memcached. Tuttavia, la tua applicazione deve conoscere tutti i nodi a cui scrivere.
Semplificare la replica lasciando che memcached si occupi di tutto come repcached
Questi problemi potrebbero confondere gli sviluppatori che vogliono solo concentrarsi sulla loro applicazione e non vogliono preoccuparsi troppo di HA, bilanciamento del carico e scalabilità. Con repcached, almeno una soluzione HA a 2 nodi può essere impostata facilmente e in modo trasparente.
Una semplice patch aggiunge una replica master-master elegante al tuo memcached. Ora dovrai solo connetterti al tuo memcached locale che gestisce la replica da solo.
Quindi la tua applicazione può rimanere semplice e stupida, utilizzando il tuo filesystem POSIX locale (che potrebbe essere replicato da DRBD, GlusterFS, ecc.), il tuo Database locale (hai indovinato: “che gestisce la replica da solo”) e connettendoti a un’istanza locale del tuo “cluster memcached”. Questa configurazione apre alcune opzioni più semplici e trasparenti per una scalabilità HA facile e leggera.
Installazione, configurazione e test di un cluster a 2 nodi
Prima prendi una copia della patch repcached o scarica anche il sorgente memcached pre-patchato da http://repcached.lab.klab.org/. C’è una dipendenza da libevent che potrebbe dover essere risolta prima dell’installazione.
root@ha-01 ~ # apt-get install libevent-devOra estrai e cd nella directory:
root@ha-01 ~ # tar xvf memcached-1.2.8-repcached-2.2.tar
root@ha-01 ~ # cd memcached-1.2.8-repcached-2.2/
Configura con l’opzione –enable-repcached.
root@ha-01 ~/memcached-1.2.8-repcached-2.2 # ./configure –enable-replication
root@ha-01 ~/memcached-1.2.8-repcached-2.2 # make
root@ha-01 ~/memcached-1.2.8-repcached-2.2 # make install
Non preoccuparti troppo di un pacchetto memcached.dep precedentemente installato. Questa installazione manuale installerà solo un binario in /usr/local/bin/memcached lasciando il tuo memcached “originale” intatto in /usr/bin/memcached.
A differenza del pacchetto debian, potresti voler fornire opzioni da riga di comando utilizzando una semplice configurazione predefinita in /etc/default/memcachedrep (rep => ‘replica’), ad esempio:
configurazione predefinita
## opzioni extra da riga di comando per avviare memcached in modalità replicata
# -x < ip_addr > nome host o indirizzo IP del server di replica master
# -X < num > numero di porta TCP del master (predefinito: 11212)
DAEMON_ARGS="-m 64 -p 11211 -u root -P /var/run/memcachedrep.pid -d -x 192.168.168.2"Con questo in atto, uno script di init è impostato abbastanza facilmente utilizzando e modificando lo scheletro debian:
script di init
#! /bin/sh
### BEGIN INIT INFO
# Provides: memcached
# Required-Start: $syslog
# Required-Stop: $syslog
# Should-Start: $local_fs
# Should-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: memcached - Demone di caching in memoria replicato
# Description: memcached - Demone di caching in memoria replicato
### END INIT INFO
# Autore: Marcus Spiegel <[email protected]>
#
# Si prega di rimuovere le righe "Autore" sopra e sostituirle
# con il proprio nome se si copia e modifica questo script.
# NON "set -e"
# PATH dovrebbe includere solo /usr/* se viene eseguito dopo lo script mountnfs.sh
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="memcachedrep"
NAME=memcached
DAEMON=/usr/local/bin/$NAME
DAEMON_ARGS="--options args"
PIDFILE=/var/run/memcachedrep.pid
SCRIPTNAME=/etc/init.d/$DESC
VERBOSE="yes"
# Esci se il pacchetto non è installato
[ -x "$DAEMON" ] || exit 0
# Leggi il file delle variabili di configurazione se è presente
[ -r /etc/default/$DESC ] && . /etc/default/$DESC
# Carica l'impostazione VERBOSE e altre variabili rcS
. /lib/init/vars.sh
# Definisci le funzioni di log_* LSB.
# Dipendi da lsb-base (>= 3.0-6) per garantire che questo file sia presente.
. /lib/lsb/init-functions
#
# Funzione che avvia il demone/servizio
#
do_start()
{
# Restituisci
# 0 se il demone è stato avviato
# 1 se il demone era già in esecuzione
# 2 se il demone non poteva essere avviato
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
$DAEMON_ARGS \
|| return 2
# Aggiungi codice qui, se necessario, che attende che il processo sia pronto
# per gestire le richieste dai servizi avviati successivamente che dipendono
# da questo. Come ultima risorsa, attendi per un po'.
}
#
# Funzione che ferma il demone/servizio
#
do_stop()
{
# Restituisci
# 0 se il demone è stato fermato
# 1 se il demone era già fermo
# 2 se il demone non poteva essere fermato
# altro se si è verificato un errore
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Attendi che anche i figli finiscano se questo è un demone che fork
# e se il demone viene eseguito solo da questo script di init.
# Se le condizioni sopra non sono soddisfatte, aggiungi un altro codice
# che attende che il processo rilasci tutte le risorse che potrebbero essere
# necessarie ai servizi avviati successivamente. Un'ultima risorsa è
# attendere per un po'.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Molti demoni non eliminano i loro pidfile quando escono.
rm -f $PIDFILE
return "$RETVAL"
}
#
# Funzione che invia un SIGHUP al demone/servizio
#
do_reload() {
#
# Se il demone può ricaricare la sua configurazione senza
# riavviarsi (ad esempio, quando gli viene inviato un SIGHUP),
# implementa qui.
#
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
return 0
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Avvio di $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Arresto di $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
#reload|force-reload)
#
# Se do_reload() non è implementato, lascia questo commentato
# e lascia 'force-reload' come alias per 'restart'.
#
#log_daemon_msg "Ricaricamento di $DESC" "$NAME"
#do_reload
#log_end_msg $?
#;;
restart|force-reload)
#
# Se l'opzione "reload" è implementata, rimuovi il
# alias 'force-reload'
#
log_daemon_msg "Riavvio di $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Il processo precedente è ancora in esecuzione
*) log_end_msg 1 ;; # Impossibile avviare
esac
;;
*)
# Impossibile fermare
log_end_msg 1
;;
esac
;;
*)
#echo "Uso: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
echo "Uso: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
exit 3
;;
esac
:Test
Dopo aver impostato repcached su entrambi i nodi, dovresti probabilmente testarlo. Potresti connetterti a memcached su ciascun nodo tramite telnet:
root@ha-01 ~ # telnet 127.0.0.1 11211
Trying 127.0.0.1…
Connected to 127.0.0.1.
Escape character is ‘^]’.
Ora emetti un comando set per scrivere alcuni valori di test solo su un nodo:
set foo 0 0 3
bar
STORED
Spostati sull’altro nodo, connettiti e prova a leggere:
root@ha-02 ~ # telnet 127.0.0.1 11211
Trying 127.0.0.1…
Connected to 127.0.0.1.
Escape character is ‘^]’.
get foo
VALUE foo 0 3
bar
END
Prova viceversa e divertiti! E infine spegni uno di questi nodi dopo aver inserito alcuni valori in memoria. Il nodo in esecuzione continua a rispondere con tutti i dati - eccellente.
La parte davvero divertente è che, non appena riavvii il nodo non disponibile, recupera tutti i dati “persi” dall’altro master. Prova da solo. Lo stesso accadrà se ora spegni l’altro nodo e lo riaccendi. Anche i dati che sono stati impostati su un nodo mentre l’altro nodo era giù verranno aggiunti al nodo in arrivo dopo l’avvio.
Questa configurazione è in grado di un setup di replica a 2 nodi solo - per ora. Pensa a costruire un cluster a 4 nodi con una sorta di configurazione raid10 in cui replica e distribuzione sono combinate… o qualcosa del genere. Beh, almeno in quel setup HA a 2 nodi, repcached funziona come un incanto.
Personalmente mi piacerebbe provare un cerchio di 3 nodi la prossima volta :) (magari insieme a heartbeat per chiudere eventuali lacune in quel cerchio).
Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.