Redis高可用架构演进

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis是目前使用最广泛的缓存程序之一,也被应用于多种场景,例如数据缓存、分布式锁等,Redis官方提供了多种部署架构,以满足不同应用场景下对于高可用和扩展性的要求。

Redis是目前使用最广泛的缓存程序之一,也被应用于多种场景,例如数据缓存、分布式锁等,Redis官方提供了多种部署架构,以满足不同应用场景下对于高可用和扩展性的要求。

01

单节点(single)

单节点的部署是最简单的,只要启动一个redis进程就可以了,但是不具备高可用性,一般生产环境不建议使用,其主要有以下问题:

  • 单节点,一旦出问题,服务将会不可用【1】
  • 单节点读能力有限,无法扩展【2】
  • 单节点写能力有限,无法扩展【3】
  • 单节点的存储能力受到单机的限制【4】

02

主从复制(master-slave)

由于单节点服务不可用问题【1】,Redis提供了主从复制的功能,使用主从复制模式,一旦主节点服务不可用,则可以启用从节点,尽量保证数据量不丢失(Redis主从复制提供的是最终一致性)。另外一方面从节点可以扩展主节点的读能力,分担大并发量的读操作【2】。

redis主从复制每从节点只能有一个主节点,而主节点可以同时具备多个从节点,复制流量只能是单向的,只能从主节点流向从节点。配置Master-Slave有三种方式:

在redis配置文件中增加配置:slaveof {masterHost} {masterPort}

在启动redis-server的命令行后添加:--slaveof {masterHost} {masterPort}

启动redis-server以后登陆redis-server终端输入命令:slaveof {masterHost} {masterPort}

注意:如果主节点配置了requirepass,则需要从节点配masterauth参数。

如何查看节点是否已经成功配置了Master-Slave配置呢?可以在节点上执行命令info replication,这个命令在master节点和slave节点上展示的内容不一样,可以看到各自的角色信息master/role,主节点或者从节点IP和端口信息。

主节点127.0.0.1:6379>info replication

127.0.0.1:6379>info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,......

从节点127.0.0.1:6380>info replication

127.0.0.1:6380>info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
...

一个节点可以使用slaveof {masterHost} {masterPort}变成一个从节点,也可以使用slaveof no one断开复制,重新变成一个主节点。

另外,从节点还可以实现切换主节点的功能,将当前从接待你对主节点的复制切换到对另外一个新的主节点的复制,只需要操作命令:slaveof {newMasterHost} {newMasterPort}

切换主节点涉及流程如下:

  1. 断开与当前主节点的复制关系
  2. 与新的主节点建立复制关系
  3. 删除从节点当前的所有数据(特别注意,一旦操作失误,原来的数据将会被全部清空)
  4. 从新的主节点复制数据

Redis主从复制解决了单节点的第【1】【2】问题,但是【3】【4】问题仍然无法解决,并且引入了新的问题:

主节点服务不可用,需要手工介入启用从节点升级为主节点,并且需要通知应用方修改主节点的地址,需要人工介入【5】

03

哨兵模式(redis sentinel)

为了解决第【5】个问题,Redis官方提供了哨兵sentinel模式,保证主从复制模式下从节点升级为主节点的过程全部自动化,sentinel有完善的不可达检测机制,主节点选举机制,以及主节点更换通知机制,从而实现了真正的高可用。

Redis   sentinel有若干个sentinel节点和数据节点组成,sentinel节点定期会对所有节点的状态进行监控。当sentinel集群判断某个节点不可达时,会选择其中一个sentinel节点执行故障转移任务,并通知到调用的客户端。以一主两从三哨兵为例:

故障转移过程如下:

  • 主节点故障,两个从节点与主节点失去连接,主从复制失败
  • sentinel节点通过监控发现主节点的故障,多个sentinel达成一致以后,选择了其中一个sentinel节点作为leader sentinel

leader sentinel选择其中一个slave,发送slaveof no one命令给这个从节点,使其成为新的主节点。

  • sentinel通知应用端新的主节点信息
  • sentinel发送命令给另外的slave,让其去复制新的master节点
  • 等旧的主节点恢复以后让其以slave的身份去复制新的master节点

注意事项

  • sentinel模式本质上还是主从模式,但是具备了故障的自动转移的功能。
  • sentinel节点本身也会有单点的问题,至少两个节点才能解决单节点问题,但还是建议至少三个节点,多个节点可以有效防止误判。
  • sentinel集群可以配置同时监控多个主节点,也即监控多个主从集群,每个集群只能有一个master,但是slave可以有多个。

04

集群模式(redis cluster)

以上分析我们知道,即便使用了哨兵模式,但是还是存在【3】【4】问题,本质上是原来的架构写扩展能力受限,当遇到大并发、大流量、内存不足等情况,就会出现瓶颈。典型的解决方案有:

  • 客户端分区 由客户端对数据进行分区处理,部署多套集群,不同的数据依据不同的逻辑转发到不同的集群,需要客户端自行处理数据路由,需要维护多套redis,成本较高。
  • 使用代理搭建redis客户端代理,简化客户端的访问,数据路由等由代理实现。但是这引入了新的组件,部署架构更加复杂,并且还涉及代理本身的高可用问题。

为了解决以上的不足,官方终于提供了分布式集群方案,这就是Redis  Cluster。如下图所示,Redis  Cluster至少要求6个节点才能组成一个高可用的集群,6个节点是三主三从。这有两个方面的原因,一方面要求至少3个主节点,是为了避免网络分区的情况导致的脑裂问题,所以判断节点是否可听过服务需要至少过半数的节点的同意才行。另外一方面,每个节点至少需要有一个slave节点,当master故障时可以提升为主节点继续提供服务。

要理解Redis Cluster架构,我们需要理解其数据分布原理、节点通信原理、请求路由、扩缩容的方案。

数据分布原理

由于集群中有多个master节点,所以用户的数据需要依据某种规则被存放在某个节点下,当查询的时候也要知道数据从哪个节点去取,这就是数据分布方案要解决的问题。

Redis-Cluster使用了虚拟槽分区的方案来完成数据映射。首先,定义了一个整数集合,命名为槽slot,其范围为0~16383,然后使用哈希函数slot=CRC16(key)&16383将数据映射到某个槽上,再将槽分配给不同的节点,每个节点负责一定数量的槽,这样子达到了将数据分配到节点的目的。槽是redis  cluster数据管理和迁移的基本单位。

节点通信原理

分布式系统一般都会涉及保存集群元数据信息的功能,对应到redis集群则是例如数据槽分配给哪个节点,节点的IP和端口等信息是多少等信息。一般来说有两种方案:集中式和P2P方式。集中式一般会选出一个leader节点或者master节点,由此节点来进行元数据管理,P2P方式则是通过数据交换,最终使得集群的所有节点都获得集群的元数据信息,节点间的地位是平等的。redis  cluster选择的是P2P的方式。

每个redis节点都会单独开辟一个TCP端口用于节点的通信,采用Gossip协议进行交互,以ping消息为例流程如下:

1、每个节点开启用于集群内通信的TCP端口,用于集群通信。

2、每个节点配置几个种子节点,发送ping消息。

3、接收到ping消息的节点回复pong消息响应每个节点可能知道集群的全部节点信息,也可能只知道一部分,但是当进行一段时间的ping/pong消息交互以后,最终会达成每个节点都获得集群全部状态的效果。

Gossip协议定义了多种消息格式:ping、pong、meet、fail等,作用各不相同。

请求路由

上面说到所有的master节点都是平等的,客户端连接时是不知道请求的数据是应该落在哪个节点上的,那么应该如何进行请求的路由呢?

这里可能会有疑问,为何不适用代理的方式呢,可以完全与redis节点解耦合。我的理解是增加了一层代理以后引入了新的组件,架构会更加复杂,且性能会有损耗,所以官方选择直连redis节点的方案。

redis任意节点都可以接收客户端的请求,收到请求以后会根据哈希函数计算出数据对应的槽,而槽分配在哪个节点经过节点通信以后是节点本身是清楚的,于是,如果发现槽分配的是自己,则进行请求处理,如果发现是在其他节点,则返回MOVED重定向,表示数据在其他的节点,由客户端重定向后去请求其他的节点。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
存储 SQL 关系型数据库
Mysql高可用架构方案
本文阐述了Mysql高可用架构方案,介绍了 主从模式,MHA模式,MMM模式,MGR模式 方案的实现方式,没有哪个方案是完美的,开发人员在选择何种方案应用到项目中也没有标准答案,合适的才是最好的。
139 3
Mysql高可用架构方案
|
4月前
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
129 2
基于Redis的高可用分布式锁——RedLock
|
1月前
|
存储 缓存 NoSQL
【赵渝强老师】基于Redis的旁路缓存架构
本文介绍了引入缓存后的系统架构,通过缓存可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。文中提供了相关图片和视频讲解,并讨论了数据库读写分离、分库分表等方法来减轻数据库压力。同时,文章也指出了缓存可能带来的复杂度增加、成本提高和数据一致性问题。
【赵渝强老师】基于Redis的旁路缓存架构
|
4月前
|
存储 Cloud Native 关系型数据库
PolarDB 高可用架构设计与实践
【8月更文第27天】 在现代互联网应用中,数据库作为核心的数据存储层,其稳定性和可靠性尤为重要。阿里云的 PolarDB 作为一款云原生的关系型数据库服务,提供了高可用、高性能和自动化的特性,适用于各种规模的应用。本文将详细介绍 PolarDB 的高可用架构设计,并探讨其实现数据安全性和业务连续性的关键技术。
115 0
|
17天前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
34 8
|
1月前
|
Kubernetes 关系型数据库 MySQL
Kubernetes入门:搭建高可用微服务架构
【10月更文挑战第25天】在快速发展的云计算时代,微服务架构因其灵活性和可扩展性备受青睐。本文通过一个案例分析,展示了如何使用Kubernetes将传统Java Web应用迁移到Kubernetes平台并改造成微服务架构。通过定义Kubernetes服务、创建MySQL的Deployment/RC、改造Web应用以及部署Web应用,最终实现了高可用的微服务架构。Kubernetes不仅提供了服务发现和负载均衡的能力,还通过各种资源管理工具,提升了系统的可扩展性和容错性。
108 3
|
2月前
|
存储 NoSQL 大数据
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
39 3
|
4月前
|
运维 监控 关系型数据库
【一文搞懂PGSQL】7. PostgreSQL + repmgr + witness 高可用架构
该文档介绍了如何构建基于PostgreSQL的高可用架构,利用repmgr进行集群管理和故障转移,并引入witness节点增强网络故障检测能力。repmgr是一款轻量级的开源工具,支持一键部署、自动故障转移及分布式节点管理。文档详细描述了环境搭建步骤,包括配置postgresql参数、安装与配置repmgr、注册集群节点以及配置witness节点等。此外,还提供了故障手动与自动切换的方法及常用命令,确保集群稳定运行。
|
4月前
|
数据挖掘 关系型数据库 MySQL
Serverless高可用架构的解决方案体验
Serverless高可用架构的解决方案体验
166 6
|
4月前
|
弹性计算 运维 关系型数据库
云上Serverless高可用架构一键部署体验与测评
在数字化转型背景下,Serverless架构因其实现业务敏捷、降低成本及提升服务可靠性而备受青睐。本文以阿里云Serverless应用引擎(SAE)为核心,展示了一种高可用、低成本且易于扩展的解决方案。通过单地域双可用区部署,构建了具备自动伸缩与故障恢复能力的架构。借助阿里云的一键部署功能,大幅简化了搭建流程,实现了快速部署,并通过性能与成本分析验证了其优势。对比传统ECS,SAE在资源利用与运维效率上表现更佳,特别适合平均负载较低的应用场景。