我已经使用3.0.5版的Redis-Server(Ubuntu 14.04)设置了Redis-Cluster。
为简单起见,我们将忽略复制。我在本地主机(端口7001、7002和7003)上运行了三个Redis实例。使用此命令,它们都成为集群的主节点。
redis-trib.rb create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003
我喜欢使用twemproxy的想法
twemproxy-config.yml
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
我使用初始化twemproxy,nutcracker -c twemproxy-config.yml -d
然后可以使用访问twemproxyredis-cli -h 127.0.0.1 -p 22121
请看一下这个输入和输出
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
我担心这可能无法正常工作。如果绕过twemproxy并使用进行连接redis-cli -c -h 127.0.0.1 -p 7001
,则可以看到发生了自动转发。像这样
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"
参考
有趣的是在code.hootsuite.com上阅读了有关twemproxy的使用的信息(大约位于页面的一半)
终极目标
我的最终目标是使用Redis集群在负载均衡器后面的多个Web服务器之间存储PHP会话数据。在php.ini
我会session.save_handler = redis
和session.save_path = tcp://127.0.0.1:22121
(在twemproxy实例将每个Web服务器上运行)。PHP会话配置位尚未设置。
我希望我有道理。我使用的是正确的哈希码吗?我真的很想看到twemproxy还给OK,而不是MOVED。
谢谢!
感谢@ the-real-bill的回答,我在两个节点上都设置了Redis,标准Redis运行端口6380,Sentinel运行端口16380,一个是主节点,另一个是从节点。看着日志,一切看起来都很好。
这是我仍然不确定的一点,我相信如果有更多时间我会解决的。查询只能写入主服务器,而查询只能从从服务器读取。Sentinel根据可用性提升了一个或另一个-会话处理程序如何知道它可以写入哪一个?当然,我需要提供两个IP地址。
Redis Cluster是一种客户端感知模式。在Redis Cluster中,客户端始终最多连接到给定密钥的“正确”节点。该MOVED
答复,告诉哪个节点服务关键客户。最初,希望客户端在连接时提取当前拓扑,然后在获得MOVED的情况下进行更新。这是性能最高的模式,因为不涉及代理。
但是,这意味着您不能在Redis Cluster设置之前使用任何现有代理。如您所见,Twemproxy只是代理某些命令,而拒绝其他命令。为了使Twemproxy能够处理此问题,它需要实现集群API并执行客户端要做的所有事情。这是不行的,您也不应该期望它会很快就这样做。任何其他代理(例如nginx或HAProxy)都需要做同样的事情(假设使用openresty或自定义模块,您可以在Nginx中比其他人更容易地做到这一点)。
此外,最后我检查了PHP客户端不支持Redis群集。
但是,对于您的用例,我怀疑您是否确实需要Redis集群。使用Sentinel在Pod(主控+从属)中配置Redis来管理故障转移,并结合客户端Sentinel支持可能会很好地满足您的需求。我相信PRedis会提供支持,但我相信phpredis不会。
如果您对运行共享集群的复杂性有所了解,请在Twemproxy后面使用常规Redis + Sentinel,并让Twemproxy通过您告诉它使用的共享算法进行连接。这是尝试使用Tweproxy的另一个难题-它可以做Redis Cluster的工作,但可以作为代理。因此,实际上,您将尝试将数据集分片两次。我敢肯定,您可以想象造成灾难性后果的方式。;)
如果您无法获得适当的支持或不希望Twemproxy为您管理共享,那么最后的选择(除了自己添加客户端支持之外)是设置由sentinel配置的代理。例如,您可以使用配置为指向主服务器的HAProxy。在故障转移上,Sentinel可以为您执行脚本。
然后,该脚本可以更新您的HAProxy配置并为您重新启动它,从而确保正确的重新连接行为。有很多方法可以做到这一点,然后对它进行Google搜索,再结合Redis Sentinel文档,并将其应用到您的环境中,将为您显示路径。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句