Memcached · 7 min read · Jan 20, 2026
Como Instalar Memcached Com repcached "Replicação Lado Servidor Integrada" No Debian Lenny
Como Instalar Memcached Com repcached “Replicação Lado Servidor Integrada” No Debian Lenny
As pessoas provavelmente conhecem o memcached ( http://memcached.org/) e sua interface de cache de objetos em memória baseada em nome-valor de alto desempenho. Seu principal objetivo é fornecer um mecanismo de cache distribuído fácil de usar em um ambiente multinode. Você já quis deixar o memcached lidar com a replicação?
Se você gostaria de adicionar capacidades de alta disponibilidade, é aconselhável deixar o cliente (-biblioteca) lidar com a replicação de seus dados em todos os nós. Vamos supor que o uso do memcached como backend de armazenamento para sessões php esteja configurado da seguinte forma:
# configuração para o módulo 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"Agora as sessões são distribuídas (não replicadas) entre os dois nós. Assim que um nó falhar, você perderá todos esses dados. Enquanto você usar o memcached apenas como um impulsionador de desempenho e distribuidor de alguns dados “cacheáveis”, isso não deve ser um problema: os dados perdidos são preenchidos como foram ao criar as entradas de cache.
Para replicar seus dados de sessão, você precisará usar um manipulador de sessão personalizado que se conecte a cada um desses nós por conta própria… para replicação. O mesmo se você quiser gravar alguns objetos em cache no seu querido memcached. Ainda assim, sua aplicação precisa conhecer todos os nós para os quais escrever.
Facilite a replicação deixando o memcached resolver isso como repcached
Esses problemas podem confundir desenvolvedores que apenas querem se concentrar em sua aplicação e não querem se preocupar tanto com HA, balanceamento de carga e escalabilidade. Com o repcached, pelo menos uma solução HA de 2 nós pode ser configurada de forma fácil e transparente.
Um simples patch adiciona uma replicação mestre-mestre sofisticada ao seu memcached. Agora você só precisa se conectar ao seu memcached local, que então lida com a replicação por conta própria.
Assim, sua aplicação pode permanecer simples e direta, usando seu sistema de arquivos POSIX local (que pode ser replicado pelo DRBD, GlusterFS, etc), seu banco de dados local (você adivinhou: “que lida com a replicação por conta própria”) e se conectando a uma instância local do seu “cluster-memcached”. Essa configuração abre opções mais simples e transparentes para uma escalabilidade HA fácil e leve.
Instalação, configuração e teste de um cluster de 2 nós
Primeiro, pegue uma cópia do patch repcached ou até mesmo baixe a fonte do memcached pré-patchada de http://repcached.lab.klab.org/. Há uma dependência do libevent que pode precisar ser resolvida antes da instalação.
root@ha-01 ~ # apt-get install libevent-devAgora descompacte e entre no diretório:
root@ha-01 ~ # tar xvf memcached-1.2.8-repcached-2.2.tar
root@ha-01 ~ # cd memcached-1.2.8-repcached-2.2/
Configure com a opção –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
Não se preocupe muito com um pacote memcached.dep instalado anteriormente. Esta instalação manual apenas instalará um binário em /usr/local/bin/memcached, deixando seu memcached “original” intocado em /usr/bin/memcached.
Em contraste com o pacote debian, você pode querer fornecer opções de linha de comando usando uma configuração padrão simples em /etc/default/memcachedrep (rep => ‘replicação’), ou seja:
configuração padrão
## opções extras de linha de comando para iniciar o memcached em modo replicado
# -x < ip_addr > nome do host ou endereço IP do servidor de replicação mestre
# -X < num > número da porta TCP do mestre (padrão: 11212)
DAEMON_ARGS="-m 64 -p 11211 -u root -P /var/run/memcachedrep.pid -d -x 192.168.168.2"Com isso em mente, um script de inicialização é configurado de forma bastante fácil usando e modificando o esqueleto debian:
script de inicialização
#! /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 - Daemon de cache de memória replicado
# Description: memcached - Daemon de cache de memória replicado
### END INIT INFO
# Autor: Marcus Spiegel <[email protected]>
#
# Por favor, remova as linhas "Autor" acima e substitua-as
# pelo seu próprio nome se você copiar e modificar este script.
# Não "set -e"
# PATH deve incluir apenas /usr/* se for executado após o 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="sim"
# Saia se o pacote não estiver instalado
[ -x "$DAEMON" ] || exit 0
# Leia o arquivo de variável de configuração se estiver presente
[ -r /etc/default/$DESC ] && . /etc/default/$DESC
# Carregue a configuração VERBOSE e outras variáveis rcS
. /lib/init/vars.sh
# Defina funções de log_* LSB.
# Dependa do lsb-base (>= 3.0-6) para garantir que este arquivo esteja presente.
. /lib/lsb/init-functions
#
# Função que inicia o daemon/serviço
#
do_start()
{
# Retornar
# 0 se o daemon foi iniciado
# 1 se o daemon já estava em execução
# 2 se o daemon não pôde ser iniciado
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
# Adicione código aqui, se necessário, que espera o processo estar pronto
# para lidar com solicitações de serviços iniciados posteriormente que dependem
# deste. Como último recurso, durma por algum tempo.
}
#
# Função que para o daemon/serviço
#
do_stop()
{
# Retornar
# 0 se o daemon foi parado
# 1 se o daemon já estava parado
# 2 se o daemon não pôde ser parado
# outro se ocorreu uma falha
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Aguarde também os filhos terminarem se este for um daemon que bifurca
# e se o daemon for executado apenas a partir deste script de inicialização.
# Se as condições acima não forem satisfeitas, adicione algum outro código
# que espera o processo liberar todos os recursos que podem ser
# necessários por serviços iniciados posteriormente. Um último recurso é
# dormir por algum tempo.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Muitos daemons não excluem seus arquivos pid quando saem.
rm -f $PIDFILE
return "$RETVAL"
}
#
# Função que envia um SIGHUP para o daemon/serviço
#
do_reload() {
#
# Se o daemon pode recarregar sua configuração sem
# reiniciar (por exemplo, quando recebe um SIGHUP),
# então implemente isso aqui.
#
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
return 0
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Iniciando $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 "Parando $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() não estiver implementado, deixe isso comentado
# e deixe 'force-reload' como um alias para 'restart'.
#
#log_daemon_msg "Recarregando $DESC" "$NAME"
#do_reload
#log_end_msg $?
#;;
restart|force-reload)
#
# Se a opção "reload" estiver implementada, remova o
# alias 'force-reload'
#
log_daemon_msg "Reiniciando $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # O processo antigo ainda está em execução
*) log_end_msg 1 ;; # Falha ao iniciar
esac
;;
*)
# Falha ao parar
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
:Testando
Após configurar o repcached em ambos os nós, você deve provavelmente testar isso. Você pode se conectar ao memcached em cada nó pelo telnet:
root@ha-01 ~ # telnet 127.0.0.1 11211
Tentando 127.0.0.1…
Conectado a 127.0.0.1.
O caractere de escape é ‘^]’.
Agora emita um comando set para escrever alguns valores de teste apenas em um nó:
set foo 0 0 3
bar
STORED
mude para o outro nó, conecte-se e tente ler:
root@ha-02 ~ # telnet 127.0.0.1 11211
Tentando 127.0.0.1…
Conectado a 127.0.0.1.
O caractere de escape é ‘^]’.
get foo
VALUE foo 0 3
bar
END
Tente isso vice-versa e divirta-se! E finalmente derrube um desses nós depois de ter enviado mais valores para a memória. O nó em execução ainda continua respondendo com todos os dados - excelente.
A parte realmente divertida é que, assim que você reiniciar o nó indisponível, ele recupera todos os dados “perdidos” do outro mestre. Vá em frente, tente por conta própria. O mesmo acontecerá se você agora derrubar o outro nó e trazê-lo de volta novamente. Mesmo os dados que foram definidos para um nó enquanto o outro nó estava fora serão adicionados ao nó que está voltando após a inicialização.
Essa configuração é capaz de um setup de replicação de 2 nós apenas - ainda. Pense em construir um cluster de 4 nós com uma espécie de configuração raid10 onde replicação e distribuição são combinadas… ou algo assim. Bem, pelo menos nesse setup de 2 nós, o repcached funciona como um encanto.
Pessoalmente, eu gostaria de tentar um círculo de 3 nós a seguir :) (talvez junto com heartbeat para fechar qualquer falta nesse círculo).
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.