如何搭建高可用redis架构?

news2025/3/12 13:02:21

题记

Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。

如今,互联网业务的数据正以更快的速度在增长,数据类型越来越丰富,这对数据处理的速度和能力提出了更高要求。Redis 是一种开源的内存非关系型数据库,给开发人员带来的体验是颠覆性的。在自始至终的设计过程中,都充分考虑高性能,这使得 Redis 成为当今速度最快的 NoSQL 数据库。

    

考虑高性能的同时,高可用也是很重要的考虑因素。互联网 7x24 无间断服务,在故障期间以最快的速度 Failover,能给企业带来最小的损失。

那么,在实际应用中,都有哪些高可用架构呢?架构之间有何优劣?我们应该怎么取舍?有哪些最佳实践?

二、Sentinel (哨兵)原理

在讲解 Redis 高可用方案之前,我们先来看看 Redis Sentinel 原理(https://redis.io/topics/sentinel)是怎么样的。

  1. Sentinel 集群通过给定的配置文件发现 master,启动时会监控 master。通过向 master 发送 info 信息获得该服务器下面的所有从服务器。

  2. Sentinel 集群通过命令连接向被监视的主从服务器发送 hello 信息 (每秒一次),该信息包括 Sentinel 本身的 IP、端口、id 等内容,以此来向其他 Sentinel 宣告自己的存在。

  3. Sentinel 集群通过订阅连接接收其他 Sentinel 发送的 hello 信息,以此来发现监视同一个主服务器的其他 Sentinel;集群之间会互相创建命令连接用于通信,因为已经有主从服务器作为发送和接收 hello 信息的中介,Sentinel 之间不会创建订阅连接。

  4. Sentinel 集群使用 ping 命令来检测实例的状态,如果在指定的时间内(down-after-milliseconds)没有回复或则返回错误的回复,那么该实例被判为下线。

  5. 当 failover 主备切换被触发后,failover 并不会马上进行,还需要 Sentinel 中的大多数 Sentinel 授权后才可以进行 failover,即进行 failover 的 Sentinel 会去获得指定 quorum 个的 Sentinel 的授权,成功后进入 ODOWN 状态。如在 5 个 Sentinel 中配置了 2 个 quorum,等到 2 个 Sentinel 认为 master 死了就执行 failover。

  6. Sentinel 向选为 master 的 slave 发送 SLAVEOF NO ONE 命令,选择 slave 的条件是 Sentinel 首先会根据 slaves 的优先级来进行排序,优先级越小排名越靠前。如果优先级相同,则查看复制的下标,哪个从 master 接收的复制数据多,哪个就靠前。如果优先级和下标都相同,就选择进程 ID 较小的。

  7. Sentinel 被授权后,它将会获得宕掉的 master 的一份最新配置版本号 (config-epoch),当 failover 执行结束以后,这个版本号将会被用于最新的配置,通过广播形式通知其它 Sentinel,其它的 Sentinel 则更新对应 master 的配置。

1 到 3 是自动发现机制:

  • 以 10 秒一次的频率,向被监视的 master 发送 info 命令,根据回复获取 master 当前信息。

  • 以 1 秒一次的频率,向所有 redis 服务器、包含 Sentinel 在内发送 PING 命令,通过回复判断服务器是否在线。

  • 以 2 秒一次的频率,通过向所有被监视的 master,slave 服务器发送当前 Sentinel master 信息的消息。

4 是检测机制,5 和 6 是 failover 机制,7 是更新配置机制。[1]

三、Redis 高可用架构

讲解完 Redis Sentinel 原理之后,接下来讲解常用的 Redis 高可用架构

  • Redis Sentinel 集群 + 内网 DNS + 自定义脚本

  • Redis Sentinel 集群 + VIP + 自定义脚本

  • 封装客户端直连 Redis Sentinel 端口

    • JedisSentinelPool,适合 Java

    • PHP 基于 phpredis 自行封装

  • Redis Sentinel 集群 + Keepalived/Haproxy

  • Redis M/S + Keepalived

  • Redis Cluster

  • Twemproxy

  • Codis

接下来配合图文逐个讲解。

1、Redis Sentinel 集群 + 内网 DNS + 自定义脚本

Redis Sentinel 集群 + 内网 DNS + 自定义脚本

上图是已经在线上环境应用的方案。底层是 Redis Sentinel 集群,代理着 Redis 主从,Web 端连接内网 DNS 提供服务。内网 DNS 按照一定的规则分配,比如 xxxx.redis.cache/queue.port.xxx.xxx,第一个段表示业务简写,第二个段表示这是 Redis 内网域名,第三个段表示 Redis 类型,cache 表示缓存,queue 表示队列,第四个段表示 Redis 端口,第五、第六个段表示内网主域名。

当主节点发生故障,比如机器故障、Redis 节点故障或者网络不可达,Sentinel 集群会调用 client-reconfig-script 配置的脚本,修改对应端口的内网域名。对应端口的内网域名指向新的 Redis 主节点。

优点

秒级切换,在 10s 内完成整个切换操作

脚本自定义,架构可控

对应用透明,前端不用担心后端发生什么变化

 

缺点:

维护成本略高,Redis Sentinel 集群建议投入 3 台机器以上

依赖 DNS,存在解析延时

Sentinel 模式存在短时间的服务不可用

服务通过外网访问不可采用此方案

 

2、Redis Sentinel 集群 + VIP + 自定义脚本

Redis Sentinel 集群 + VIP + 自定义脚本

此方案和上一个方案相比,略有不同。第一个方案使用了内网 DNS,第二个方案把内网 DNS 换成了虚拟 IP。底层是 Redis Sentinel 集群,代理着 Redis 主从,Web 端通过 VIP 提供服务。在部署 Redis 主从的时候,需要将虚拟 IP 绑定到当前的 Redis 主节点。当主节点发生故障,比如机器故障、Redis 节点故障或者网络不可达,Sentinel 集群会调用 client-reconfig-script 配置的脚本,将 VIP 漂移到新的主节点上。

优点:

  • 秒级切换,在 5s 内完成整个切换操作

  • 脚本自定义,架构可控

  • 对应用透明,前端不用担心后端发生什么变化

 

缺点:

  • 维护成本略高,Redis Sentinel 集群建议投入 3 台机器以上

  • 使用 VIP 增加维护成本,存在 IP 混乱风险

  • Sentinel 模式存在短时间的服务不可用

  • 3.3 封装客户端直连 Redis Sentinel 端口

3、封装客户端直连 Redis Sentinel 端口

部分业务只能通过外网访问 Redis,上述两种方案均不可用,于是衍生出了这种方案。Web 使用客户端连接其中一台 Redis Sentinel 集群中的一台机器的某个端口,然后通过这个端口获取到当前的主节点,然后再连接到真实的 Redis 主节点进行相应的业务员操作。需要注意的是,Redis Sentinel 端口和 Redis 主节点均需要开放访问权限。如果前端业务使用 Java,有 JedisSentinelPool 可以复用;如果前端业务使用 PHP,可以在 phpredis 的基础上做二次封装。

优点:

  • 服务探测故障及时

  • DBA 维护成本低

 

缺点:

  • 依赖客户端支持 Sentinel

  • Sentinel 服务器和 Redis 节点需要开放访问权限

  • 对应用有侵入性

4、Redis Sentinel 集群 + Keepalived/Haproxy

Redis Sentinel 集群 + Keepalived/Haproxy

底层是 Redis Sentinel 集群,代理着 Redis 主从,Web 端通过 VIP 提供服务。当主节点发生故障,比如机器故障、Redis 节点故障或者网络不可达,Redis 之间的切换通过 Redis Sentinel 内部机制保障,VIP 切换通过 Keepalived 保障。

优点:

  • 秒级切换

  • 对应用透明

缺点:

  • 维护成本高

  • 存在脑裂

  • Sentinel 模式存在短时间的服务不可用

 

5、Redis M/S + Keepalived

Redis M/S + Keepalived

此方案没有使用到 Redis Sentinel。此方案使用了原生的主从和 Keepalived,VIP 切换通过 Keepalived 保障,Redis 主从之间的切换需要自定义脚本实现。

优点:

  • 秒级切换

  • 对应用透明

  • 部署简单,维护成本低

缺点:

  • 需要脚本实现切换功能

  • 存在脑裂

6、Redis Cluster

Redis Cluster

From: http://intro2libsys.com/focused-redis-topics/day-one/intro-redis-cluster

Redis 3.0.0 在 2015 年 4 月 2 日正式发布,距今已有两年多的时间。Redis 集群采用 P2P 模式,无中心化。把 key 分成 16384 个 slot,每个实例负责一部分 slot。客户端请求对应的数据,若该实例 slot 没有对应的数据,该实例会转发给对应的实例。另外,Redis 集群通过 Gossip 协议同步节点信息。

优点:

  • 组件 all-in-box,部署简单,节约机器资源

  • 性能比 proxy 模式好

  • 自动故障转移、Slot 迁移中数据可用

  • 官方原生集群方案,更新与支持有保障

缺点:

  • 架构比较新,最佳实践较少

  • 多键操作支持有限(驱动可以曲线救国)

  • 为了性能提升,客户端需要缓存路由表信息

  • 节点发现、reshard 操作不够自动化

7、Twemproxy

Twemproxy

From: http://engineering.bloomreach.com/the-evolution-of-fault-tolerant-redis-cluster

多个同构 Twemproxy(配置相同)同时工作,接受客户端的请求,根据 hash 算法,转发给对应的 Redis。

Twemproxy 方案比较成熟了,之前我们团队长期使用此方案,但是效果并不是很理想。一方面是定位问题比较困难,另一方面是它对自动剔除节点的支持不是很友好。

优点:

  • 开发简单,对应用几乎透明

  • 历史悠久,方案成熟

缺点:

  • 代理影响性能

  • LVS 和 Twemproxy 会有节点性能瓶颈

  • Redis 扩容非常麻烦

  • Twitter 内部已放弃使用该方案,新使用的架构未开源

8、Codis

Codis

From: https://github.com/CodisLabs/codis

Codis 是由豌豆荚开源的产品,涉及组件众多,其中 ZooKeeper 存放路由表和代理节点元数据、分发 Codis-Config 的命令;Codis-Config 是集成管理工具,有 Web 界面供使用;Codis-Proxy 是一个兼容 Redis 协议的无状态代理;Codis-Redis 基于 Redis 2.8 版本二次开发,加入 slot 支持,方便迁移数据。

优点:

  • 开发简单,对应用几乎透明

  • 性能比 Twemproxy 好

  • 有图形化界面,扩容容易,运维方便

缺点:

  • 代理依旧影响性能

  • 组件过多,需要很多机器资源

  • 修改了 Redis 代码,导致和官方无法同步,新特性跟进缓慢

  • 开发团队准备主推基于 Redis 改造的 reborndb

四、最佳实践

所谓的最佳实践,都是最适合具体场景的实践。

主推以下方案:

  • Redis Sentinel 集群 + 内网 DNS + 自定义脚本

  • Redis Sentinel 集群 + VIP + 自定义脚本

以下是实战过程中总结出的最佳实践:

  • Redis Sentinel 集群建议使用 >= 5 台机器

  • 不同的大业务可以使用一套 Redis Sentinel 集群,代理该业务下的所有端口

  • 根据不同的业务划分好 Redis 端口范围

  • 自定义脚本建议采用 Python 实现,扩展便利

  • 自定义脚本需要注意判断当前的 Sentinel 角色

  • 自定义脚本传入参数:<service_name> <role> <comment> <from_ip> <from_port> <to_ip> <to_port>

  • 自定义脚本需要远程 ssh 操作机器,建议使用 paramiko 库,避免重复建立 SSH 连接,消耗时间

  • 加速 SSH 连接,建议关闭以下两个参数

  • UseDNS no

  • GSSAPIAuthentication no

  • 微信或者邮件告警,建议 fork 一个进程,避免主进程阻塞

  • 自动切换和故障切换,所有操作建议在 15s 以内完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/640548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python怎么建网站的SEO

Python怎么建网站的SEO 介绍 Python是一种流行的编程语言&#xff0c;其灵活性和可靠性使其成为了许多网站开发人员的首选语言之一。Python可以用于构建各种类型的网站&#xff0c;包括电子商务和企业级应用程序等。但是&#xff0c;构建一个网站是不够的&#xff0c;您还需要…

力扣刷题记录--二叉树相关问题

目录 二叉树的前中后序遍历递归方法迭代方法&#xff08;未统一写法&#xff09;前序迭代中序迭代后序迭代 迭代方法&#xff08;统一模板&#xff09;二叉树遍历LeetCode 144. 二叉树的前序遍历LeetCode 145. 二叉树的后序遍历LeetCode 94. 二叉树的中序遍历 n叉树的遍历LeetC…

树莓派(raspbian2)上开发OpenCv_C++

树莓派[raspbian2]上开发OpenCv_C 背景故事一.首先就是搭建环境了1.该位置是环境下载地址2.远程连接3.安装OpenCV(如果使用的是上面的镜像,则不用安装) 二.代码示例1.打开摄像头2.采集图像 以上是2023-06-12的日志,接下来还有四天的实训!继续更新! 背景故事 最近刚好赶上学校的…

chatgpt赋能python:Python怎样进行快速复制?

Python怎样进行快速复制&#xff1f; 如果你经常使用Python编程&#xff0c;那么你了解到实现复制粘贴操作的重要性。可以通过快速复制代码片段&#xff0c;提高您的生产力和效率。在这篇文章中&#xff0c;我们将讨论一些Python中的技巧和工具&#xff0c;以便您进行快速复制…

《剑指 Offer--LeetCode 学习计划》-- 链表

剑指 Offer 06. 从尾到头打印链表&#xff08;Easy&#xff09; 题目描述 输入一个链表的头节点&#xff0c;从尾到头反过来返回每个节点的值&#xff08;用数组返回&#xff09;。限制&#xff1a;0 < 链表长度 < 10000。 举例说明 示例 1&#xff1a; 输入&#xf…

谈谈几个常见数据结构的原理

数组 数组是最常用的数据结构&#xff0c;创建数组必须要内存中一块 连续 的空间&#xff0c;并且数组中必须存放 相同 的数据类型。比如我们创建一个长度为10&#xff0c;数据类型为整型的数组&#xff0c;在内存中的地址是从1000开始&#xff0c;那么它在内存中的存储格式如…

【送书福利-第十期】清华社 IT BOOK 多得图书活动 ~!

大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我&#xff01; 本文目录 一、前言二、内容介绍三、抽奖方…

第一章JUC概述

文章目录 什么是JUC为什么学习好多线程很重要硬件来说软件来说存在的问题 Java多线程相关概念一把锁两个并三个程进程和程序的联系线程和进程的联系管程 用户线程和守护线程JAVA线程 什么是JUC 在 Java 5.0 提供了 java.util.concurrent &#xff08; 简称JUC &#xff09; 包…

Spring Cloud Alibaba - Sentinel源码分析

目录 一、Sentinel核心源码分析 1、Sentinel核心概念 1.1、Node之间的关系 2、Sentinel源码入口 2.1、SlotChain解析 2.2、NodeSelectorSlot解析 2.3、ClusterBuilderSlot解析 一、Sentinel核心源码分析 Sentinel是分布式系统的防御系统。以流量为切入点&#xff0c;通过…

001安装Jenkins

安装JenkinsJenkins 是一个开源自动化服务器http://www.jenkins.io/zh/doc/book/installing/#%E7%B3%BB%E7%BB%9F%E8%A6%81%E6%B1%82 docker docker run \-u root \--rm \-d \-p 8080:8080 \-p 50000:50000 \-v jenkins-data:/var/jenkins_home \-v /var/run/docker.sock:/va…

传感器融合概念及对比

1.多传感器融合的定义 传感器数据融合的定义可以概括为把分布在不同位置的多个同类或不同类传感器所提供的局部数据资源加以综合&#xff0c;采用计算机技术对其进行分析&#xff0c;消除多传感器信息之间可能存在的冗余和矛盾&#xff0c;加以互补&#xff0c;降低其不确实性…

记录好项目D2

记录好项目 你好呀&#xff0c;这里是我专门记录一下从某些地方收集起来的项目&#xff0c;对项目修改&#xff0c;进行添砖加瓦&#xff0c;变成自己的闪亮项目。修修补补也可以成为毕设哦 本次的项目是个旅游门户网站 技术栈&#xff1a;JSPjQueryAjaxechartsSpringSpring…

第四章LockSupport与线程中断

文章目录 线程中断机制面试题什么是中断机制?实现三种中断方式通过一个volatile变量实现通过AtomicBoolean&#xff08;原子布尔型&#xff09;通过Thread类自带的中断api方法实现 API源码分析当前线程的中断标识为true&#xff0c;是不是线程就立刻停止&#xff1f;后手案例-…

Vector-常用CAN工具 - Vector Hardware Manager

本文提供了有关 Vector 用于配置 Vector 接口的新工具Vector 硬件管理器(vHardwareManager) 的一些一般信息。 常见问题 1、什么是vHardwareManager&#xff1f; 2、哪些接口支持vHardwareManager&#xff1f; 3、什么时候需要vHardwareManager&#xff1f; 4、哪里可以下…

chatgpt赋能python:Python如何截图运行效果?

Python如何截图运行效果&#xff1f; 如果你是一位有10年python编程经验的工程师&#xff0c;那么你一定知道在编写程序时调试和调整非常重要。为了更好地调试程序&#xff0c;Python提供了许多进行程序运行效果截图的方法。本文将介绍几种常用的Python截图方法以及它们的优缺…

chatgpt赋能python:Python如何截图运行结果

Python如何截图运行结果 介绍 Python是一种高级编程语言&#xff0c;非常流行。它具有许多有用的功能和库&#xff0c;使其成为许多开发人员的首选编程语言之一。但是&#xff0c;当您运行Python程序并需要与他人共享结果时&#xff0c;您可能需要截图运行结果。在本文中&…

编译3D渲染引擎Horde3D

Horde3D是Github上一款开源的轻量级3D渲染引擎&#xff0c;同时它还支持多个平台。今天我们准备在Mac平台上交叉编译至Android平台。如果需要同时能编译Sample&#xff0c;那么还需要SDL2库。默认情况下&#xff0c;编译Horde3D时不强制下载SDL2&#xff0c;你可以选择强制下载…

chatgpt赋能python:Python怎么快速入门?

Python怎么快速入门&#xff1f; Python是一种易学易用的编程语言。它被广泛应用于各种领域&#xff0c;例如数据科学、自动化、Web开发、游戏开发等等。无论你是从事什么领域&#xff0c;在Python的快速入门上花费越少的时间越好。在本文中&#xff0c;我们将介绍Python的基础…

工作二--注意!!!

1、激活单元格&#xff0c;做数据回显 2、单元格退出编辑模式时&#xff0c;让 实时保存 3、获取数据时&#xff0c;用getGIUID 给数据 唯一id&#xff0c;以防数据名重复 数据结构&#xff1a;是结合接口的id 等 和 组件的数据结构 4、父子结构 下拉框中的 :value 把value值 …

网络安全如何6个月成功上岸?

学前感言: 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发. 3.有时多 google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答. 4.遇到实在搞不懂的,可以先放放,以后再来解…