我在我的服务器上运行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实例一起使用?我的配置有什么问题吗?
答案 0 :(得分:7)
我认为你对twemproxy的运作方式存在误解。我将解释您的测试中发生了什么,以及如何验证twemproxy是否正在连接到每个实例。
Twemproxy将使用散列来对密钥空间进行分区,并将其划分为您为其配置的三个实例。这意味着'name'的键将映射到一个且只有一个服务器。 Twoemproxy不使用条带化将数据放在所有节点上,只有一个。
在您的情况下,'name'映射到在端口6382上运行的实例.Twemproxy计算签名并使用ketama分发机制(根据您的配置)确定哪个实例应该拥有'name,然后在执行时查询该实例获取'name',直接返回存储在其中的值。
要验证twemproxy是否连接到每个实例,您可以设置一系列键,然后直接查询每个Redis实例。但是,如果直接查询,可以使用info命令查看连接和操作统计信息。
我现在不记得twemproxy在启动时是否连接到Redis实例。我认为确实如此。如果是,您可以在步骤2之后检查连接统计数据。我会先尝试一下。
总结:这不是你的配置,而是你对应该发生什么的理解。如果上述解释没有为您解释,请告诉我,我会澄清/扩大答案。
干杯