乐趣区

关于云计算:Redis最佳实践

缓存数据库在古代零碎架构中越来越成为标准配置之一,特地是随着微服务架构的风行,微服务无状态革新要求状态外置,外置的状态就须要存储到内部缓存服务中。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

退出移动版