官方redis cluster如何实现负载均衡?增减node时客户端如何感知。

济南大飞哥 2018-09-11 10:30:51
缓存升级,由memcache转到redis,本来我选型的是codis,二笔客户有个懂技术的,基本上任何技术选型他会的才能用,他没涉及的或者不太懂的就不能用,嫌codis团队小,怕有bug。

让使用客户端分片、或者官方的cluster,其实我们的系统就是个小型系统,连中型都算不上。我看了下不管是客户端分片、还是官方的cluster,都有缺点。

客户端分片就不说了,增减机器必须修改客户端的配置,而且数据分片逻辑在增减机器后会有“缓存失效问题”,即便使用了一致性hash算法。

官方的cluster比客户端分片好些,在增减机器时通过迁移槽,能做到不丢数据。问题是客户端无法感知增加的机器,特别是减少机器时,如果客户端的链接池配置了这台机器,直接会导致连接不上。

对于redis cluster 我的想法还是要所有node随机访问以实现负载均衡,且增减机器时,客户端能感知。这个该如何做?
...全文
546 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
济南大飞哥 2018-12-06
  • 打赏
  • 举报
回复
引用 1 楼 年轻的老头-tao 的回复:
可以利用cluster key的计算规则来实现负载均衡(redis cluster存储的时候会根据有效key的一次性hash进而取模(0-16383),决定了key会存储到哪个曹,而每个node上的曹的取值区段基本是平均的), 当然这样对key的设计要求比较高了; 而实际上不需要刻意去设计key,如果数据量特别大的话数据存储基本上是处于平衡的,而数据量小的话负载均衡也没多大意义; 关于node节点自动感知的问题,如果是redis自身down机,节点不可用redis cluster踢出链接, 内部有leader选举模式,选举新的master,只要节点数大于n/2+1整个集群可用。 但是手动增加或减少节点 ,目前好像没有好的方法,因为新加或减少节点意味着曹的区段会发生变化,需要手动重新分配每个节点的曹的范围。 如果是小型项目使用redis 哨兵实现一主多备就足够了,不要搞什么redis cluster。
最终还是用的client hash,暂不考虑扩缩容。
济南大飞哥 2018-09-12
  • 打赏
  • 举报
回复
引用 2 楼 taodengwen 的回复:
cluster增加或减少node,除了上面说的要重新分配node曹的范围外, 客户端也要添加或删除节点的链接

现在就是想对客户端透明,codis是node前面有proxy,proxy注册到zk,而zk也可以集群。因为zk一般不会挂掉,客户端只需要一个zk就能连接后端的集群。客户端只有首次初始化时访问zk,之后订阅了事件,没有proxy的增减的话都不会再访问zk。我觉得这个方案非常的完善。
  • 打赏
  • 举报
回复
cluster增加或减少node,除了上面说的要重新分配node曹的范围外, 客户端也要添加或删除节点的链接
  • 打赏
  • 举报
回复
可以利用cluster key的计算规则来实现负载均衡(redis cluster存储的时候会根据有效key的一次性hash进而取模(0-16383),决定了key会存储到哪个曹,而每个node上的曹的取值区段基本是平均的), 当然这样对key的设计要求比较高了; 而实际上不需要刻意去设计key,如果数据量特别大的话数据存储基本上是处于平衡的,而数据量小的话负载均衡也没多大意义; 关于node节点自动感知的问题,如果是redis自身down机,节点不可用redis cluster踢出链接, 内部有leader选举模式,选举新的master,只要节点数大于n/2+1整个集群可用。 但是手动增加或减少节点 ,目前好像没有好的方法,因为新加或减少节点意味着曹的区段会发生变化,需要手动重新分配每个节点的曹的范围。 如果是小型项目使用redis 哨兵实现一主多备就足够了,不要搞什么redis cluster。

25,985

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧