我已经设置了一个 Redis-Cluster 3.0.5 版本的 Redis-Server (Ubuntu 14.04)
为简单起见,我们将忽略复制。我在 localhost 上运行了三个 redis 实例,端口为 7001、7002 和 7003。使用此命令,它们都成为集群的主人
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.hoosuite.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 和哨兵运行端口 16380,一个是主节点,另一个是从节点。看着日志,一切看起来都很好。
这是我仍然有点不确定的一点,我相信如果有更多的时间我会解决的。查询只能写入主服务器,查询只能从从服务器读取。我们已经让 Sentinel 根据可用性提升其中一个或另一个 - 会话处理程序如何知道它可以写入哪个?当然我需要提供两个IP地址..