当前位置:首页 > 问答 > 正文

用Redis一体化搞定集群内外网数据共享和管理问题

开始)

我看过一些技术团队的实际操作,他们确实用Redis比较巧妙地解决了一个常见又头疼的问题:就是一个应用集群,它内部的服务之间需要高速交换数据,但同时,又得安全地把一部分数据提供给外部的网络或者系统来访问,这就像是公司内部员工要高效沟通,又得开一个对外的窗口服务客户,两边还不能互相干扰,他们用Redis就把这事儿给办了。

他们遇到的麻烦是这样的,一个系统拆成了好多小的微服务,这些服务都跑在同一个内部的私有网络里,比如用Kubernetes搭的集群,这些服务之间需要共享一些数据,比如用户的会话信息、一些临时的状态、或者全局的配置开关,这些数据的特点就是读写的频率非常高,而且要求速度极快,延迟要低,同时呢,还有一些外部的系统,比如另一个机房的应用、合作伙伴的接口,或者移动APP,也需要读取这个集群里的某些数据,比如商品目录、公开的用户资料等,但外部网络和内部集群网络通常是不直接连通的,这是为了安全,如果让外部系统直接来访问内部的Redis,就等于在防火墙上开了个大洞,风险很大。

那他们是怎么用Redis一体化解决的呢?核心思路不是用一个Redis实例去应付所有事情,而是利用Redis的复制功能,搞一个“主从”结构,我参考过某个电商平台的案例,他们的做法很典型。

他们在最安全的内网集群里,部署一个Redis实例,把这个实例当作“主库”,所有内部的微服务,无论是需要写数据还是读数据,都直接跟这个主库打交道,因为都在同一个高速内网,所以延迟极低,速度飞快,保证了内部服务之间数据共享的性能要求。

他们在另一个区域,比如一个专门用于对外访问的、安全性稍低的网络区域(通常称为DMZ区或者边界网络),单独再部署一个或多个Redis实例,把这些实例设置成内网那个主库的“从库”,这个从库的唯一任务,就是几乎实时地从主库那里复制数据,Redis的主从复制是异步的,但速度非常快,延迟通常在毫秒级别。

这样一来,外部系统或者外部网络的应用,就不再需要直接连接内部那个核心的主库了,它们被引导去访问部署在外部网络区域的那个Redis从库,外部系统只能读取数据,不能写入,因为从库的数据是从主库同步过来的,所以外部系统看到的数据和内部服务使用的数据基本是一致的,只是有非常短暂的延迟。

这样做的好处一下子就出来了,首先是安全性大大提高了,内部的核心数据源(主库)完全隐藏在内部网络里,不暴露给公网,外部攻击者即使找到了外部从库的漏洞,也只能进行只读操作,无法修改或破坏核心数据,相当于在主库前面立了一道坚固的屏障。

职责分离了,内部服务专注于业务逻辑和高速数据读写,不受外部大量查询请求的干扰,外部的查询压力全部由外部的从库来承担,如果外部访问量突然变大,他们还可以在外部区域多部署几个从库,做成负载均衡,轻松应对高并发读取,而内部的主库依然稳如泰山,不会被拖慢。

管理起来很方便,这整个一套,主库、从库,都是Redis,用的是一样的命令、一样的客户端库,对于开发人员来说,学习成本低,写代码的方式几乎一样,只是连接的地不同而已,运维人员也只需要维护同一套技术体系,不需要再去集成另一种缓存数据库,降低了复杂度。

他们也不是说就这么简单一套走天下,在具体实施的时候,还会考虑一些细节,他们会仔细规划哪些数据需要同步到外部的从库上,并不是所有内部数据都适合给外部访问,他们可能会通过配置,只选择特定的某些Key,或者某类前缀的Key同步到从库,避免敏感数据泄露,他们也会严密监控主从复制之间的延迟,确保外部系统获取的数据不会太旧。

通过Redis内置的主从复制功能,他们搭建了一个既满足内网高速访问、又实现外网安全共享的一体化数据层,这个方案没有用什么特别高深莫测的技术,就是利用了Redis本身一个很核心、很成熟的功能,但组合起来就非常有效地解决了集群内外网数据共享和管理的核心痛点。 结束)

用Redis一体化搞定集群内外网数据共享和管理问题