当与 2 台服务器复制时,repcached 不起作用?

当与 2 台服务器复制时,repcached 不起作用?

我已经使用 --enable-replication 选项编译了 memcached-repcached,并像下面这样启动它:

在服务器 1 上:

# /usr/local/memcached/bin/memcached -v -d -u memcached -l 192.168.7.106 -p 11216 -c 2048 -m 512 -P /usr/local/memcached/var/run/test.pid -x 192.168.3.82 -X 11216
# replication: connect (peer=192.168.3.82:11216)
replication: marugoto copying
replication: close
replication: failed to initialize replication server socket

在服务器2上:

# /usr/local/memcached/bin/memcached -v -d -u memcached -l 192.168.3.82 -p 11216 -c 2048 -m 512 -P /usr/local/memcached/var/run/test.pid -x 192.168.7.106 -X 11216
replication: connect (peer=192.168.7.106:11216)
replication: marugoto copying

但看起来服务器2只连接了服务器1上的memcached实例,并没有监听11216端口:

# lsof -i :11216
COMMAND     PID      USER   FD   TYPE   DEVICE SIZE NODE NAME
memcached 12786 memcached    6u  IPv4 55213579       TCP 192.168.3.82:56176->192.168.7.106:11216 (ESTABLISHED)

因此我无法在服务器 2 上进行 telnet:

# telnet 192.168.3.82 11216
Trying 192.168.3.82...
telnet: connect to address 192.168.3.82: Connection refused
telnet: Unable to connect to remote host: Connection refused

但如果我尝试在一台具有不同端口的服务器上复制 2 个 memcached 实例,它可以正常工作:

$ telnet 192.168.7.106 11216
Trying 192.168.7.106...
Connected to 192.168.7.106.
Escape character is '^]'.
set foo 0 0 3
bar
STORED

$ telnet 192.168.7.106 11217
Trying 192.168.7.106...
Connected to 192.168.7.106.
Escape character is '^]'.
marugoto_end
rep foo 0 0 3 1
bar
get foo
VALUE foo 0 3
bar
END

我错过了什么?

答案1

看起来您的端口设置不匹配:

-x 192.168.3.82 -X 11216

-x 192.168.7.106 -X 11216

使用相同的端口进行复制(这是可以的,因为您使用不同的机器)

但是,为什么使用其他端口启动这些守护进程:

-l 192.168.7.106 -p 11217

-l 192.168.3.82 -p 11216

我建议更改1121711216,它应该立即开始工作。我想你已经从默认设置开始看到 repcached 基本正常工作了,对吧?我的默认设置工作正常,例如:http://marcusspiegel.de/2010/05/02/howto-install-memcached-with-repcached-build-in-server-side-replication-on-debian-lenny

工作示例的输出:

看看我是如何启动 memcached 的(从 pstree 截断):

  |-memcached,2915 -m 64 -p 11211 -u root -P /var/run/memcachedrep.pid -d -x 192.168.18.11

在另一个节点上:

  |-memcached,2965 -m 64 -p 11211 -u root -P /var/run/memcachedrep.pid -d -x 192.168.18.10

使用的端口:

tcp        0      0 192.168.18.11:54122     192.168.18.11:11211     TIME_WAIT   -               
tcp        0      0 192.168.18.11:54133     192.168.18.11:11211     TIME_WAIT   -               
tcp        0      0 192.168.18.11:54130     192.168.18.11:11211     TIME_WAIT   -               
tcp        0      0 192.168.18.11:54125     192.168.18.11:11211     TIME_WAIT   -               
tcp        0      0 192.168.18.11:52466     192.168.18.10:11211     TIME_WAIT   -               
tcp6       0      0 192.168.18.11:11212     192.168.18.10:37881     VERBUNDEN   2965/memcached

另一个节点

tcp        0      0 192.168.18.10:57768     192.168.18.10:11211     TIME_WAIT   -               
tcp        0      0 192.168.18.10:45406     192.168.18.11:11211     TIME_WAIT   -               
tcp        0      0 192.168.18.10:45412     192.168.18.11:11211     TIME_WAIT   -               
tcp        0      0 192.168.18.10:56134     192.168.18.11:11211     TIME_WAIT   -               
tcp        0      0 192.168.18.10:40624     192.168.18.10:11211     TIME_WAIT   -               
tcp        0      0 192.168.18.10:37881     192.168.18.11:11212     VERBUNDEN   2915/memcached  
tcp        0      0 192.168.18.10:57750     192.168.18.10:11211     TIME_WAIT   -               
tcp        0      0 192.168.18.10:45428     192.168.18.11:11211     TIME_WAIT   -               
tcp        0      0 192.168.18.10:45419     192.168.18.11:11211     TIME_WAIT   -               
tcp        0      0 192.168.18.10:45410     192.168.18.11:11211     TIME_WAIT   -               
tcp        0      0 192.168.18.10:57766     192.168.18.10:11211     TIME_WAIT   -       

记住 用于复制的端口 (11212) 与用于服务缓存的端口 (11211) 不同!

两台机器上的复制端口必须相同,并且必须能够从彼此的接口访问。服务端口在两个节点上设置为相同,因为两个节点也连接到与客户端相同的端口。这模仿了 MySQL 中的主-主-复制设置。

答案2

抱歉,是我的错误。应该是 11216(我在服务器 1 上使用 2 个实例进行测试时混淆了端口)。

在您的博客中,您没有指定用于复制的 TCP 端口(-X)。默认情况下,它是 11212,而不是 11211,因此您无法 telnet 到 11211。此外,您在 DAEMON_ARGS 中输入的 IP 地址有错误,应该是 192.168.168.2,而不是 192.168.168.62。

我再次测试,telnet 时仍然出现“连接被拒绝”错误。以下是详细信息:

在106上启动memcached:

# /usr/local/memcached/bin/memcached -v -d -u memcached -l 192.168.7.106 -p 11216 -c 2048 -m 512 -P /usr/local/memcached/var/run/test.pid -x 192.168.3.82 -X 11216
replication: connect (peer=192.168.3.82:11216)
replication: marugoto copying
replication: close
replication: listen
failed to listen
replication: accept

在82上启动memcached:

# /usr/local/memcached/bin/memcached -v -d -u memcached -l 192.168.3.82 -p 11216 -c 2048 -m 512 -P /usr/local/memcached/var/run/test.pid -x 192.168.7.106 -X 11216
replication: connect (peer=192.168.7.106:11216)
replication: marugoto copying
replication: start

在106:

# lsof -i :11216
COMMAND   PID      USER   FD   TYPE   DEVICE SIZE NODE NAME
memcached 777 memcached    7u  IPv4 10701963       TCP 192.168.7.106:11216->192.168.3.82:60861 (ESTABLISHED)

在82:

# lsof -i :11216
COMMAND     PID      USER   FD   TYPE   DEVICE SIZE NODE NAME
memcached 18305 memcached    6u  IPv4 55702870       TCP 192.168.3.82:60861->192.168.7.106:11216 (ESTABLISHED)
memcached 18305 memcached    9u  IPv4 55702872       TCP 192.168.3.82:11216 (LISTEN)

使用 telnet 测试:

# telnet 192.168.7.106 11216
Trying 192.168.7.106...
telnet: connect to address 192.168.7.106: Connection refused
telnet: Unable to connect to remote host: Connection refused

我也尝试将 memcached 绑定到任何接口(没有具体-l启动时),但是它仍然没有监听端口 11216:

$ ps -ef | grep 11216
502       2305     1  0 10:37 ?        00:00:00 /usr/local/memcached/bin/memcached -v -d -u memcached -p 11216 -c 2048 -m 512 -P /usr/local/memcached/var/run/test.pid -x 192.168.3.82 -X 11216

# lsof -i :11216
COMMAND    PID      USER   FD   TYPE   DEVICE SIZE NODE NAME
memcached 2305 memcached    7u  IPv6 10707474       TCP 192.168.7.106:11216->192.168.3.82:47534 (ESTABLISHED)

相关内容