当 Redis 遇上 Serverless

亚马逊云科技开发者社区为开发者们供给全球的开发技能资源。这儿有技能文档、开发案例、技能专栏、训练视频、活动与竞赛等。协助我国开发者对接国际最前沿技能,观念,和项目,并将我国优异开发者或技能推荐给全球云社区。假如你还没有关注/保藏,看到这儿请一定不要仓促划过,点这儿让它成为你的技能宝库!

大家好,我是张晋涛。

前段时刻看到了许多关于数据库要不要部署在 Kubernetes 之上的评论,这些年,这种评论时有发生。

这个事情并没有绝对的定论,因为每个人都是依据自己的认知,或依据自己过往的经验在进行剖析、评论,每个人的出发点不同,自然得到的定论也是不一样的。

2021 年的时分,我曾经做过一次线上共享:Redis 容器化技能选型,K8S 并非唯一 | MoeLove 在那次共享中,我首要是聊了一些容器化的技能手段,Redis 本身的一些特性,以及依据不同事务场景或许需求时,能够选用的技能计划。

今日这篇,我想再聊聊 Redis 在 Serverless 场景下的运用。

Redis 的特性及运用场景

Redis是一个开源的,依据内存的数据存储引擎。它非常简练,但功用全面实用、灵敏多变,常被称之为数据库范畴的 “瑞士军刀”,被数百万开发者用作数据库、缓存、流引擎和消息署理。

当 Redis 遇上 Serverless

Redis 的首要特点

  • 速度快:由于它是一个内存型数据库,数据的读取写入都直接经过内存完成,避免了读写硬盘而可能造成的推迟问题。即便在高频的读写场景下也能够有非常不错的体现;
  • 适用场景丰厚:Redis 有着丰厚的数据类型,能够灵敏的用于各类场景中(下文将详细介绍);
  • 上手本钱低:Redis 的操作指令和运用是非常简略的,包含它的通信协议 RESP 也规划的非常简练,感兴趣的小伙伴能够参考我之前的文章理解Redis 的 RESP 协议 | MoeLove
  • 支撑耐久化:尽管 Redis 是内存型数据库,但是考虑到实际的运用场景,假如能对数据进行耐久化,那么在遇到毛病或许数据恢复时则会方便许多。Redis 支撑经过 RDB(内存数据快照) 和 AOF (记录 Server 端的指令到文件)的方法进行耐久化;
  • 生态丰厚:Redis 有着 50 种言语的 Client library,覆盖了所有的主流编程言语。一起也有许多 CLI 和 GUI 的客户端东西能够运用;

Redis 支撑的数据类型及适用场景

前面说到 Redis 有着非常丰厚的数据类型,每种数据类型都有特定的运用场景。

  1. 字符串(string):字符串是 Redis 最基本的数据类型,字符串类型支撑的常用指令包含 SET、GET 等;
  2. 散列(hash):散列表是一种 K-V 型的数据结构,散列类型能够存储多个键值对,而且支撑嵌套数据结构。散列类型支撑的常用指令包含 HSET、HGET 等;
  3. 列表(list):列表在每个节点存储了一个字符串,能够在列表的两端进行元素的添加或删除操作。列表类型支撑的常用指令包含 LPUSH、RPUSH、LPOP 和 RPOP 等;
  4. 调集(set):调集是一个不答应有重复元素的无序数据结构,支撑取交集、并集和差集等常用操作。调集类型支撑的常用指令包含 SADD、SMEMBERS 等;
  5. 有序调集(zset):有序调集是一个能够排序的调集,每个元素都有一个 score,支撑依据 score 进行排序和范围查找。有序调集类型支撑的常用指令包含 ZADD、ZRANGE、ZREVRANK 和 ZSCORE 等;
  6. 位图(bitmap):位图不是个实际的数据类型,是一个由二进制位组成的数组结构,支撑位运算操作。位图常用于核算、记录用户的在线状况等场景;
  7. 位域(bitfield):位域也是一种用于操作二进制位的数据结构和指令调集。答应用户以比特位为单位对字符串进行操作,而且支撑多种位操作,例如获取、设置、计数等。位域也能够用于存储和操作布尔值、整数等数据类型;
  8. HyperLogLog:HyperLogLog 是一种基数算法,用于预算一个调集的基数。它选用的是随机化算法,而且空间复杂度很低。 HyperLogLog 可用于处理大量数据集的场景,例如网站的 UV 核算;

Redis 支撑这么多的数据类型和用法,使得它常年稳居 K-V 型存储排行榜的第一。以下是我新截图的排名:

当 Redis 遇上 Serverless

Redis 集群的架构

Redis 除了支撑 master-replica 这种简略的主从形式外,也供给了 Cluster 形式。

Redis Cluster 是 Redis 数据库的散布式解决计划。它能够将数据散布在多台服务器上,然后提高 Redis 的可用性和功能。

Redis Cluster 选用了分片的方法来存储数据,将数据分散在多个节点上。每个节点都存储一部分数据,而且每个节点都知道其他节点的信息。这样,当一个节点宕机时,其他节点能够接管它的数据,确保 Redis 集群的可用性。

一起,由于 Redis Cluster 的这种特性,也使得它能够经过添加节点的方法来对集群的容量进行扩展,这解决了单实例或许主从形式下,Redis 受限于地点机器内存容量约束的缺乏。

而且每个节点仍然能够选用主从的形式,提高其整体的可用性。

当 Redis 遇上 Serverless

Serverless 化的 Redis 有何优势

前面简略的介绍了下 Redis 的首要特性和它的集群形式。咱们会发现 Redis Cluster 有一个天然的优势 — 它能够进行水平扩展,然后提高集群的整体容量。

在 Redis Cluster 呈现之前,咱们的大多数生产环境都是在运用 master-replica 这种主从形式。运用主从形式时分存在一些痛点,关于毛病搬运之类的我这篇文章中就不谈了,我首要谈下关于容量的部分。

在每次事务申请新上 Redis 主从集群的时分,第一件事情便是需求描述清楚事务场景,用途,以及预期的容量(或许预估的增加速度)。这样才干去找到适宜的机器进行集群的部署。

在后续运用过程中,正常状况下会为数据设置 TTL 进行过期,但随着事务的发展,仍可能会导致集群容量逐步添加,当它快要达到容量的 80% 时分,就必须要扩容了。假如机器上尚有空余的内存,那么只需求修正 maxmemory 装备即可,但假如机器上内存容量缺乏,那只能进行集群的迁移了。到迁移时,相同涉及到了容量的规划,机器的采购等一系列繁琐的事情,苦不堪言。

那假如咱们选用 Serverless 化的 Redis 能带来哪些优势呢?

无需挑选实例巨细

无论是运用物理机也好,或许在挑选云厂商供给的数据库 / Redis 实例也罢,一般状况下都需求对容量有一个大致的评价,以及增速的评价,然后从一大堆的实例类型的列表中进行挑选。

不同的实例类型则对应不同的内存容量,网络吞吐等,这需求耗费许多的时刻,而且为了能在保障事务不受影响的一起优化本钱,还需求专门对于不同类型的实例进行压测,看看是否能满意预期,终究才干确认挑选哪个实例。

另外,事务的增加有时分会存在不确定性,一旦事务呈现爆发式增加,有些渠道不供给扩容才能,就只能迁移了。另一种状况是,一些渠道只答应进行规格升级,不答应降级,这样在事务低峰期的时分,也就造成了糟蹋。

当 Redis 遇上 Serverless

运用 Serverless Redis 就无需花时刻去进行这种实例的挑选了,它能够依据事务的实际状况,进行动态的水平、垂直弹性,这就方便许多了。创立时分也只需求指定最基本的信息就足够了。

当 Redis 遇上 Serverless

计费灵敏

传统的固定实例类型的计费方法,一般都是直接依照选定的实例巨细进行计费的。这种形式下,即便用量很少,也需求为没有运用的资源进行付费。

但是在 Serverless 形式下,则只需求按用量进行付费即可。

下图是亚马逊云科技 Amazon ElastiCache For Redis (Serverless 版)的计费形式,首要依照两个维度:

  • 数据存储:依照数据存储的时刻(GB – 小时)进行计费,最小单位是 1 GB;
  • ECPUs:指的是 ElastiCache 处理耗费的核算单元,假如在闲暇时刻是这部分是不产生费用的;

当 Redis 遇上 Serverless

弹性弹性和高可用

在 Serverless 形式下,一旦发现某个实例的负载较高,或许健康状况异常,则能够立刻进行扩容,确保整体的可用性。而且也无需忧虑容量约束的问题。

相同的,假如负载较低,则能够进行缩容,来节省本钱。

当 Redis 遇上 Serverless

Amazon ElastiCache for Redis (Serverless)

最近在亚马逊云科技 Amazon re:Invent 大会上新推出一款Amazon ElastiCache for Redis (Serverless 版) 服务,刚好便是我这篇文章中的实践。

我看到这个服务发布后,从速进行了一些尝试,以下是我个人觉得的一些要点。

TLS 衔接

在亚马逊云科技亚马逊云科技上创立这个服务的时分,会有一些选项,其间我注意到有个Encryption in transit这个是默许敞开的,而且在创立后也是不答应修正的。

这个特性标明在传输时需求运用 TLS 衔接,来确保安全。在咱们编译安装 redis-cli 东西的时分,就需求运用make BUILD_TLS=yes了,这样编译安装后,redis-cli 就能够运用--tls参数进行衔接了,不然会呈现衔接失利的状况。

代替的方法能够运用openssl s_client -connect IP:Port这样进行衔接。

当 Redis 遇上 Serverless

用户权限

在 Security groups 这儿,默许是不敞开用户认证的。能够在这儿修正,创立新的 Security group,并创立用户,这样就能够敞开用户认证了。

当 Redis 遇上 Serverless

网络

默许创立后的 endpoint 是一个 VPC 的内网地址,假如需求在外部拜访则需求创立 NAT Gateway,或许用其他方法进行转发。

我在相同 VPC 下开了另一个EC2实例跑了下 benchmark,效果如下:

当 Redis 遇上 Serverless

操控台上也有相关指标能够看到完整的 benchmark 后的资源耗费状况:

当 Redis 遇上 Serverless

总结

由于 Redis Cluster 架构的灵敏性,假如是将它用作 cache,运用 Serverless 的形式能带来不少的优势,提高整体服务的可用性,而且还能够减少开始容量规划上的耗时。

我觉得这将会是一种趋势。

本文参与了「构」向云端 | 亚马逊云科技 x 思否 2023 re:Invent 构建者征文大赛,欢迎正在阅读的你也加入。 授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包含不限于在 Developer Centre,知乎,自媒体渠道,第三方开发者媒体等亚马逊云科技官方渠道

文章来源: dev.amazoncloud.cn/column/arti…