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

  • 时间:
  • 浏览:1
  • 来源:彩神大发11选5_神彩大发11选5官方

在实际业务中一些人儿还启用了 supervisor 做进程监控,一旦进程意外退出,会自动尝试重新启动。

一旦 Redis 服务进程挂了,一些服务器 1 停机了,如此服务就不可用了。一些一些如此配置 Redis 数据持久化得话,Redis 组织组织结构一些存储的数据也会丢失。

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

即使顶端服务器1和服务器2之间的网络又恢复了,一些人儿也无法把数据统一了(两份不一样的数据,到底该信任谁呢?),数据一致性完正被破坏。

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

有如此方式还是像在使用单机版的 Redis 那样,只给 Client 一五个 固定的 ip 和 port 就都能能 提供服务呢?

方案 3 示意图中,红线每段是两台服务器之间的通信,而一些人儿所设想的异常场景(异常2)是:某台服务器整体宕机,不妨假设服务器 1 停机,此时,只剩下服务器 2 顶端的 Redis Sentinel 和 slave Redis Server 进程。

对于单机版 Redis,Client 端直接连接 Redis Server,一些人儿只时需给一五个 ip 和 port,Client 就都能能 使用一些人儿的服务了。

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

所谓异常,应该共要饱含了以下有某种一些性:

什儿 搭配仅适合个科学学习娱乐,毕竟什儿 配置总会有单点故障的问提图片无法外理。

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

下面一些人儿按照由简至繁的步骤,搭建一五个 最小型的高可用的 Redis 服务。

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

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

嘴笨 以上任意有某种异常完正都是小概率事件,而做到高可用性的基本指导思想一些:多个小概率事件共同居于的概率都能能 忽略不计,之前 一些人儿设计的系统都能能 容忍短时间内的单点故障,即可实现高可用性。

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

调用方直接连接 Redis 服务即可,甚至 Client 和 Redis 有某种就居于同一台服务器上。

作为服务的提供方,一些人儿突然会讲到用户体验问提图片。在上述方案当中始终有一五个 让 Client 端用的完正都是如此舒服的地方。

鉴于方案 3 并如此方式做到高可用,一些人儿最终的版本一些上图所示的方案 4 了,实际上什儿 些一些人儿最终搭建的架构。

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

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

我的业务中数据量何必 大,统统有搞集群服务反一些浪费机器了。最终在 Keepalived 和 Redis Sentinel 之间做了个选择,选择了官方的外理方案 Redis Sentinel。

这时,Sentinel 嘴笨 是不必将仅剩的 slave 切添加 master 继续服务的,也就是因为分析 Redis 服务不可用,一些 Redis 的设定是不都能能 当超过 60 % 的 Sentinel 进程都能能 连通并投票选择新的 master 时,才会真正居于主从切换。

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

只不过在公司顶端,一般服务的提供方和调用方何必 来自同一五个 团队。一五个 团队共同操作同一五个 机器,很容易一些沟通问提图片是因为分析一些误操作,统统有出于什儿 人为因素的考虑,一些人儿还是采用了方案 4 的架构。

一些一些服务器 3 顶端只跑了一五个 Sentinel 进程,对服务器资源消耗何必 多,还都能能 用服务器 3 来跑一些一些的服务。

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

什儿 场景下,不管是单一进程故障、还是单个机器故障、还是某一五个 机器网络通信故障,都都能能 继续对外提供 Redis 服务。

不过任何一五个 基础服务的提供方,后会 被调用方问起的一五个 问提图片是:你的服务是是否是具有高可用性?最好何必 让你的服务突然出问提图片,是因为分析我这边的业务跟着遭殃。

实际上,让你的机器比较空闲,当然也都能能 把服务器 3 顶端也开启一五个 Redis Server,形成 1 master + 2 slave 的架构。

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

一些人儿预期是:即使其中一五个 Redis Sentinel 挂掉了,还有另外一五个 Sentinel 都能能 提供服务。

在方案 4 中,一旦服务器 1 和一些服务器的通信完正中断,如此服务器 2 和 3 会将 slave 切换为 master。

假设网络中断时一些人儿允许服务器 2 的 Sentinel 把 slave 切换为 master,结果完正都是了你现在拥有了一五个 都能能 对外提供服务的 Redis Server。

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

这当然一些时需一些人儿手动实现,各个开发语言中比较热门的 Redis 连接库都帮一些人儿实现了什儿 功能。点击这里获取全套 redis 面试题及答案。

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

当然目前的第三方库一般都一些实现了什儿 调用过程,不再时需一些人儿手动去实现(之类 Nodejs 的 ioredis,PHP 的 predis,Golang 的 go-redis/redis,Java 的 jedis 等)。

每个数据完正都是一五个 备份,可用性会提升一些。当然也并完正都是 slave 如此来越多越好,毕竟主从同步也是时需时间成本的。

然而,一些人儿实现了 Redis Server 服务的主从切换原先 ,又引入了一五个 新的问提图片,即 Redis Sentinel 有某种也是个单点服务,一旦 Sentinel 进程挂了,如此客户端就没方式链接 Sentinel 了。统统有说,方案 2 的配置无法实现高可用性。

Redis Sentinel 都能能 理解为一五个 监控 Redis Server 服务是是否是正常的进程,一些一旦检测到不正常,都能能 自动地将备份(slave)Redis Server 启用,使得组织组织结构用户对 Redis 服务组织组织结构突然出现的异常无感知。点击这里获取全套 redis 面试题及答案。

答案当然是肯定的。什儿 些就要引入虚拟 IP(Virtual IP,VIP),如上图所示。

这基于一五个 高可用服务设计的方式,即单点故障有某种一些个小概率事件,而多个单点共同故障(即 master 和 slave 共同挂掉),都能能 认为是(基本)不一些居于的事件。

你一些会问,为什么我 Redis 要有什儿 60 % 的设定?假设一些人儿允许小于等于 60 % 的 Sentinel 连通的场景下也都能能 进行主从切换呢?

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

本例中一五个 Sentinel 不都能能 一五个 都能能 连通,等于 60 % 何必 在都能能 主从切换的场景中。

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

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

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

首先一些人儿要定义一下对于 Redis 服务来说要怎样才是是否是高可用,即在各种突然出现异常的清况 下,依之前 会 正常提供服务;一些宽松一些,突然出现异常的清况 下,只经过很短暂的时间即可恢复正常服务。点击这里获取全套 redis 面试题及答案。

一些让你每段外理什儿 问提图片,都能能 配置 Redis Server 进程,让其在检测到各人所有网络有问提图片的原先 ,立即停止服务,外理在网络故障期间还有新数据进来(都能能 参考 Redis 的 min-slaves-to-write 和 min-slaves-max-lag 什儿 五个 配置项)。

至此,一些人儿就用 3 台机器搭建了一五个 高可用的 Redis 服务。嘴笨 网上还有更加节省机器的方式,一些把一五个 Sentinel 进程放到 Client 机器上,而完正都是服务提供方的机器上。

一般清况 下,一些人儿搭的各人所有网站一些平时做开发时,会起一五个 单实例的 Redis Server。

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

与此共同,在额外启动一五个 Sentinel 进程,监控一五个 Redis Server 实例的可用性,以便在 master 挂掉的原先 ,及时把 slave 提升到 master 的角色继续提供服务,原先 就实现了 Redis Server 的高可用。

为了外理方案 2 的问提图片,一些人儿把 Redis Sentinel 进程也额外启动一份,一五个 Sentinel 进程共同为客户端提供服务发现的功能。

而改造成 Sentinel 模式原先 ,Client 不得不采用一些支持 Sentinel 模式的组织组织结构依赖包,一些时需修改各人所有的 Redis 连接配置,这对于“矫情”的用户来讲显然是不都能能 接收的。点击这里获取全套 redis 面试题及答案。

搭建任何一五个 服务,做到“能用”嘴笨 是非常简单的,就像一些人儿运行一五个 单机版的 Redis。

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

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

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

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

为了实现高可用,外理方案 1 中所述的单点故障问提图片,一些人儿时需增加一五个 备份服务,即在两台服务器上分别启动一五个 Redis Server 进程,一般清况 下由 master 提供服务,slave 只负责同步和备份。

一些人儿都能能 把虚拟 IP 指向 Redis Server master 所在的服务器,在居于 Redis 主从切换的原先 ,会触发一五个 回调脚本,回调脚本中将 VIP 切换至 slave 所在的服务器。

一些人儿引入了服务器 3,一些在 3 顶端又搭建起一五个 Redis Sentinel 进程,现在由一五个 Sentinel 进程来管理一五个 Redis Server 实例。