首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安装了带Twemproxy的Redis集群,我真的很困惑为什么要移动一些SET命令

安装了带Twemproxy的Redis集群,我真的很困惑为什么要移动一些SET命令
EN

Stack Overflow用户
提问于 2015-11-02 09:01:17
回答 2查看 3K关注 0票数 2

我已经用的3.0.5版安装了Redis-集群(Ubuntu14.04)

为了简单起见,我们将忽略复制。我在localhost上运行了三个redis实例,端口7001、7002和7003。它们都是具有以下命令的集群的主程序。

代码语言:javascript
复制
redis-trib.rb create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003

我喜欢使用双代理的想法

twemproxy-config.yml

代码语言:javascript
复制
twem-1:
  listen: 127.0.0.1:22121
  hash: fnv1a_64
  distribution: ketama
  redis: true
  preconnect: true
  servers:
  - 127.0.0.1:7001:1
  - 127.0.0.1:7002:1
  - 127.0.0.1:7003:1

我用nutcracker -c twemproxy-config.yml -d初始化了双代理,然后就可以使用redis-cli -h 127.0.0.1 -p 22121访问双代理了。

请看一下这个输入和输出

代码语言:javascript
复制
127.0.0.1:22121> set hello 4542342342424
OK
127.0.0.1:22121> set goodbye 345353535545
(error) MOVED 9354 159.203.136.204:7002

127.0.0.1:22121> get hello
"4542342342424"
127.0.0.1:22121> get goodbye
(error) MOVED 9354 159.203.136.204:7002

我关注的是,这可能无法正常运作。如果我绕过双代理并使用redis-cli -c -h 127.0.0.1 -p 7001进行连接,就可以看到自动转发的发生。就像这样;

代码语言:javascript
复制
127.0.0.1:7001> get hello
"4542342342424"

127.0.0.1:7001> get goodbye
-> Redirected to slot [9354] located at 127.0.0.1:7002
(nil)

127.0.0.1:7002> set goodbye 3240923842094840
OK

127.0.0.1:7002> get goodbye
"3240923842094840"

参考

Redis集群规范

在code.hootsuite.com上阅读有关双代理使用的有趣读物 (大约下半页)

终极目标

我的最终目标是使用redis集群在负载均衡器后面跨多个the服务器存储PHP会话数据。在php.ini中,我将使用session.save_handler = redissession.save_path = tcp://127.0.0.1:22121 (双代理实例将在每个web服务器上运行)。尚未设置PHP会话配置位。

我希望我说的有道理。我在使用正确的哈希代码吗?我真的希望看到双代理返回OK而不是MOVED

谢谢!

更新

由于@“真实账单”的回答,我在两个节点上安装了redis,其中标准的redis运行端口6380,哨兵运行端口16380,一个是主节点,另一个是从节点。看着日志,一切看起来都很好。

我看过普雷迪斯凤尾草

这是我仍然有点不确定的一点,我相信我会有更多的时间来解决这个问题。查询只能写入主服务器,查询只能从从服务器读取。我们有哨兵促进一个或另一个取决于可用性-会话处理程序如何知道它可以写入哪一个?当然,我需要提供两个IP加载项。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-02 21:54:14

Redis群集是一种客户端感知模式。在Redis集群中,客户端总是连接到给定密钥的“正确”节点。MOVED回复告诉客户端哪个节点服务该键。最初,期望客户端在连接上提取当前拓扑,然后在移动时进行更新。这是最高的执行模式,因为不涉及代理。

但是,这意味着您不能在Redis群集设置之前使用任何现有代理。正如您所看到的,Twemproxy只是简单地代理某些命令,而拒绝其他命令。为了让Twemproxy处理这个问题,它需要实现集群API,并完成客户机所做的一切。这是行不通的,你也不应该指望它很快就这样做。任何其他代理(如nginx或HAProxy )都需要做同样的事情(假设使用openresty或自定义模块,您可以在Nginx中比其他代理更容易地完成此操作)。

此外,最后我检查了PHP客户机不支持Redis集群。

但是,对于您的用例,我怀疑您确实需要一个Redis集群。使用哨兵在Pod (master+slave)中配置Redis以管理故障转移,再加上客户端哨兵支持,可能会很好地满足您的需求。我相信PRedis有支持,但我相信phpredis没有。

如果您关注运行共享集群的复杂性,那么使用常规Redis + Twemproxy后面的哨兵,并让Twemproxy通过您告诉它使用的共享算法进行连接。这是尝试使用Tweproxy的另一个困难--它做的是Redis集群所做的事情,而不是作为代理。因此,实际上,您将尝试分割数据集两次。我相信你能想象出灾难性的后果。;)

如果您无法获得适当的支持,或者不希望Twemproxy为您管理共享,则您的最后一个选项(除了自己添加客户端支持)是设置一个由sentinel配置的代理。例如,您可以使用配置为指向主服务器的HAProxy。在故障转移上,哨兵可以为您执行脚本。

然后,这个脚本可以更新您的HAProxy配置并重新启动它,从而确保正确的重新连接行为。有很多方法可以做到这一点,谷歌在上面搜索,再加上,并将它们应用到您的环境中,将为您指明路径。

票数 3
EN

Stack Overflow用户

发布于 2015-11-02 14:37:09

不能同时使用Redis集群和双代理。在Redis集群模式下,应该是客户端将请求发送到正确的主服务器。当你向错误的主人请求一个键时,它总是会发回一个移动回复,将你重定向到正确的主人。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33473939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档