分布式缓存Redis分区(分片)的高可用方案在大厂中的实践(下)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 分布式缓存Redis分区(分片)的高可用方案在大厂中的实践

image.png

  • 一致性哈希-扩容

image.png

  • 客户端分片:哈希+顺时针(优化取余)
    节点伸缩:只影响邻近节点,但还是有数据迁移
    翻倍伸缩:保证最小迁移数据和负载均衡

2.2.1.3 虚拟槽哈希分区(Redis Cluster采用)

  • 虚拟槽分配

image.png

  • 预设虚拟槽
    每个槽映射一个数据子集, 一般比节点数大
  • 良好的哈希函数
    例如CRC16
  • 服务端管理节点、槽、数据

特点

  • 数据分散度高
  • 键值分布业务无关
  • 无法顺序访问
  • 支持批量操作

产品

  • 一致性哈希Memcache
  • Redis Cluster


哈希分片的一种高端形式称为一致性哈希(consistent hashing),被一些 Redis 客户端和代理实现

3 分片的实现方案

3.1 客户端

客户端直接选择正确节点来写入和读取指定键,许多 Redis 客户端实现了客户端分片。

在客户端配置多个缓存的节点,通过缓存写入和读取算法策略来实现分布式,从而提高缓存可用性。


写入数据时,需要把被写入缓存的数据分散到多个节点中,即进行数据分片;


  • 读数据时,可利用多组的缓存来做容错,提升缓存系统可用性。这里可用主从、多副本两种策略,专为解决不同问题而提。

3.2 中间代理

在应用代码和缓存节点之间增加代理层。客户端所有的写入和读取的请求都通过代理层,而代理层中会内置高可用策略,帮助提升缓存系统的高可用。


客户端发送请求到一个可以理解 Redis 协议的代理上,而非直接发到Redis 实例。

代理会根据配置好的分片模式,来保证转发我们的请求到正确的 Redis 实例,并返回响应给客户端。

Redis 和 Memcached 的代理 Twemproxy 都实现了代理协助的分片。

3.3 查询路由

可发送你的查询到一个随机实例,该实例会保证转发你的查询到正确节点。

Redis 集群在客户端的帮助下,实现了查询路由的一种混合形式,请求不是直接从 Redis 实例转发到另一个,而是客户端收到重定向到正确的节点。

服务端

Redis 2.4版本后提出的Redis Sentinel方案。

4 分片的缺点

Redis 的一些特性与分片在一起时玩的不是很好:

  • 涉及多个键的操作通常不支持。例如,无法直接对映射在两个不同 Redis 实例上的键执行交集
  • 涉及多个键的事务不能使用
  • 分片的粒度是键,所以不能使用一个很大的键来分片数据集,例如一个很大的sorted set
  • 当使用了分片,数据处理变得更复杂。例如,你需要处理多个 RDB/AOF 文件,备份数据时需要聚合多个实例和主机的持久化文件
  • 添加和删除容量也很复杂。例如,Redis 集群具有运行时动态添加和删除节点的能力来支持透明地再均衡数据,但是其他方式,像客户端分片和代理都不支持这个特性。但有一种称为预分片(Presharding)的技术在这一点上能帮上忙。

5 数据存储or缓存?

尽管无论是将 Redis 作为数据存储还是缓存,Redis 分片概念上都是一样的。

  • 但作为数据存储时有个重要局限:当 Redis 作为数据存储时,一个给定的键总是映射到相同 Redis 实例。
  • 当 Redis 作为缓存时,如果一个节点不可用而使用另一个节点,这并不是啥大问题,按照我们的愿望来改变键和实例的映射来改进系统的可用性(即系统响应我们查询的能力)。


一致性哈希实现常常能够在指定键的首选节点不可用时切换到其它节点。类似的,如果你添加一个新节点,部分数据就会开始被存储到这个新节点上。


主要概念:

  • 如果 Redis 用作缓存,使用一致性哈希来实现伸缩扩展很容易
  • 如果 Redis 用作存储,使用固定的键到节点的映射,所以节点的数量必须固定不能改变。否则,当增删节点时,就需要一个支持再平衡节点间键的系统,当前只有 Redis 集群可以做到这点。

6 预分片

分片存在一个问题,除非我们使用 Redis 作为缓存,否则增加和删除节点都是件麻烦事,而使用固定的键和实例映射要简单得多。


然而,数据存储的需求可能一直在变化。今天可接受 10 个 Redis 节点,但明天可能就需 50 个节点。


因为 Redis 只有相当少的内存占用且轻量级(一个空闲的实例只使用 1MB 内存),一个简单的解决办法是一开始就开启很多实例。即使你一开始只有一台服务器,也可以在第一天就决定生活在分布式世界,使用分片来运行多个 Redis 实例在一台服务器上。


你一开始就可以选择很多数量的实例。例如,32 或者 64 个实例能满足大多数用户,并且为未来的增长提供足够的空间。


这样,当数据存储增长,需要更多 Redis 服务器,你要做的就是简单地将实例从一台服务器移动到另外一台。当你新添加了第一台服务器,你就需要把一半的 Redis 实例从第一台服务器搬到第二台,以此类推。


使用 Redis 复制,就可以在很小或者根本不需要停机的时间内完成移动数据:

  1. 在新服务器上启动一个空实例
  2. 移动数据,配置新实例为源实例的从服务
  3. 停止客户端
  4. 更新被移动实例的服务器 IP 地址配置
  5. 向新服务器上的从节点发送 SLAVEOF NO ONE 命令
  6. 以新的更新配置启动你的客户端
  7. 最后关闭掉旧服务器上不再使用的实例

7 Redis分片实现

7.1 Redis 集群

Redis 集群是自动分片和高可用的首选方式。一旦 Redis 集群以及支持 Redis 集群的客户端可用,Redis 集群将会成为 Redis 分片的事实标准。

Redis 集群是查询路由和客户端分片的一种混合模式。

7.2 Twemproxy

Twemproxy 是 Twitter 开发的一个支持 Memcached ASCII 和 Redis 协议的代理。它是单线程的,由 C 语言编写,运行非常快,基于 Apache 2.0 许可证。


Twemproxy 支持在多个 Redis 实例间自动分片,若节点不可用,还有可选的节点排除支持。

这会改变 <键,实例> 映射,所以应该只在将 Redis 作为缓存是才使用该特性。


这并非单点故障,因为你可启动多个代理,并且让你的客户端连接到第一个接受连接的代理。


从根本上说,Twemproxy 是介于客户端和 Redis 实例之间的中间层,这就可以在最下的额外复杂性下可靠地处理我们的分片。这是当前建议的处理 Redis 分片的方式。

7.3 支持一致性哈希的客户端

Twemproxy 之外的可选方案,是使用实现了客户端分片的客户端,通过一致性哈希或者别的类似算法。有多个支持一致性哈希的 Redis 客户端,例如 Redis-rb 和 Predis。

查看完整的 Redis 客户端列表,看看是不是有支持你的编程语言的,并实现了一致性哈希的成熟客户端即可。




参考

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
3月前
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
110 2
基于Redis的高可用分布式锁——RedLock
|
18天前
|
NoSQL 算法 关系型数据库
分布式 ID 详解 ( 5大分布式 ID 生成方案 )
本文详解分布式全局唯一ID及其5种实现方案,关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
分布式 ID 详解 ( 5大分布式 ID 生成方案 )
|
16天前
|
存储 缓存 算法
分布式缓存有哪些常用的数据分片算法?
【10月更文挑战第25天】在实际应用中,需要根据具体的业务需求、数据特征以及系统的可扩展性要求等因素综合考虑,选择合适的数据分片算法,以实现分布式缓存的高效运行和数据的合理分布。
|
26天前
|
存储 缓存 NoSQL
分布式架构下 Session 共享的方案
【10月更文挑战第15天】在实际应用中,需要根据具体的业务需求、系统架构和性能要求等因素,选择合适的 Session 共享方案。同时,还需要不断地进行优化和调整,以确保系统的稳定性和可靠性。
|
1月前
|
存储 NoSQL 大数据
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
33 3
|
1月前
|
SQL NoSQL 安全
分布式环境的分布式锁 - Redlock方案
【10月更文挑战第2天】Redlock方案是一种分布式锁实现,通过在多个独立的Redis实例上加锁来提高容错性和可靠性。客户端需从大多数节点成功加锁且总耗时小于锁的过期时间,才能视为加锁成功。然而,该方案受到分布式专家Martin的质疑,指出其在特定异常情况下(如网络延迟、进程暂停、时钟偏移)可能导致锁失效,影响系统的正确性。Martin建议采用fencing token方案,以确保分布式锁的正确性和安全性。
43 0
|
2月前
|
存储
cephFS高可用分布式文件系统部署指南
关于如何部署高可用的cephFS分布式文件系统,包括集群的搭建、验证高可用性以及实现两主一从架构的详细指南。
76 9
|
3月前
|
资源调度 Java 调度
项目环境测试问题之Schedulerx2.0通过分布式分片任务解决单机计算瓶颈如何解决
项目环境测试问题之Schedulerx2.0通过分布式分片任务解决单机计算瓶颈如何解决
项目环境测试问题之Schedulerx2.0通过分布式分片任务解决单机计算瓶颈如何解决
|
1月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
7天前
|
NoSQL Redis
Redis分布式锁如何实现 ?
Redis分布式锁通过SETNX指令实现,确保仅在键不存在时设置值。此机制用于控制多个线程对共享资源的访问,避免并发冲突。然而,实际应用中需解决死锁、锁超时、归一化、可重入及阻塞等问题,以确保系统的稳定性和可靠性。解决方案包括设置锁超时、引入Watch Dog机制、使用ThreadLocal绑定加解锁操作、实现计数器支持可重入锁以及采用自旋锁思想处理阻塞请求。
40 16