web-dev-qa-db-fra.com

Comment pouvons-nous créer deux instances de serveur memcached sur le même serveur dans un port différent?

J'ai essayé d'ajouter de la manière -l 11211 -l 11212 dans le fichier conf memcached. Mais il écoute juste le premier, c'est-à-dire 1121

33
panalbish

Voici ce que memcached dit que le -l commande est pour:

-l <addr>     interface to listen on (default: INADDR_ANY, all addresses)
              <addr> may be specified as Host:port. If you don't specify
              a port number, the value you specified with -p or -U is
              used. You may specify multiple addresses separated by comma
              or by using -l multiple times

Tout d'abord, vous devez spécifier l'interface sur laquelle vous souhaitez que memcached écoute si vous utilisez le -l drapeau. Utilisation 0.0.0.0 pour toutes les interfaces et utilisez 127.0.0.1 est que vous voulez juste pouvoir accéder à memcached à partir de localhost. Deuxièmement, n'utilisez pas deux -l drapeaux. N'utilisez qu'une seule et séparez chaque adresse par une virgule. La commande ci-dessous devrait faire ce que vous voulez.

memcached -l 0.0.0.0:11211,0.0.0.0:11212

Gardez à l'esprit que cela aura une écoute memcached sur deux ports. Pour avoir deux instances memcached sur une machine, exécutez ces deux commandes.

memcached -p 11211 -d

memcached -p 11212 -d
45
mikewied

J'ai d'abord utilisé la solution de mikewied, mais j'ai ensuite rencontré le problème du démarrage automatique du démon. Une autre chose déroutante dans cette solution est qu'elle n'utilise pas la configuration de etc. J'étais sur le point de créer mes propres scripts de démarrage dans /etc/init.d mais j'ai ensuite regardé dans le fichier /etc/init.d/memcached et vu cette belle solution

# Usage:
# cp /etc/memcached.conf /etc/memcached_server1.conf
# cp /etc/memcached.conf /etc/memcached_server2.conf
# start all instances:
# /etc/init.d/memcached start
# start one instance:
# /etc/init.d/memcached start server1
# stop all instances:
# /etc/init.d/memcached stop
# stop one instance:
# /etc/init.d/memcached stop server1
# There is no "status" command.

Fondamentalement, les lecteurs de cette question ont juste besoin de lire le /etc/init.d/memcached fichier.

À votre santé

65
Davyd Dzhahaiev

La réponse de David Dzhagayev est la meilleure. Si vous n'avez pas la bonne version du script d'initialisation memcache, voici celle dont il parle:

Cela devrait fonctionner avec n'importe quelle distribution Linux utilisant init.

#! /bin/bash
### BEGIN INIT INFO
# Provides:            memcached
# Required-Start:      $remote_fs $syslog
# Required-Stop:       $remote_fs $syslog
# Should-Start:                $local_fs
# Should-Stop:         $local_fs
# Default-Start:       2 3 4 5
# Default-Stop:                0 1 6
# Short-Description:   Start memcached daemon
# Description:         Start up memcached, a high-performance memory caching daemon
### END INIT INFO

# Usage:
# cp /etc/memcached.conf /etc/memcached_server1.conf
# cp /etc/memcached.conf /etc/memcached_server2.conf
# start all instances:
# /etc/init.d/memcached start
# start one instance:
# /etc/init.d/memcached start server1
# stop all instances:
# /etc/init.d/memcached stop
# stop one instance:
# /etc/init.d/memcached stop server1
# There is no "status" command.

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/memcached
DAEMONNAME=memcached
DAEMONBOOTSTRAP=/usr/share/memcached/scripts/start-memcached
DESC=memcached

test -x $DAEMON || exit 0
test -x $DAEMONBOOTSTRAP || exit 0

set -e

. /lib/lsb/init-functions

# Edit /etc/default/memcached to change this.
ENABLE_MEMCACHED=no
test -r /etc/default/memcached && . /etc/default/memcached


FILES=(/etc/memcached_*.conf)
# check for alternative config schema
if [ -r "${FILES[0]}" ]; then
  CONFIGS=()
  for FILE in "${FILES[@]}";
  do
    # remove prefix
    NAME=${FILE#/etc/}
    # remove suffix
    NAME=${NAME%.conf}

    # check optional second param
    if [ $# -ne 2 ];
    then
      # add to config array
      CONFIGS+=($NAME)
    Elif [ "memcached_$2" == "$NAME" ];
    then
      # use only one memcached
      CONFIGS=($NAME)
      break;
    fi;
  done;

  if [ ${#CONFIGS[@]} == 0 ];
  then
    echo "Config not exist for: $2" >&2
    exit 1
  fi;
else
  CONFIGS=(memcached)
fi;

CONFIG_NUM=${#CONFIGS[@]}
for ((i=0; i < $CONFIG_NUM; i++)); do
  NAME=${CONFIGS[${i}]}
  PIDFILE="/var/run/${NAME}.pid"

case "$1" in
  start)
       echo -n "Starting $DESC: "
       if [ $ENABLE_MEMCACHED = yes ]; then
            start-stop-daemon --start --quiet --exec "$DAEMONBOOTSTRAP" -- /etc/${NAME}.conf $PIDFILE
            echo "$NAME."
       else
            echo "$NAME disabled in /etc/default/memcached."
       fi
       ;;
  stop)
       echo -n "Stopping $DESC: "
       start-stop-daemon --stop --quiet --oknodo --retry 5 --pidfile $PIDFILE --exec $DAEMON
       echo "$NAME."
       rm -f $PIDFILE
       ;;

  restart|force-reload)
       #
       #       If the "reload" option is implemented, move the "force-reload"
       #       option to the "reload" entry above. If not, "force-reload" is
       #       just the same as "restart".
       #
       echo -n "Restarting $DESC: "
       start-stop-daemon --stop --quiet --oknodo --retry 5 --pidfile $PIDFILE
       rm -f $PIDFILE
       if [ $ENABLE_MEMCACHED = yes ]; then
                start-stop-daemon --start --quiet --exec "$DAEMONBOOTSTRAP" -- /etc/${NAME}.conf $PIDFILE
                echo "$NAME."
       else
            echo "$NAME disabled in /etc/default/memcached."
       fi
       ;;
  status)
       status_of_proc -p $PIDFILE $DAEMON $NAME  && exit 0 || exit $?
       ;;
  *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|restart|force-reload|status}" >&2
        exit 1
        ;;
esac
done;

exit 0
3

Solution simple pour Centos 6

Première copie /etc/sysconfig/memcached à /etc/sysconfig/memcached2 et écrivez de nouveaux paramètres dans le nouveau fichier.

Copiez ensuite /etc/init.d/memcached à /etc/init.d/memcached2 et modifiez le nouveau fichier:

  • PORT vers votre nouveau port (il doit être réinitialisé à partir de /etc/sysconfig/memcached2, donc on le fait juste au cas où)
  • /etc/sysconfig/memcached à /etc/sysconfig/memcached2
  • /var/run/memcached/memcached.pid à /var/run/memcached/memcached2.pid
  • /var/lock/subsys/memcached à /var/lock/subsys/memcached2

Vous pouvez maintenant utiliser service memcached2 start, service memcached2 stop etc. N'oubliez pas chkconfig memcached2 on pour l'exécuter lorsque la machine démarre.

1
gohdan

D'accord, très bonne réponse, Tristan CHARBONNIER. Veuillez remplacer le code dans le fichier/usr/share/memcached/scripts/start-memcached:

#!/usr/bin/Perl -w
# start-memcached
# 2003/2004 - Jay Bonci 
# This script handles the parsing of the /etc/memcached.conf file
# and was originally created for the Debian distribution.
# Anyone may use this little script under the same terms as
# memcached itself.

use strict;

if($> != 0 and $< != 0)
{
    print STDERR "Only root wants to run start-memcached.\n";
    exit;
}

my $params; my $etchandle; my $etcfile = "/etc/memcached.conf";

# This script assumes that memcached is located at /usr/bin/memcached, and
# that the pidfile is writable at /var/run/memcached.pid

my $memcached = "/usr/bin/memcached";
my $pidfile = "/var/run/memcached.pid";

if (scalar(@ARGV) == 2) {
    $etcfile = shift(@ARGV);
    $pidfile = shift(@ARGV);
}

# If we don't get a valid logfile parameter in the /etc/memcached.conf file,
# we'll just throw away all of our in-daemon output. We need to re-tie it so
# that non-bash shells will not hang on logout. Thanks to Michael Renner for 
# the tip
my $fd_reopened = "/dev/null";

    sub handle_logfile
    {
        my ($logfile) = @_;
        $fd_reopened = $logfile;
    }

    sub reopen_logfile
    {
        my ($logfile) = @_;

        open *STDERR, ">>$logfile";
        open *STDOUT, ">>$logfile";
        open *STDIN, ">>/dev/null";
        $fd_reopened = $logfile;
    }

# This is set up in place here to support other non -[a-z] directives

my $conf_directives = {
    "logfile" => \&handle_logfile,
};

if(open $etchandle, $etcfile)
{
    foreach my $line (< $etchandle>)
    {
        $line ||= "";
        $line =~ s/\#.*//g;
        $line =~ s/\s+$//g;
        $line =~ s/^\s+//g;
        next unless $line;
        next if $line =~ /^\-[dh]/;

        if($line =~ /^[^\-]/)
        {
            my ($directive, $arg) = $line =~ /^(.*?)\s+(.*)/; 
            $conf_directives->{$directive}->($arg);
            next;
        }

        Push @$params, $line;       
    }

}else{
    $params = [];
}

    Push @$params, "-u root" unless(grep "-u", @$params);
    $params = join " ", @$params;

if(-e $pidfile)
{
    open PIDHANDLE, "$pidfile";
    my $localpid = <PIDHANDLE>;
    close PIDHANDLE;

    chomp $localpid;
    if(-d "/proc/$localpid")
    {
        print STDERR "memcached is already running.\n"; 
        exit;       
    }else{
        `rm -f $localpid`;
    }

}

my $pid = fork();

if($pid == 0)
{
        reopen_logfile($fd_reopened);
        exec "$memcached $params";
        exit(0);

}else{
    if(open PIDHANDLE,">$pidfile")
    {
        print PIDHANDLE $pid;
        close PIDHANDLE;
    }else{

        print STDERR "Can't write pidfile to $pidfile.\n";
    }
}
1
Yuri Malov

Au cas où quelqu'un d'autre tomberait sur cette question, il y a un bug sur la distribution debian de memcached (ce qui signifie que les saveurs comme Ubuntu seraient également affectées).

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=784357

En raison de ce bogue, même lorsque vous disposez de fichiers de configuration distincts, lorsque vous exécutez Sudo service memcached restart, seul le fichier de configuration par défaut dans /etc/memcached.conf sera chargé.

Comme mentionné dans le commentaire ici , la solution temporaire est de

  1. Retirer /lib/systemd/system/memcached.service

  2. Courir Sudo systemctl daemon-reload (ne vous inquiétez pas, vous pouvez le faire en toute sécurité)

  3. Enfin, exécutez Sudo service memcached restart si vous êtes d'accord pour perdre toutes les informations de cache. Sinon, exécutez Sudo service memcached force-reload

1
narasi

dans /etc/memcached.conf, vous pouvez simplement modifier comme ci-dessous

-l 192.168.112.22,127.0.0.1

doit utiliser virgule entre deux adresses IP

0
xiongjiabin