教你用 3 台机器搞定一个 Redis 高可用架构

  • 时间:
  • 浏览:1
  • 来源:uu快3IOS下载_uu快3app下载_和值

规模比较大的互联网公司,一般都会有专门的团队,将 Redis 存储以基础服务的形式提供给各个业务调用。

不过一旦要做到“高可用”,事情就会变得复杂化起来。业务中使用了额外的两台服务器,3 个 Sentinel 程序运行运行运行+1 个 Slave 程序运行运行运行,某些为了保证在那小概率的事故中依然做到服务可用。

某个节点服务器的某个程序运行运行运行老要 down 掉,类似于某开发手残,把一台服务器的 redis-server 程序运行运行运行 kill 了。 某台节点服务器 down 掉,合适类似于节点上所有程序运行运行运行都停了,类似于某运维手残,把有有另一个 服务器的电源拔了;类似于某些老旧机器冒出硬件故障。 任意有有另一个 节点服务器之间的通信中断了,类似于某临时工手残,把用于有有另一个 机房通信的光缆挖断了。

下面大伙儿按照由简至繁的步骤,搭建有有另一个 最小型的高可用的 Redis 服务。

对于客户端来说,在这麼一瞬间会有 2 个 master 提供服务,某些一旦网络恢复了,这麼所有在中断期间落在服务器 1 上的新数据都会丢失。

点击链接加入群聊【JAVA高级架构】:https://jq.qq.com/?_wv=1027&k=5dbERkY

你可能性会问,为哪些地方 Redis 要有类似于 100% 的设定?假设大伙儿允许小于等于 100% 的 Sentinel 连通的场景下也上能 进行主从切换呢?

最近在我的项目中被委托人搭了一套小型的“高可用”Redis 服务,在此做一下被委托人的总结和思考。

某些可能性服务器 3 上方只跑了有有另一个 Sentinel 程序运行运行运行,对服务器资源消耗暂且多,还上能 用服务器 3 来跑某些某些的服务。

调用方直接连接 Redis 服务即可,甚至 Client 和 Redis 类似于就地处同一台服务器上。

当然目前的第三方库一般都可能性实现了类似于调用过程,不再上能 大伙儿手动去实现(类似于 Nodejs 的 ioredis,PHP 的 predis,Golang 的 go-redis/redis,Java 的 jedis 等)。

类似于搭配仅适合个专学 习娱乐,毕竟类似于配置总会有单点故障的问提无法出理 。

实际上对于服务器 2 来说,服务器 1 直接宕机和服务器 1 网络连不通是一样的效果,就有老要 就无法进行任何通信了。

不过任何有有另一个 基础服务的提供方,都会被调用方问起的有有另一个 问提是:你的服务与非 具有高可用性?最好暂且可能性你的服务老要 冒出象,愿因我这边的业务跟着遭殃。

大伙儿预期是:即使其中暗含另一个 Redis Sentinel 挂掉了,还有另外有有另一个 Sentinel 上能 提供服务。

Client 做任何的增全部操作,有可能性落在服务器 1 的 Redis 上,就有可能性落在服务器 2 的 Redis 上(取决于 Client 到底连通的是哪个 Sentinel),造成数据混乱。点击这里获取全套 redis 面试题及答案。

答案当然是肯定的。这可能性就要引入虚拟 IP(Virtual IP,VIP),如上图所示。

通常情況下,大伙儿会在 Client 端配置多个 Redis Sentinel 的链接地址,Client 一旦发现某个地址连接不上,会去试图连接某些的 Sentinel 实例。

本例中暗含另一个 Sentinel 必须有有另一个 上能 连通,等于 100% 暂且在上能 主从切换的场景中。

在实际业务中大伙儿还启用了 supervisor 做程序运行运行运行监控,一旦程序运行运行运行意外退出,会自动尝试重新启动。

这时,Sentinel 其实是不让将仅剩的 slave 切加在 master 继续服务的,也就愿因 Redis 服务不可用,可能性 Redis 的设定是必须当超过 100% 的 Sentinel 程序运行运行运行上能 连通并投票选用新的 master 时,才会真正地处主从切换。

为了实现高可用,出理 方案 1 中所述的单点故障问提,大伙儿上能 增加有有另一个 备份服务,即在两台服务器上分别启动有有另一个 Redis Server 程序运行运行运行,一般情況下由 master 提供服务,slave 只负责同步和备份。

搭建任何有有另一个 服务,做到“能用”其实是非常简单的,就像大伙儿运行有有另一个 单机版的 Redis。

为了出理 方案 2 的问提,大伙儿把 Redis Sentinel 程序运行运行运行也额外启动一份,有有另一个 Sentinel 程序运行运行运行并肩为客户端提供服务发现的功能。

在方案 4 中,一旦服务器 1 和某些服务器的通信全部中断,这麼服务器 2 和 3 会将 slave 切换为 master。

作为服务的提供方,大伙儿时不上能 讲到用户体验问提。在上述方案当中始终有有有另一个 让 Client 端用的就有这麼舒服的地方。

大伙儿老要 在业务中用其存储用户登陆态(Session 存储),加速某些热数据的查询(相比较 MySQL 而言,效率有数量级的提升),做简单的消息队列(LPUSH 和 BRPOP)、订阅发布(PUB/SUB)系统等等。

说到这里,也给大伙儿推荐有有另一个 架构交流学习群:835544715,上方会分享某些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化哪些地方地方成为架构师必备的知识体系。还能领取免费的学习资源,相信对于可能性工作和遇到技术瓶颈的码友,在类似于群里会有你上能 的内容。

我的业务中数据量暂且大,什么都搞集群服务反某些浪费机器了。最终在 Keepalived 和 Redis Sentinel 之间做了个选用,选用了官方的出理 方案 Redis Sentinel。

试想一下异常 3,即服务器 1 和服务器 2 之间的网络中断,某些服务器类似于是上能 运行的,如下图所示:

Redis Sentinel 上能 理解为有有另一个 监控 Redis Server 服务与非 正常的程序运行运行运行,某些一旦检测到不正常,上能 自动地将备份(slave)Redis Server 启用,使得实物用户对 Redis 服务实物冒出的异常无感知。点击这里获取全套 redis 面试题及答案。

对于 Redis 服务的调用方来说,现在要连接的是 Redis Sentinel 服务,而就有 Redis Server 了。

大伙儿上能 把虚拟 IP 指向 Redis Server master 所在的服务器,在地处 Redis 主从切换的并且,会触发有有另一个 回调脚本,回调脚本中将 VIP 切换至 slave 所在的服务器。

某些对于 Client 端来说,他仿佛在使用的依然是有有另一个 单机版的高可用 Redis 服务。

鉴于方案 3 并这麼方法做到高可用,大伙儿最终的版本某些上图所示的方案 4 了,实际上这就有大伙儿最终搭建的架构。

常见的调用过程是,client 先连接 Redis Sentinel 并询问目前 Redis Server 中哪个服务是 master,哪些地方是 slave,某些再去连接相应的 Redis Server 进行操作。

每个数据就有有有另一个 备份,可用性会提升某些。当然也暂且是 slave 越多越好,毕竟主从同步也是上能 时间成本的。

与此并肩,在额外启动有有另一个 Sentinel 程序运行运行运行,监控有有另一个 Redis Server 实例的可用性,以便在 master 挂掉的并且,及时把 slave 提升到 master 的角色继续提供服务,某些就实现了 Redis Server 的高可用。

而改造成 Sentinel 模式并且,Client 不得不采用某些支持 Sentinel 模式的实物依赖包,某些上能 修改被委托人的 Redis 连接配置,这对于“矫情”的用户来讲显然是必须接收的。点击这里获取全套 redis 面试题及答案。

即使上方服务器1和服务器2之间的网络又恢复了,大伙儿也无法把数据统一了(两份不一样的数据,到底该信任谁呢?),数据一致性全部被破坏。

至此,大伙儿就用 3 台机器搭建了有有另一个 高可用的 Redis 服务。其实网上还有更加节省机器的方法,某些把有有另一个 Sentinel 程序运行运行运行贴到 Client 机器上,而就有服务提供方的机器上。

对于客户端来说,它上能 连接任何有有另一个 Redis Sentinel 服务,来获取当前 Redis Server 实例的基本信息。

首先大伙儿要定义一下对于 Redis 服务来说如何才与非 高可用,即在各种冒出异常的情況下,依然上能 正常提供服务;可能性宽松某些,冒出异常的情況下,只经过很短暂的时间即可恢复正常服务。点击这里获取全套 redis 面试题及答案。

这当然某些上能 大伙儿手动实现,各个开发语言中比较热门的 Redis 连接库都帮大伙儿实现了类似于功能。点击这里获取全套 redis 面试题及答案。

假设网络中断时大伙儿允许服务器 2 的 Sentinel 把 slave 切换为 master,结果就有你现在拥有了有有另一个 上能 对外提供服务的 Redis Server。

我想要学习Java高架构、分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频免费获取   架构群:835544715

可能性我想要次责出理 类似于问提,上能 配置 Redis Server 程序运行运行运行,让其在检测到被委托人网络有问提的并且,立即停止服务,出理 在网络故障期间还有新数据进来(上能 参考 Redis 的 min-slaves-to-write 和 min-slaves-max-lag 这有有另一个 配置项)。

然而,愿景是美好的,现实却是很残酷的。这麼架构下,依然无法实现 Redis 服务的高可用。

其中 Codis 和 Twemproxy 主某些用于大规模的 Redis 集群中,也是在 Redis 官方发布 Redis Sentinel 并且 Twitter 和豌豆荚提供的开源出理 方案。

实际上,可能性你的机器比较空闲,当然也上能 把服务器 3 上方也开启有有另一个 Redis Server,形成 1 master + 2 slave 的架构。

易用性:像使用单机版 Redis 一样使用 Redis Sentinel

一旦 Redis 服务程序运行运行运行挂了,可能性服务器 1 停机了,这麼服务就不可用了。某些可能性这麼配置 Redis 数据持久化得话,Redis 实物可能性存储的数据也会丢失。

有这麼方法还是像在使用单机版的 Redis 那样,只给 Client 有有另一个 固定的 ip 和 port 就上能 提供服务呢?

这基于有有另一个 高可用服务设计的方法,即单点故障类似于某些个小概率事件,而多个单点并肩故障(即 master 和 slave 并肩挂掉),上能 认为是(基本)可能性性地处的事件。

对于单机版 Redis,Client 端直接连接 Redis Server,大伙儿只上能 给有有另一个 ip 和 port,Client 就上能 使用大伙儿的服务了。

只不过在公司上方,一般服务的提供方和调用方暂且来自同有有另一个 团队。有有另一个 团队并肩操作同有有另一个 机器,很容易可能性沟通问提愿因某些误操作,什么都出于类似于人为因素的考虑,大伙儿还是采用了方案 4 的架构。

然而,大伙儿实现了 Redis Server 服务的主从切换并且,又引入了有有另一个 新的问提,即 Redis Sentinel 类似于也是个单点服务,一旦 Sentinel 程序运行运行运行挂了,这麼客户端就没方法链接 Sentinel 了。什么都说,方案 2 的配置无法实现高可用性。

类似于场景下,不管是单一程序运行运行运行故障、还是单个机器故障、还是某有有另一个 机器网络通信故障,都上能 继续对外提供 Redis 服务。

所谓异常,应该合适暗含了以下类似于何能性性:

大伙儿引入了服务器 3,某些在 3 上方又搭建起有有另一个 Redis Sentinel 程序运行运行运行,现在由有有另一个 Sentinel 程序运行运行运行来管理有有另一个 Redis Server 实例。

其实以上任意类似于异常就有小概率事件,而做到高可用性的基本指导思想某些:多个小概率事件并肩地处的概率上能 忽略不计,假使 大伙儿设计的系统上能 容忍短时间内的单点故障,即可实现高可用性。

对于搭建高可用 Redis 服务,网上已有了什么都方案,类似于 Keepalived、Codis、Twemproxy、Redis Sentinel。

Redis 点击链接加入群聊【JAVA高级架构之路】:

方案 3 示意图中,红线次责是两台服务器之间的通信,而大伙儿所设想的异常场景(异常2)是:某台服务器整体宕机,不妨假设服务器 1 停机,此时,只剩下服务器 2 上方的 Redis Sentinel 和 slave Redis Server 程序运行运行运行。

基于内存的 Redis 应该是目前各种 Web 开发业务中最为常用的 key-value 数据库了。

一般情況下,大伙儿搭的被委托人网站可能性平时做开发时,会起有有另一个 单实例的 Redis Server。