前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >跨网访问Redis Cluster的处理过程

跨网访问Redis Cluster的处理过程

原创
作者头像
用户1604609
修改2019-02-25 11:01:07
2.3K0
修改2019-02-25 11:01:07
举报
文章被收录于专栏:My文章My文章

近期有个业务,需要访问跨网Redis集群,这里记录下处理过程。

Redis Cluster是Redis的一个分布式实现,分区存储和备份数据,扩大了Redis的容量和并发。

redis-cluster架构图
redis-cluster架构图

(1)redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽

(2)节点的fail是通过集群中超过半数的节点检测失效时才生效

(3)redis-cluster把所有的物理节点映射到slot上,cluster负责维护node<->slot<->value

(4)client与redis节点直连,不需要中间proxy层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

如果client一开始连接的redis节点没有要访问的数据,cluster会告诉client重定向到另一个节点,例如:

代码语言:c++
复制
redis 127.0.0.1:7000> get foo
-> Redirected to slot [12182] located at 127.0.0.1:7002
"bar"

Redis Cluster进一步了解可以看官方介绍

Redis cluster tutorial

Redis 集群教程

如图所示,当前业务和Redis Cluster分属两个不同的网络,网络A、网络B之间跨网访问,要开白名单,把网络B中的IP映射到网络A,网络A的业务client通过映射后的本地IP访问网络B中的redis节点。

一开始想能否对网络B每个redis节点都映射一个IP到网络A,问题是redis节点和cluster只知道它们在网络B的IP,并不知道映射到网络A的IP,redis重定向返回给client还是网络B的节点IP,业务client无法直接访问重定向返回的这个IP,除非把映射规则告诉业务client或redis,让client能够访问映射之后的IP。

但是,要修改业务client或redis代码,client访问点很多,修改复杂,redis开源代码不熟,修改也可能引入新的bug,还涉及线上redis部署更新,风险高,可行性都不大;而且,日后redis扩容迁移都要重新映射IP,是个潜在的坑,就不用考虑这种方式了。

在尽可能不动现有部署环境的前提下,自然想到使用redis代理。

众多redis代理中,很出名的就是Twemproxy了,不少知名网站的redis集群都使用了Twemproxy方案。

关于Twemproxy的安装介绍,可以看这里:

GitHub项目Twemproxy

Twemproxy, a Redis proxy from Twitter

起初尝试用Twemproxy做代理,但遗憾的是,对于redis重定向场景,Twemproxy给client返回的重定向redis节点还是网络B的IP,client跨网仍然无法走通。

又尝试另外一个代理——Predixy。经过测试,predixy会直接返回数据,不再返回重定向的节点IP,重定向过程对client完全透明,功能上正好适用于跨网访问,问题解决。

代码语言:c++
复制
redis 127.0.0.1:7000> get foo
"bar"

并且,对比其他几款代理工具,predixy功能全面性能高,是个不错的代理选择。

关于几款redis代理的功能性能对比,可以看这里:

predixy一款高性能全功能redis代理

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档