标签: twemproxy

Twitter - twemproxy - memcached - 重试不按预期工作

设置简单:

  • 1个运行twemproxy的节点(vcache:22122)
  • 运行memcached的两个节点(vcache-1,vcache-2)都在11211上监听

我有以下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

php memcached caching twemproxy

24
推荐指数
1
解决办法
895
查看次数

开源Redis集群和Redis labs企业集群之间有什么区别?

我们计划将Redis用作集中式和高可用性缓存,因此我们使用Redis以及twemproxy和sentinel查看了Redis Labs企业集群和本地集群式设置.在研究RELC时,我们偶然发现了这个链接:

https://redislabs.com/redis-enterprise-documentation/rlec-compatibility/compatibility-with-open-source-redis-cluster

其中说 - RLEC适用于任何标准Redis客户端,包括独立的Redis客户端和Redis群集客户端.

究竟什么是开源Redis集群,我该如何使用它?这与独立的Redis不同吗?为什么在开源版本可用时才使用RELC,仅用于支持?我没有找到任何详细说明差异的来源,所以如果有人使用过这些解决方案之一,请解释为什么选择一个而不是另一个.

redis redis-sentinel twemproxy

8
推荐指数
1
解决办法
9464
查看次数

Twemproxy Lag强制重启

我们在我们的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)

php memcached caching twemproxy

7
推荐指数
1
解决办法
255
查看次数

node-redis无法通过twemproxy连接到redis实例

问题

直接通过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)

redis node.js node-redis twemproxy

4
推荐指数
1
解决办法
1789
查看次数

Twemproxy只连接一个redis实例

我在我的服务器上运行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实例一起使用?我的配置有什么问题吗?

redis twemproxy

0
推荐指数
1
解决办法
2480
查看次数