设置简单:
我有以下twemproxy配置:
default:
auto_eject_hosts: true
distribution: ketama
hash: fnv1a_64
listen: 0.0.0.0:22122
server_failure_limit: 1
server_retry_timeout: 600000 # 600sec, 10m
timeout: 100
servers:
- vcache-1:11211:1
- vcache-2:11211:1
Run Code Online (Sandbox Code Playgroud)
twemproxy节点可以解析所有主机名.作为测试的一部分,我取消了vcache-2.理论上,每次尝试与vcache:22122接口时,twemproxy都会联系池中的服务器以方便尝试.但是,如果其中一个缓存节点关闭,那么twemproxy应该从池中"自动弹出"它,因此后续请求不会失败.
由应用程序层决定是否使用vcache:22122尝试失败的接口是由于基础结构问题,如果是,请再试一次.但是我发现在重试时,正在使用相同的故障服务器,因此不会将后续尝试传递给已知良好的缓存节点(在本例中为vcache-1),而是将它们传递给弹出的缓存节点(vcache) -2).
这是尝试重试的php代码片段:
....
// $this is a Memcached object with vcache:22122 in the server list
$retryCount = 0;
do {
$status = $this->set($key, $value, $expiry);
if (Memcached::RES_SUCCESS === $this->getResultCode()) {
return true;
}
} while (++$retryCount < 3);
return false;
Run Code Online (Sandbox Code Playgroud)
- 更新 -
链接到Github上打开的问题以获取更多信息:问题#427
我们计划将Redis用作集中式和高可用性缓存,因此我们使用Redis以及twemproxy和sentinel查看了Redis Labs企业集群和本地集群式设置.在研究RELC时,我们偶然发现了这个链接:
其中说 - RLEC适用于任何标准Redis客户端,包括独立的Redis客户端和Redis群集客户端.
究竟什么是开源Redis集群,我该如何使用它?这与独立的Redis不同吗?为什么在开源版本可用时才使用RELC,仅用于支持?我没有找到任何详细说明差异的来源,所以如果有人使用过这些解决方案之一,请解释为什么选择一个而不是另一个.
我们在我们的app服务器上运行PHP堆栈,它在本地使用twemproxy(通过套接字),连接到我们的缓存层的多个上游memcached服务器(EC2小实例).
我经常从应用监视器收到一个警告,即页面加载时间大于5秒.发生这种情况时,立即修复是在每个应用服务器上重新启动twemproxy服务,这是一个麻烦.
我现在唯一的解决方案是每分钟运行一次crontab并重新启动服务,但是你可以想象每分钟都没有写几秒钟,这不是一个理想的永久解决方案.
有没有人遇到过这个?如果是这样,修复了什么?我尝试切换到AWS Elasticache但它没有与我们当前的twemproxy解决方案相同的性能.
这是我的twemproxy配置.
default:
auto_eject_hosts: true
distribution: ketama
hash: fnv1a_64
listen: /var/run/nutcracker/nutcracker.sock 0666
server_failure_limit: 1
server_retry_timeout: 600000 # 600sec, 10m
timeout: 100
servers:
- vcache-1:11211:1
- vcache-2:11211:1
Run Code Online (Sandbox Code Playgroud)
这是php层的连接配置:
# Note: We are using HA / twemproxy (nutcracker) / memcached proxy
# So this isn't a default memcache(d) port
# Each webapp will host the cache proxy, which allows us to connect via socket
# which should be faster, as no tcp overhead
# Hash has been manually …
Run Code Online (Sandbox Code Playgroud) 直接通过redis-cli连接到我的twemproxy将正确地代理我到redis,没有任何问题/断开连接.但是,当我使用node-redis连接到twemproxy时,我收到以下错误:
[Error: Redis connection gone from end event.]
Run Code Online (Sandbox Code Playgroud)
跟踪如下:
Error: Ready check failed: Redis connection gone from end event.
at RedisClient.on_info_cmd (/home/vagrant/tests/write-tests/node_mo
dules/redis/index.js:368:35)
at Command.callback (/home/vagrant/tests/write-tests/node_modules/r
edis/index.js:418:14)
at RedisClient.flush_and_error (/home/vagrant/tests/write-tests/nod
e_modules/redis/index.js:160:29)
at RedisClient.connection_gone (/home/vagrant/tests/write-tests/nod
e_modules/redis/index.js:474:10)
at Socket.<anonymous> (/home/vagrant/tests/write-tests/node_modules
/redis/index.js:103:14)
at Socket.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:919:16
at process._tickCallback (node.js:419:13)
Run Code Online (Sandbox Code Playgroud)
无论redis-server是否正在运行,都会发生此错误,所以我很确定它与node-redis和twemproxy的交互方式有关.或者不根据具体情况进行交互.
到底发生了什么?
我有一个简单的测试设置,如下所示:
+------------------+
| +----+----+ |
| | r1 + r2 + |
| +----+----+ |
| | | |
| +---------+ |
| |twemproxy| |
| +---------+ | …
Run Code Online (Sandbox Code Playgroud) 我在我的服务器上运行3个redis-server实例,实例有不同的配置文件和db文件.例如:redis1将db位置设置为/ var/lib/redis_1,redis2将db位置设置为/ var/lib/redis_2.我有twemproxy配置:
alpha: listen: 0.0.0.0:9999 redis: true hash: fnv1a_64 distribution: ketama auto_eject_hosts: true server_retry_timeout: 2000 server_failure_limit: 2 servers: - 127.0.0.1:6381:1 - 127.0.0.1:6382:1 - 127.0.0.1:6383:1
我启动了3个redis实例,并将数据"name"分别设置为redis-cli的不同值.例如:我将名称设置为"6381"到第一个服务器,将"6382"设置为第二个服务器.我打开db文件dump.rdb,看到3个数据值,然后启动twemproxy.
当我用redis-cli连接twemproxy并读取"name"键时,它总是返回"6382".如果我使用不同的客户端连接到它,值仍然是相同的.如果我直接在Redis instabces中更改值,或者对twemproxy实例执行任何其他操作,我发现更改只更新到第二个db文件/var/lib/redis_2/dump.rdb.
为什么twemproxy不能与3个redis-server实例一起使用?我的配置有什么问题吗?