缓存数据库在古代零碎架构中越来越成为标准配置之一,特地是随着微服务架构的风行,微服务无状态革新要求状态外置,外置的状态就须要存储到内部缓存服务中。Redis是以后支流的缓存数据库实现,本文介绍Redis基本概念与最佳实际。

架构与概念

Redis是一个应用ANSI C编写的开源、反对网络、基于内存、可选持久性的键值对存储数据库。从2015年6月开始,Redis的开发由Redis Labs资助,而2013年5月至2015年6月期间,其开发由Pivotal资助。在2013年5月之前,其开发由VMware资助。依据月度排行网站DB-Engines.com的数据,Redis是最风行的键值对存储数据库。

单机/主备/集群模式

Redis是单线程模式,因为Redis设计理念是不耗费CPU,且单线程的联合异步IO解决效率也很高,以后Redis单实例能够达到10万QPS。个别的利用场景,应用单机或主备(高可用)即可满足要求。

然而现在应用程序越来越依赖Redis,对Redis的要求越来越高:拜访低时延(<5ms)、高QPS(百万QPS)、高吞吐量(百MB/s),从而导致很多场景下,单CPU无奈满足需要。因而多Redis过程组成的Redis集群是高性能缓存服务的一种解决办法。
在集群模式之下,因为应用程序特色,存在“热Key”景象,热Key会导致集群上面的Redis应用不平衡,热Key命中的实例很忙碌,其余实例闲暇。解决热Key的通常做法有两个:一个是在Redis集群角度,提供读写拆散个性,通过多个Redis实例分担负载,当然读写拆散自身是一个复制集群,如何缩小实例间数据复制时延以及复制时对主实例的耗费是读写拆散模式设计的要害;另一个办法是在应用程序外部应用内存做一级缓存,应用Redis做二级缓存。

Codis集群

Redis官网版本3.0才反对集群模式,在此之前,有不少Redis集群计划,次要实现思路都是在Redis实例之上减少一个Proxy,由Proxy负责分区转发,同时Redis实例的状态由哨兵监控,哨兵将状态写入到分布式配置核心(ZK/ETCD),Proxy通过配置核心刷新Redis实例路由信息。
在开源畛域认可度较高的Proxy集群实现是Codis,下图是Codis的架构。

Redis原生集群

Redis3.0版本反对集群模式,与下面的带Proxy集群形式不一样,Redis官网提供的集群实现,在Server端是没有Proxy的,Proxy路由的性能,由客户端SDK来实现。为了与Proxy集群辨别,Redis官网的集群称为原生集群。

Redis集群节点之间通信机制为 Redis Cluster Bus,基于Gossip协定实现。

Redis客户端通过CLUSTER相干命令获取集群配置信息,客户端与节点之间通过MOVED/ASK来协调Key所属的槽位变更。

原生集群与Proxy集群相比拟,没有Proxy层之后,程度扩大能力更好,官网宣传反对1000节点。当然没有了Proxy层,流量、路由管控会更麻烦一些。

原生集群的槽位Slot空间总共为16383个,因而实践上集群节点数量是不能超过16383个。

Redis规格评估因素

抉择Redis规格时候,须要评估业务模型,防止抉择的规格与理论业务模型不匹配。

内存容量

依据Key写入数量/频度,TTL时常,是否显示删除判断容量增长状况,防止容量满。
当Redis内存容量满时,再次写入则会触发淘汰Key操作。同时因为内存满,可能导致系统资源有余,淘汰Key的操作会很耗时,从而导致写入超时。

是否落盘

数据须要落盘的话,须要确认 appendfsync=everysec 如果开启,底下磁盘是否是SSD;否则在高QPS写的场景,如果不是SSD盘,可能会导致利用拜访Redis时延减少,极其状况会拜访超时。

数据是否可重生成

如果数据能够重生成,则不须要迁徙数据。

如果数据不能重生成,那么意味着须要迁徙数据。以后并没有Redis在线迁徙的工具或服务(DRS服务对Redis反对还不欠缺),因而须要业务代码配合实现迁徙,依据业务状况探讨迁徙计划。
典型的办法有:

  • 业务代码双写
  • 如果反复Key值能够笼罩,则能够写一个工具从源库读,写到目标库,而后在某个工夫点,短暂停业务切换库
  • 简略粗犷的是停业务迁徙

QPS

QPS是抉择Redis规格的次要根据之一,有的场景是数据量很小,QPS很高,因为主备版本的最大QPS无限,如果须要的QPS超过了主备版本的QPS最大值,那么也得上集群版本。
内存很小,QPS很高的场景,也是小规格集群的次要场景之一。

读写QPS占比

QPS指标须要辨别读/写,写QPS很高的话要留神 AOF REWRITE,在执行 AOF REWRITE 时再写入的话,时延会变高,极其状况下会导致拜访超时。
参考连贯

并发连接数

依据要求的并发连接数选定对应的规格。如果是短链接形式拜访,要特地留神。

是否cpu耗费类型

一些场景下如MSET、MGET等耗费CPU的命令较多,评估时候肯定要思考CPU算力是否足够,有时候内存足够了然而CPU有余,导致Redis CPU忙碌。这种状况是小内存规格集群的典型应用场景。

是否有TTL设置过长会导致内存满

可能有一些Key的TTL设置的很长(如一个月),且没有被动删除机制,那么就可能会导致内存满,从而触发Key淘汰策略,这时候再写入可能会超时。

是否应用Pipeline

在QPS很高的场景下,应用Pipeline相比拟单个Key操作,效率和性能都有很大晋升。然而须要限定Pipeline中的命令数量,以后Codis Proxy默认的 session_max_pipeline=10000 ,倡议不要超过此值。
同时还须要评估一次Pipeline返回的数据量。

是否应用多DB

有一些云厂商(如阿里云)反对Redis集群有多DB个性,不同DB中的Key值能够雷同。Codis集群、Redis原生集群是不反对多DB的。

长连贯or短连贯

短连贯须要特地关注连接数这个指标。如果是短链接,须要关注内存参数本地端口、最大句柄数等值是否调优。

支流云厂家缓存服务比照

Redis作为支流缓存服务,各个云厂家都提供了托管式的Redis缓存服务,不过各个厂家实现上并不完全一致,在此列出各个厂家次要实现原理以供选型参考。

AWS

AWS提供Redis集群托管服务。用户指定flavor机器(计算、存储、网络),AWS帮忙客户讲Redis集群部署到服务器上。
同时用户创立实例时候能够指定节点数量、正本数量、槽位与节点调配形式。

  • 计算/存储/网络:可指定flavor。
  • LB:不波及。
  • Proxy:不波及。
  • 多DB:不反对。
  • 正本数:可指定正本数。
  • 读写拆散:不反对。
  • 扩缩容:在线扩缩容。
  • 跨集群复制:不反对。
  • 性能规格:
  • 应用限度:应用限度
  • Redis版本兼容:可抉择,范畴:3.2.4, 3.2.6, 3.2.10, 4.0.10, 5.0.0, 5.0.3, 5.0.4

阿里云

阿里云提供Proxy模式的集群,Proxy自研。

  • 计算/存储/网络:与Redis规格绑定,不可指定flavor。
  • LB:应用SLB,QPS峰值为200万。
  • Proxy:Proxy数量与集群规格有肯定配比关系,可反对用户自定义Proxy数量,应答cpu耗费场景。
  • 多DB:集群反对多DB。
  • 正本数:单正本、双正本
  • 读写拆散:反对。slave同步数据存在肯定提早。
  • 扩缩容:在线扩缩容。
  • 跨集群复制:反对。提供寰球多活个性。
  • 性能规格:性能规格
  • 应用限度:应用限度
  • Redis版本兼容:2.8, 4.0

腾讯云

腾讯里云提供Proxy模式的集群,Proxy自研。同时腾讯云提供两种Redis引擎:开源Redis,自研CKV。

  • 计算/存储/网络:与Redis规格绑定,不可指定flavor。
  • LB:单节点10万QPS,QPS下限未知
  • Proxy:数量不可指定。
  • 多DB:集群不反对多DB。
  • 正本数:可抉择:1,2,3,4,5
  • 读写拆散:不反对。
  • 扩缩容:在线扩缩容。
  • 跨集群复制:不反对。
  • 性能规格:性能规格)
  • 应用限度:应用限度)
  • Redis版本兼容:单机/主从版2.8,集群版4.0

华为云

华为云提供两种Proxy模式的集群:Codis与Redis原生集群。原生集群不带LB与Proxy。

  • 计算/存储/网络:与Redis规格绑定,不可指定flavor。
  • LB:100万QPS。
  • Proxy:数量不可指定。
  • 多DB:集群不反对多DB。
  • 正本数:2
  • 读写拆散:不反对。
  • 扩缩容:在线扩容。
  • 跨集群复制:不反对。
  • 性能规格:性能规格))
  • 应用限度:应用限度)
  • Redis版本兼容:2.8, 3.x, 4.0, 5.0

更多云最佳实际 https://best.practices.cloud