Как мы можем создать два экземпляра сервера memcached на одном сервере в другом порту? - PullRequest
32 голосов
/ 08 мая 2011

я пытался добавить в путь -l 11211 -11212 в файле memcached conf. Но это просто первое прослушивание, т.е. 1121

Ответы [ 7 ]

65 голосов
/ 13 февраля 2014

Сначала я использовал решение mikewied, но потом столкнулся с проблемой автоматического запуска демона.Еще одна запутанная вещь в этом решении заключается в том, что оно не использует конфигурацию из и т. Д. Я собирался создать свои собственные сценарии запуска в /etc/init.d, но затем я посмотрел в файл /etc/init.d/memcached иувидел это красивое решение

# 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.

В основном читатели этого вопроса просто должны прочитать файл /etc/init.d/memcached.

Приветствия

45 голосов
/ 14 мая 2011

Вот что memcached говорит, что команда -l предназначена для:

-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

Прежде всего вам нужно указать интерфейс, который memcached будет прослушивать, если вы используете флаг -l.Используйте 0.0.0.0 для всех интерфейсов и используйте 127.0.0.1, если вы просто хотите иметь доступ к memcached из localhost.Во-вторых, не используйте два флага -l.Используйте только один и разделяйте каждый адрес запятой.Команда ниже должна делать то, что вы хотите.

memcached -l 0.0.0.0:11211,0.0.0.0:11212

Имейте в виду, что один экземпляр memcached будет прослушивать два порта.Чтобы иметь два экземпляра memcached на одном компьютере, выполните эти две команды.

memcached -p 11211 -d

memcached -p 11212 -d
3 голосов
/ 29 апреля 2015

Ответ от Давида Джагаева самый лучший. Если у вас нет правильной версии скрипта инициализации memcache, вот о чем он говорит:

Он должен работать с любым дистрибутивом Linux, использующим 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
1 голос
/ 06 марта 2018

В случае, если кто-то еще наткнется на этот вопрос, существует ошибка в дистрибутиве debian memcached (что означает, что также будут затронуты такие разновидности, как Ubuntu).

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

Из-за этой ошибки, даже если у вас есть отдельные файлы конфигурации, при запуске sudo service memcached restart будет загружен только файл конфигурации по умолчанию в /etc/memcached.conf.

Как упомянуто в комментарии здесь , временное решение для

  1. Удалить /lib/systemd/system/memcached.service

  2. Выполнить sudo systemctl daemon-reload (не волнуйтесь, это безопасно так)

  3. Наконец, запустите sudo service memcached restart, если вы в порядке с потерей всей информации кеша. Если нет, запустите sudo service memcached force-reload

1 голос
/ 21 марта 2016

Простое решение для Centos 6

Сначала скопируйте /etc/sysconfig/memcached в /etc/sysconfig/memcached2 и запишите новые настройки в новый файл.

Затем скопируйте /etc/init.d/memcached в /etc/init.d/memcached2 и измените в новом файле:

  • ПОРТ на ваш новый порт (его следует сбросить с /etc/sysconfig/memcached2, поэтому мы делаем это на всякий случай)
  • /etc/sysconfig/memcached до /etc/sysconfig/memcached2
  • /var/run/memcached/memcached.pid до /var/run/memcached/memcached2.pid
  • /var/lock/subsys/memcached до /var/lock/subsys/memcached2

Теперь вы можете использовать service memcached2 start, service memcached2 stop и т. Д. Не забудьте chkconfig memcached2 on запустить его при загрузке машины.

1 голос
/ 15 октября 2015

Хорошо, очень хороший ответ, Тристан ШАРБОНЬЕР.Пожалуйста, замените код в файл / 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";
    }
}
0 голосов
/ 18 апреля 2015

в /etc/memcached.conf вы можете просто отредактировать, как показано ниже

-1 192.168.112.22,127.0.0.1

необходимо использовать запятую между двумя IP-адресами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...