用Twemproxy安装了Redis集群,我对为什么移动某些SET命令感到非常困惑

厌恶的

我已经使用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"

参考

Redis集群规范

有趣的是在code.hootsuite.com上阅读了有关twemproxy的使用的信息(大约位于页面的一半)

终极目标

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

我希望我有道理。我使用的是正确的哈希码吗?我真的很想看到twemproxy还给OK,而不是MOVED

谢谢!

更新

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

我已经看了predisphpredis

这是我仍然不确定的一点,我相信如果有更多时间我会解决的。查询只能写入主服务器,而查询只能从从服务器读取。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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用Twemproxy安装了Redis Cluster,我对为什么移动某些SET命令感到非常困惑

来自分类Dev

为什么我感到困惑“当命令在BASH中失败时,退出状态代码为0”

来自分类Dev

为什么apt不知道我已经从源代码安装了某些应用程序?

来自分类Dev

为什么我不能创建一个同时安装了 Jupyter 和 DataLab 的 Google DataProc 集群?

来自分类Dev

为什么我安装了pinentry后gpg失败了?

来自分类Dev

对自我用这种方法意味着什么感到困惑

来自分类Dev

我对ScheduledThreadPoolExecutor.scheduleAtFixedRate和可能的并发感到困惑。为什么会有线程池?

来自分类Dev

关于为什么Git认为我的分支技巧落后于原点感到困惑

来自分类Dev

我对为什么此链接列表实现有效感到困惑

来自分类Dev

当scalac重载“ andThen”时,为什么scalac会使我的SAM类型不实现Function感到困惑?

来自分类Dev

我对ScheduledThreadPoolExecutor.scheduleAtFixedRate和可能的并发感到困惑。为什么会有线程池?

来自分类Dev

这段代码似乎不起作用,为什么我不感到困惑

来自分类Dev

Stripe SCA:冲锋成功但未捕获。为什么它会导致我的客户感到困惑?

来自分类Dev

为什么安装了ouchdb?

来自分类Dev

我对在Internet上看到的某些URL感到困惑

来自分类Dev

python声明多变量的某些情况使我感到困惑

来自分类Dev

输出| ...使我感到困惑

来自分类Dev

叉子让我感到困惑

来自分类Dev

QT让我感到困惑

来自分类Dev

我对安装OpenNTF Domino API感到有些困惑

来自分类Dev

在15.10上安装了股票交易平台thinkorswim,但感到困惑

来自分类Dev

Gentoo搬运。如何找出为什么安装了某些特定的软件包?

来自分类Dev

如果我已经安装了unity 8,为什么还要安装unity 5.20.0?

来自分类Dev

为什么安装批处理不知道我已经安装了.net 4.7.1?

来自分类Dev

npm依赖安装,感到困惑

来自分类Dev

对lfs源安装感到困惑

来自分类Dev

我用preyproject安装了设备

来自分类Dev

为什么使用命令 Update-Package --reinstall 后安装了新软件包

来自分类Dev

如果我正确安装了 Pandas,为什么我的导入语句不能识别它?

Related 相关文章

  1. 1

    用Twemproxy安装了Redis Cluster,我对为什么移动某些SET命令感到非常困惑

  2. 2

    为什么我感到困惑“当命令在BASH中失败时,退出状态代码为0”

  3. 3

    为什么apt不知道我已经从源代码安装了某些应用程序?

  4. 4

    为什么我不能创建一个同时安装了 Jupyter 和 DataLab 的 Google DataProc 集群?

  5. 5

    为什么我安装了pinentry后gpg失败了?

  6. 6

    对自我用这种方法意味着什么感到困惑

  7. 7

    我对ScheduledThreadPoolExecutor.scheduleAtFixedRate和可能的并发感到困惑。为什么会有线程池?

  8. 8

    关于为什么Git认为我的分支技巧落后于原点感到困惑

  9. 9

    我对为什么此链接列表实现有效感到困惑

  10. 10

    当scalac重载“ andThen”时,为什么scalac会使我的SAM类型不实现Function感到困惑?

  11. 11

    我对ScheduledThreadPoolExecutor.scheduleAtFixedRate和可能的并发感到困惑。为什么会有线程池?

  12. 12

    这段代码似乎不起作用,为什么我不感到困惑

  13. 13

    Stripe SCA:冲锋成功但未捕获。为什么它会导致我的客户感到困惑?

  14. 14

    为什么安装了ouchdb?

  15. 15

    我对在Internet上看到的某些URL感到困惑

  16. 16

    python声明多变量的某些情况使我感到困惑

  17. 17

    输出| ...使我感到困惑

  18. 18

    叉子让我感到困惑

  19. 19

    QT让我感到困惑

  20. 20

    我对安装OpenNTF Domino API感到有些困惑

  21. 21

    在15.10上安装了股票交易平台thinkorswim,但感到困惑

  22. 22

    Gentoo搬运。如何找出为什么安装了某些特定的软件包?

  23. 23

    如果我已经安装了unity 8,为什么还要安装unity 5.20.0?

  24. 24

    为什么安装批处理不知道我已经安装了.net 4.7.1?

  25. 25

    npm依赖安装,感到困惑

  26. 26

    对lfs源安装感到困惑

  27. 27

    我用preyproject安装了设备

  28. 28

    为什么使用命令 Update-Package --reinstall 后安装了新软件包

  29. 29

    如果我正确安装了 Pandas,为什么我的导入语句不能识别它?

热门标签

归档