Twemproxy只连接一个redis实例

时间:2013-06-09 06:42:57

标签: redis twemproxy

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

1 个答案:

答案 0 :(得分:7)

我认为你对twemproxy的运作方式存在误解。我将解释您的测试中发生了什么,以及如何验证twemproxy是否正在连接到每个实例。

Twemproxy将使用散列来对密钥空间进行分区,并将其划分为您为其配置的三个实例。这意味着'name'的键将映射到一个且只有一个服务器。 Twoemproxy不使用条带化将数据放在所有节点上,只有一个。

在您的情况下,'name'映射到在端口6382上运行的实例.Twemproxy计算签名并使用ketama分发机制(根据您的配置)确定哪个实例应该拥有'name,然后在执行时查询该实例获取'name',直接返回存储在其中的值。

要验证twemproxy是否连接到每个实例,您可以设置一系列键,然后直接查询每个Redis实例。但是,如果直接查询,可以使用info命令查看连接和操作统计信息。

  1. 使用redis-cli直接连接到每个连接,以便连接保持打开状态。
  2. 启动twemproxy
  3. 使用各种键名发布一系列获取
  4. 检查连接统计信息以增加连接数
  5. 我现在不记得twemproxy在启动时是否连接到Redis实例。我认为确实如此。如果是,您可以在步骤2之后检查连接统计数据。我会先尝试一下。

    总结:这不是你的配置,而是你对应该发生什么的理解。如果上述解释没有为您解释,请告诉我,我会澄清/扩大答案。

    干杯