gpt4 book ai didi

php - 使用 Twemproxy 安装 Redis Cluster,我真的很困惑为什么有些 SET 命令被移动了

转载 作者:IT王子 更新时间:2023-10-29 06:05:27 28 4
gpt4 key购买 nike

我已经使用 3.0.5 版的 Redis-Server (Ubuntu 14.04) 设置了一个 Redis-Cluster

为简单起见,我们将忽略复制。我在本地主机上运行了三个 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

我用 nutcracker -c twemproxy-config.yml -d 初始化 twemproxy,然后我可以用 redis-cli -h 127.0.0.1 -p 22121 访问 twemproxy/p>

请看一下这个输入输出

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"

引用

Redis Cluster Specification

Interesting read at code.hootsuite.com about use of twemproxy (大约一半的页面)

最终目标

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

希望我说的有道理。我使用的哈希码是否正确?我真的很想看到 twemproxy 返回 OK 而不是 MOVED

谢谢!

更新

感谢@the-real-bill 的回答,我在两个节点上设置了 redis,标准 redis 运行端口 6380,sentinel 运行端口 16380,一个是主节点,另一个是从节点。查看日志,一切看起来都很好。

我看过predisphpredis

这是我仍然有点不确定的一点,我相信给我更多的时间我会解决的。查询只能写入主服务器,查询只能从从服务器读取。我们让 Sentinel 根据可用性提升一个或另一个—— session 处理程序如何知道它可以写入哪个?当然我需要提供两个 IP 地址..

最佳答案

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

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

此外,上次我检查了 PHP 客户端不支持 Redis 集群。

但是,对于您的用例,我怀疑您是否真的需要 Redis 集群。使用 Sentinel 在 Pod(master+slave(s))中配置 Redis 以管理故障转移并结合客户端 Sentinel 支持可能会很好地满足您的需求。我相信 PRedis 有支持,但我相信 phpredis 没有。

如果您担心运行共享集群的复杂性,那么在 Twemproxy 后面使用常规的 Redis + Sentinel,并让 Twemproxy 通过您告诉它使用的共享算法进行连接。这是尝试使用 Tweproxy 的另一个问题——它做 Redis Cluster 做的事情,但作为代理。所以实际上你会尝试将数据集分片两次。我相信你可以想象这是灾难性的。 ;)

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

此脚本随后可以更新您的 HAProxy 配置并为您重新启动它,从而确保正确的重新连接行为。有很多方法可以做到这一点,谷歌搜索它,结合 Redis Sentinel 文档并将它们应用到您的环境中,将为您显示路径。

关于php - 使用 Twemproxy 安装 Redis Cluster,我真的很困惑为什么有些 SET 命令被移动了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33473939/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com