2011-05-08 10 views
30

Próbowałem dodać w postaci memcached conf plik -l 11211 -l 11212 . Ale to jest po prostu słuchać pierwszego czyli 1121Jak możemy utworzyć dwa wystąpienia memcached serwera na tym samym serwerze w innym porcie?

+0

Do symulacji środowiska klastrowego używam dwóch tomcatów na jednym serwerze, ale oba serwery tomcat dzielą jeden serwer mysql. Proszę, popraw mnie jeśli się mylę. Do celów udostępniania lepkich sesji potrzebuję uruchomić memcahed jako demon. – panalbish

Odpowiedz

43

Oto co Memcached mówi komenda -l jest dla:

-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 

Po pierwsze trzeba określić interfejs chcesz memcached słuchać dalej, jeśli są za pomocą Flaga -l. Użyj 0.0.0.0 dla wszystkich interfejsów i użyj 127.0.0.1, czy chcesz mieć dostęp do memcached z localhost. Po drugie, nie używaj dwóch flag: -l. Użyj tylko jednego i oddziel każdy adres przecinkami. Poniższe polecenie powinno zrobić to, co chcesz.

memcached -l 0.0.0.0:11211,0.0.0.0:11212 

Należy pamiętać, że będzie to jedna instancja memcached nasłuchująca na dwóch portach. Aby mieć dwa memcached wystąpień na jednym komputerze uruchom te dwie komendy.

memcached -p 11211 -d 

memcached -p 11212 -d 
+0

Dzięki za odpowiedź. Pracując jako urok :) – panalbish

+0

Wow, dzięki, to naprawdę pomoże mi z moim skupiskiem. – WojonsTech

+0

żadna z nich nie działa dla mnie w wersji 1.4.2, a dokumentacja, której dotyczy odwołanie, już nie istnieje. – Brunis

60

Najpierw użyłem rozwiązanie mikewied, ale potem wpadłem na problem automatycznego uruchamiania demona. Inną dziwną rzeczą w tym rozwiązaniu jest to, że nie używa ona konfiguracji z itp. Miałem zamiar stworzyć własne skrypty startowe w /etc/init.d, ale potem zajrzałem do pliku /etc/init.d/memcached i widziałem to piękne rozwiązanie

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

Zasadniczo czytelnicy to pytanie wystarczy przeczytać plik /etc/init.d/memcached.

Cheers

+7

To powinno być wybrane rozwiązanie – Avision

+0

Myślę, że twój skrypt init musi być inny. W CenOS 6 czytałem plik /etc/init.d/memcached i nie widzę, w jaki sposób wymienione polecenia działałyby bez modyfikowania go. Może jestem wolny :) – im3r3k

+1

Należy pamiętać, że to nie działa dla Debain Jessie z powodu tego błędu: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=784357. W bilecie są obejścia. – gArn

0

w /etc/memcached.conf można tylko zmieniać jak poniżej

-l 192.168.112.22,127.0.0.1

musi używać przecinek między dwoma adres IP

2

Odpowiedź od Davida Dzhagayeva jest najlepsza. Jeśli nie masz poprawnej wersji skryptu inicjującego memcache, tutaj jest ten, o którym mówi:

Powinien działać z każdą linuksową dystrybucją używając 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 
0

Dobra odpowiedź, Tristan CHARBONNIER. Proszę wymienić kod do pliku/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

proste rozwiązanie Centosu 6

pierwszej kopii /etc/sysconfig/memcached do /etc/sysconfig/memcached2 i pisać nowe ustawienia do nowego pliku .

Następnie skopiuj /etc/init.d/memcached do /etc/init.d/memcached2 i zmiany w nowym pliku:

  • PORT do nowego portu (należy zresetować z /etc/sysconfig/memcached2, więc robimy to na wszelki wypadek)
  • /etc/sysconfig/memcached do /etc/sysconfig/memcached2
  • /var/run/memcached/memcached.pid do /var/run/memcached/memcached2.pid
  • /var/lock/subsys/memcached do /var/lock/subsys/memcached2

Teraz można używać , service memcached2 stop itd. Nie zapomnij o włączeniu funkcji chkconfig memcached2, aby uruchomić ją po uruchomieniu komputera.

0

W przypadku, gdy ktoś inny natknie się na to pytanie, pojawia się błąd w dystrybucji debianowej memcached (co oznacza, że ​​wpłynie to również na smaki takie jak Ubuntu).

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

Z powodu tego błędu, nawet jeśli mają oddzielne pliki konfiguracyjne, po uruchomieniu sudo service memcached restart tylko domyślny plik konfiguracyjny w /etc/memcached.conf zostanie załadowany.

Jak wspomniano w comment here, tymczasowa rozwiązaniem jest

  1. Usuń /lib/systemd/system/memcached.service

  2. Run sudo systemctl daemon-reload (nie martw się, że jest to bezpieczne tak)

  3. Na koniec uruchom sudo service memcached reload

Powiązane problemy