我已经使用 --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
我建议更改11217
为11216
,它应该立即开始工作。我想你已经从默认设置开始看到 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)