redis4.0、codis、阿里云redis 3种redis集群对比分析

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介: 本文对redis4.0版本的cluster,codis,以及阿里云redis 3种集群进行了对比分析。

2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>


阿里云采购季(云主机223元/3年)活动入口:请点击进入>>>,


阿里云学生服务器(9.5元/月)购买入口:请点击进入>>>,

本文对redis4.0版本的cluster,codis,以及阿里云redis 3种集群进行了对比分析。

1、架构对比

1.1、redis 4.0 cluster

redis 4.0版本的集群是去中心化的结构,集群元数据信息分布在每个节点上,主备切换依赖于多个节点协商选主。
redis 提供了redis-trib 工具做部署集群及运维等操作。
客户端访问散列的db节点需依赖smart client,也就是客户端需要对redis返回的节点信息做判断选择路由等操作。例如客户端请求一个节点,如果所请求的key不在该节点上,客户端需要判断返回的move或ask等指令,重定向请求到对应的节点。

1.2、codis

codis由3大组件构成:

  • codis-server : 修改过源码的redis, 支持slot,扩容迁移等
  • codis-proxy : 支持多线程,go语言实现的内核
  • codis Dashboard : 集群管理工具

提供web图形界面管理集群。
集群元数据存在在zookeeper或etcd。
提供独立的组件codis-ha负责redis节点主备切换。
基于proxy的codis,客户端对路由表变化无感知。客户端需要从codis dashhoard调用list proxy命令获取所有proxy列表,并根据自身的轮询策略决定访问哪个proxy节点以实现负载均衡。

1.3、阿里云redis

阿里云的redis集群版由3大组件构成:

  • redis-config : 集群管理工具
  • redis-server : 优化过源码的redis,支持slot, 扩容迁移等
  • redis-proxy : 单线程,c++14语言实现的内核

架构图如下:
_

redis-proxy 无状态,一个集群根据集群规格可挂多个proxy节点。
redis-config 双节点,支持容灾。
集群元数据存储在rds db上。
提供独立的组件HA负责集群的主备切换等。
阿里云的redis集群同样基于proxy,用户对路由信息无感知,同时提供vip给客户端访问,客户端只需一个连接地址即可,无须关心proxy访问的负载均衡等。

2、性能对比

2.1、压测环境

在3台物理机上分别搭建了以上3种redis集群。每台物理机千兆网卡,24核cpu,内存189G。3台物理机分别跑压测工具memtier_benchmark、codis proxy/阿里云proxy、redis server。redis server使用各种集群配套的redis内核。
固定key size 32个字节,set/get 操作比例为1:10。每个线程16个客户端。连续压测5分钟,分8个, 16个, 32个, 48个, 64个线程压测。
因为redis4.0集群需要额外的客户端选择节点,而memtier_benchmark不支持,所以使用了hashtag 来压测redis4.0。
每个集群有8个master db, 8个slave db, aof打开。aof rewrite的最小buffer为64MB。
压测的对象分别为单个redis 4.0 节点, 单个阿里云redis-proxy, 单核的codis-proxy, 8核的codis-proxy。
codis 使用的go版本为1.7.4。

压测结果图如下:
yace
可看出,单核的codis-proxy性能最弱。8核的codis-proxy压测没有对key使用hashtag,如此相当于将请求分散到后端8个db节点上, 也可以说相当于8个阿里云的redis-proxy。自然性能数据就比较高了。
单核的阿里云redis-proxy在压力够大的情况下性能逼近原生的redis db节点。
在实际生产环境中,使用原生的redis cluster,客户端需要实现cluster protocol, 解析move, ask等指令并重定向节点,随意访问key可能需要两次访问操作才能完成,性能上并不能完全如单节点一样。

3、支持特性对比

3.1、主要不同协议的支持对比

| | redis 4.0 | 阿里云redis | codis |
| ---------| :--------: | :---------: | :--------: |
| 事务 | 支持相同slot | 支持相同的slot | 不支持 |
| sub/pub | 支持相同slot | 支持 | 不支持 |
| flushall | 支持 | 支持 | 不支持 |
| select | 不支持 | 支持 | 不支持 |
| mset/mget | 支持相同slot | 支持 | 支持 |

更多命令请参考各自的集群版本说明。

3.2、水平扩展对比

redis4.0 cluster,codis,阿里云redis 分布式集群均实现了面对slot的管理,扩展的最小单元是slot。
分布式集群中水平扩展的本质是对集群节点的路由信息管理以及数据的迁移。这3种集群迁移数据的最小单位均是key。

3.2.1 redis cluster 水平扩展原理

redis4.0 cluster支持指定slot在节点中移动,也支持加入空节点后根据集群节点中已存在的slot分布自动进行再分布。以redis-trib的move_slot为例解析slot移动的过程:

  • 步骤1): 调用setslot命令修改源、目标节点slot的状态
  • 步骤2): 获取源节点上slot的key列表
  • 步骤3): 调migrate命令迁移key,迁移过程中redis属于阻塞状态,只有目标节点restore成功后才返回
  • 步骤4): 调用setslot命令修改源、目标节点slot的状态

在迁移过程中,如何保证数据的一致性呢?
redis cluster提供迁移状态中的重定向机制,向客户端返回ASK,客户端收到后需先发送asking指令到目标节点上,然后再发请求到目标节点上才可以访问。当访问的key满足以下全部条件时会出现重定向返回:

  • key所属slot在该节点上,如不在,返回的是MOVE
  • slot处于迁移状态中
  • key不存在

如上所述,migrate 是一个同步阻塞型的操作,如果key并不为空,即使slot处于迁移状态,key依然能被读写,以此保证数据的一致性。

3.2.2 codis 水平扩展原理

codis对slot的再分布策略与redis cluster相同。codis-server内核并没有存储slot的信息,也不解析key所在的slot,只有在dbadd等操作时将对应的key记录到以slot为key的dict中,如果key带有tag,则将tag做crc32运算后将key插入到以crc32值为key的skiplist中。
codis Dashboard 后台起迁移状态机程序,先确保通知到所有proxy开始迁移,即prepare阶段,如有一台以上proxy失败,则迁移任务失败。迁移步骤与redis cluster类似,不同点是:

  • slot状态信息存储在zookeeper/etcd
  • 发送slotsmgrttagslot而非migrate指令,slotsmgrttagslot执行时会随机获取一个key迁移,如key带有tag,则从上文中的skiplist获取所有key批量迁移

codis同样也是同步阻塞型的迁移操作。
在保持数据一致性方面,因为codis-server内核不维护slot的状态,所以一致性的保证落在了proxy组件上。codis-proxy在处理请求时,先判断key所在slot的状态,如slot处于迁移中,则向codis-server发起指定key迁移的命令,等key迁移完成后,codis-proxy转向目标的codis-server请求。做法简单,对redis内核修改较少,但同时也导致迁移慢,客户端卡住的时间较久。

3.2.3 阿里云redis 水平扩展原理

阿里云redis除了提供指定源、节点、slot外,还提供按节点的容量、slot的大小等考量参数动态分配slot,以最小粒度影响集群可用性作为分配原则。迁移大体步骤如下:

  • 步骤1): 由redis-config计算源、目标节点、slot
  • 步骤2): redis-config向redis-server发送迁移slot指令
  • 步骤3): redis-server启动迁移状态机,分批量迁移key
  • 步骤4): redis-config定时检查redis-server并更新slot状态

与codis不同,阿里云redis在内核上同样维护了slot的信息,并且抛弃了codis迁移整个slot和redis cluster迁移单个key的做法,从内核上支持批量迁移,加快迁移速度。
阿里云redis迁移数据是异步的流程,不等待目标节点是否restore成功,由目标节点通知和源节点定时检查来验证是否成功。以此缩小同步阻塞对其他slot访问的影响。
同时也是因为迁移异步化,所以在保证数据一致性时,判断请求如果是写请求并且key存在且不在迁移的key列表中,走正常的写请求流程。其他数据一致性保证与redis4.0 cluster相同。
阿里云redis-server优化了迁移大key的流程,详情可见https://yq.aliyun.com/articles/64884?spm=5176.8091938.0.0.fF3UZH

3.3、其他

| | redis 4.0 | 阿里云redis | codis |
| --------- | :--------: | :---------: | :--------: |
| 内核热升级 | 不支持 | 支持 | 不支持 |
| proxy热升级 | 无proxy | 支持 | 不支持 |
| slots槽数 | 16384 | 16384 | 1024 |
| 密码 | 不支持,需改redis-trib脚本 | 支持 | 支持,所有组件密码必须一致 |

阿里云的redis内核和proxy的热升级过程中均不断连接,对客户端无影响。

4、结束语

云数据库Redis版(ApsaraDB for Redis)是一种稳定可靠、性能卓越、可弹性伸缩的数据库服务。基于飞天分布式系统和全SSD盘高性能存储,支持主备版和集群版两套高可用架构。提供了全套的容灾切换、故障迁移、在线扩容、性能优化的数据库解决方案。欢迎各位购买使用:云数据库 Redis 版

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
5天前
|
负载均衡 监控 NoSQL
Redis的几种主要集群方案
【5月更文挑战第15天】Redis集群方案包括主从复制(基础,读写分离,手动故障恢复)、哨兵模式(自动高可用,自动故障转移)和Redis Cluster(官方分布式解决方案,自动分片、容错和扩展)。此外,还有Codis、Redisson和Twemproxy等工具用于代理分片和负载均衡。选择方案需考虑应用场景、数据量和并发需求,权衡可用性、性能和扩展性。
37 2
|
5天前
|
存储 监控 负载均衡
保证Redis的高可用性是一个涉及多个层面的任务,主要包括数据持久化、复制与故障转移、集群化部署等方面
【5月更文挑战第15天】保证Redis高可用性涉及数据持久化、复制与故障转移、集群化及优化策略。RDB和AOF是数据持久化方法,哨兵模式确保故障自动恢复。Redis Cluster实现分布式部署,提高负载均衡和容错性。其他措施包括身份认证、多线程、数据压缩和监控报警,以增强安全性和稳定性。通过综合配置与监控,可确保Redis服务的高效、可靠运行。
26 2
|
2天前
|
监控 安全 数据挖掘
Email 接口API有哪些?具体分析一下阿里云和AOK的优点
本文介绍了常见的Email接口API,如阿里云邮件推送、AOKSend、SendGrid、Mailgun和Amazon SES。阿里云API以其高稳定性和数据分析功能脱颖而出,支持批量发送和多语言;而AOKSend API以易于集成、高安全性和优秀客户支持为亮点。企业在选择时应考虑自身需求和预算,以优化邮件营销效果。
|
5天前
|
存储 NoSQL Redis
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群(下)
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群
20 1
|
5天前
|
监控 NoSQL Redis
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群(上)
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群
34 0
|
5天前
|
存储 监控 NoSQL
Redis哨兵&分片集群
Redis哨兵&分片集群
23 0
|
NoSQL Go Redis
基于Codis的Redis集群部署
Codis是基于代理的高性能Redis集群方案,使用Go语言进行开发,现在在在豌豆荚及其它公司内已经广泛使用,当然也包括我们公司。 Codis与常见的Redis集群方案对比。
1153 0
|
5天前
|
存储 NoSQL 算法
09- Redis分片集群中数据是怎么存储和读取的 ?
Redis分片集群使用哈希槽分区算法,包含16384个槽(0-16383)。数据存储时,通过CRC16算法对key计算并模16383,确定槽位,进而分配至对应节点。读取时,根据槽位找到相应节点直接操作。
73 12
|
5天前
|
NoSQL Linux Redis
06- 你们使用Redis是单点还是集群 ? 哪种集群 ?
**Redis配置:** 使用哨兵集群,结构为1主2从,加上3个哨兵节点,总计分布在3台Linux服务器上,提供高可用性。
388 0
|
5天前
|
NoSQL 算法 Java
深入浅出Redis(八):Redis的集群模式
深入浅出Redis(八):Redis的集群模式

相关产品

  • 云数据库 Redis 版
  • http://www.vxiaotou.com