您当前的位置:首页 > 电脑百科 > 数据库 > Redis

在云端使用 Redis? 以下是你应该知道的十件事

时间:2022-10-08 12:00:57  来源:网易号  作者:qaseven

很难大规模操作有状态的分布式系统,redis 也不例外。托管数据库通过承担大部分繁重工作使生活变得更轻松。但是您仍然需要一个健全的架构并在服务器(Redis)和客户端(应用程序)上应用最佳实践。

本博客涵盖了一系列与 Redis 相关的最佳实践、提示和技巧,包括集群可扩展性、客户端配置、集成、指标等。虽然我会不时引用Amazon MemoryDB和ElastiCache for Redis,但大多数(如果不是全部) ) 一般适用于 Redis 集群。

无论如何,这并不意味着是一个详尽的清单。我只是选择了十,因为它是一个不错的、有益健康的数字!

让我们深入了解一下您在扩展 Redis 集群方面有哪些选择。

1. 可扩展性选项

您可以放大或缩小:

扩展(垂直)- 您可以增加单个节点/实例的容量,例如从Amazon EC2db.r6g.xlarge类型升级到db.r6g.2xlarge

Scaling Out (Horizontal) - 您可以向集群添加更多节点

向外扩展的需求可能是由几个原因驱动的。

如果您需要处理读取繁重的工作负载,您可以选择添加更多副本节点。这适用于 Redis 集群设置(如MemoryDB)或非集群主副本模式,例如ElastiCache with cluster mode disabled的情况。

如果您想增加写入容量,您会发现自己受到主副本模式的限制,应该选择基于 Redis 集群的设置。您可以增加集群中的分片数量 - 这是因为只有主节点可以接受写入,并且每个分片只能有一个主节点。

这还具有增加整体高可用性的额外好处。

图 1:Redis(已禁用集群模式)和 Redis(已启用集群模式)集群 – ElastiCache for Redis 文档

2. 扩展集群后,最好使用这些副本!

大多数 Redis 集群客户端(包括 )的默认行为redis-cli是将所有读取重定向到主节点。如果您添加了只读副本来扩展读取流量,它们将处于空闲状态!

您需要切换到READONLY模式以确保副本处理所有读取请求,而不仅仅是被动参与者。确保正确配置您的 Redis 客户端 - 这将因客户端和编程语言而异。

例如,在Go Redis 客户端中,您可以设置ReadOnly为true:

client := redis.NewClusterClient(

&redis.ClusterOptions{

Addrs: []string{clusterEndpoint},

ReadOnly: true,

//..other options

})

为了进一步优化,您还可以使用RouteByLatency或RouteRandomly,这两个都自动开启ReadOnly模式。

您可以参考JAVA 客户端(例如 Lettuce)的工作原理

3. 使用只读副本时要注意一致性特征

您的应用程序有可能从副本中读取过时的数据——这就是最终一致性。由于主副本节点复制是异步的,因此您发送到主节点的写入器可能尚未反映在只读副本中。当您拥有大量只读副本(尤其是跨多个可用区)时,可能会出现这种情况。如果这对您的用例来说是不可接受的,那么您也必须求助于使用主节点进行读取。

MemoryDB 或 ElastiCache for Redis 中的ReplicationLag 指标可用于检查副本在应用来自主节点的更改方面落后多长时间(以秒为单位)。

那么强一致性呢?

在这种情况下MemoryDB,来自主节点的读取是强一致的。这是因为客户端应用程序仅在写入(到主节点)写入持久多可用区事务日志后才会收到成功的写入确认。

4. 请记住,您可以影响密钥在 Redis 集群中的分布方式

Redis 没有使用一致性哈希(像许多其他分布式数据库一样),而是使用哈希槽的概念。总共有16384槽,为集群中的每个主节点分配一定范围的哈希槽,每个键属于特定的哈希槽(从而分配给特定节点)。如果键属于不同的哈希槽,则在 Redis 集群上执行的多键操作将无法进行。

但是,您并非完全受集群的支配!可以通过使用hashtags来影响键的位置。因此,您可以确保特定键具有相同的哈希槽。例如,如果您将客户 ID 的订单存储42在HASHnamedcustomer:42:orders中,并将客户资料信息存储在 中customer:42:profile,您可以使用花括号{}来定义将被散列的特定子字符串。在这种情况下,我们的键是{customer:42}:orders和{customer:42}:profile-{customer:42}现在驱动哈希槽的放置。现在我们可以确信这两个键都在同一个哈希槽中(因此是同一个节点)。

5. 您是否考虑过缩小(后退)?

您的应用程序很成功,它有很多用户和流量。你扩展了集群,事情仍然很顺利。惊人的!

但是,如果您需要缩减规模怎么办?

在执行此操作之前,您需要注意一些事项:

每个节点上是否有足够的可用内存

这可以在非高峰时段进行吗?

它将如何影响您的客户端应用程序?

在此阶段您可以监控哪些指标?(例如CPUUtilization,CurrConnections等等)

请参阅MemoryDb for Redis 文档中的一些最佳实践,以更好地规划扩展。

6. 当事情出错时......

面对现实吧,失败是令人羡慕的。重要的是你是否为他们做好了准备。对于您的 Redis 集群,需要考虑以下几点:

您是否测试过您的应用程序/服务在遇到故障时的行为?如果没有,请做!借助 MemoryDB 和 ElastiCache for Redis,您可以利用故障转移 API模拟主节点故障并触发故障转移。

你有副本节点吗?如果您只有一个带有单个主节点的分片,那么如果该节点发生故障,您肯定会停机。

你有多个分片吗?如果您只有一个分片(主分片和副本分片),则在该分片的主节点故障的情况下,集群将无法接受任何写入。

您的分片是否跨越多个可用区?如果您有跨多个 AZ 的分片,您将更好地准备应对 AZ 故障。

在所有情况下,MemoryDB确保在节点更换或故障转移期间不会丢失数据

7. 无法连接Redis,求助!

Tl;DR:可能是网络/安全配置

这是一直困扰人们的事情!使用MemoryDB和ElastiCache,您的Redis 节点位于 VPC 中。如果您将客户端应用程序部署到AWS Lambda、EKS、ECS、App Runner等计算服务,则需要确保您拥有正确的配置 - 特别是在 VPC 和安全组方面。

这可能因您使用的计算平台而异。例如,您如何配置 Lambda 函数以访问 VPC 中的资源与 App Runner 的操作方式(通过VPC 连接器)甚至 EKS(尽管从概念上讲,它们是相同的)略有不同。

8. Redis 6 自带访问控制列表 - 使用它们!

没有理由不对 Redis 集群应用身份验证(用户名/密码)和授权(基于 ACL 的权限)。MemoryDB符合 Redis 6 并支持 ACL。但是,为了符合较旧的 Redis 版本,它为每个帐户配置一个默认用户(使用用户名default)和一个名为 的不可变 ACL open-access。如果您创建MemoryDB集群并将其与此 ACL 关联:

客户端无需身份验证即可连接

客户端可以在任何键上执行任何命令(也没有权限或授权)

作为最佳实践:

定义显式 ACL

添加用户(连同密码),以及

根据您的安全要求配置访问字符串。

您应该监控身份验证失败。例如,MemoryDB 中的AuthenticationFAIlures指标为您提供失败的身份验证尝试总数 - 对此设置警报以检测未经授权的访问尝试。

不要忘记周边安全

如果您已经TLS在服务器上进行了配置,请不要忘记在您的客户端中也使用它!例如,使用 Go Redis:

client := redis.NewClusterClient(

&redis.ClusterOptions{

Addrs: []string{clusterEndpoint},

TLSConfig: &tls.Config{MaxVersion: tls.VersionTLS12},

//..other options

})

不使用它可能会给你的错误不够明显(例如泛型i/o timeout)并使事情难以调试 - 这是你需要小心的事情。

9.有些事情你不能做

作为托管数据库服务,MemoryDB或ElastiCache 限制对某些 Redis 命令的访问。例如,您不能使用与CLUSTER相关的命令的子集,因为集群管理(规模、分片等)由服务本身承担。

但是,在某些情况下,您可能会找到替代方案。以监控运行缓慢的查询为例。虽然您无法latency-monitor-threshold使用CONFIG SET进行配置,但您可以slowlog-log-slower-than在参数组中设置设置,然后使用slowlog get它进行比较。

10.使用连接池

您的 Redis 服务器节点(即使是功能强大的节点)资源有限。其中之一是能够支持一定数量的并发连接。大多数 Redis 客户端都提供连接池作为有效管理与 Redis 服务器的连接的一种方式。重用连接不仅有利于您的 Redis 服务器,而且由于开销减少,客户端性能也得到了提高——这在大容量场景中至关重要。

ElastiCache 提供了一些您可以跟踪的指标:

CurrConnections:客户端连接数(不包括只读副本)

NewConnections:特定时间段内服务器接受的连接总数。

11.(奖励)使用适当的连接模式

这一点很明显,但我还是要说出来,因为这是我目睹人们犯的最常见的“入门”错误之一。

您在客户端应用程序中使用的连接模式取决于您是使用独立的 Redis 设置还是 Redis 集群(很可能)。大多数 Redis 客户端对它们进行了明确的区分。例如,如果您使用启用了集群模式的Go Redis 客户端MemoryDB),则Elasticache需要使用NewClusterClient(而不是NewClient):

redis.NewClusterClient(&redis.ClusterOptions{//....})

有趣的是,有一个更加灵活的 UniversalClient 选项(在撰写本文时,这是在 Go Redis v9 中)

如果你没有使用正确的连接模式,你会得到一个错误。但有时,根本原因会隐藏在一般错误消息的后面——因此您需要保持警惕。

结论

您所做的架构选择最终将取决于您的特定需求。我鼓励您浏览以下博客文章,以更深入地了解 MemoryDB 和 ElastiCache for Redis 的性能特征,以及它们如何影响设计解决方案的方式:

优化 Amazon ElastiCache 和 MemoryDB 的 Redis 客户端性能

最佳实践:Redis 客户端和适用于 Redis 的 Amazon ElastiCache

测量 Amazon MemoryDB for Redis 的数据库性能

随意分享您的 Redis 提示、技巧和建议。在那之前,快乐的建筑!



Tags:Redis   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
16个Redis常见使用场景总结
来源:blog.csdn.net/qq_39938758/article/details/105577370目录 缓存 数据共享分布式 分布式锁 全局ID 计数器 限流 位统计 购物车 用户消息时间线timeline 消息...【详细内容】
2024-04-11  Search: Redis  点击:(4)  评论:(0)  加入收藏
Linux获取Redis 性能指标方法
一、监控指标Ø 性能指标:PerformanceØ 内存指标: MemoryØ 基本活动指标:Basic activityØ 持久性指标: PersistenceØ 错误指标:Error二、监...【详细内容】
2024-04-11  Search: Redis  点击:(4)  评论:(0)  加入收藏
Redis与缓存一致性问题
缓存一致性问题是在使用缓存系统,如Redis时经常遇到的问题。当数据在原始数据源(如数据库)中发生变化时,如何确保缓存中的数据与数据源保持一致,是开发者需要关注的关键问题。一...【详细内容】
2024-04-11  Search: Redis  点击:(3)  评论:(0)  加入收藏
Redis 不再 “开源”,未来采用 SSPLv1 和 RSALv2 许可证
Redis 官方于21日宣布修改开源协议 —— 未来所有版本都将使用 “源代码可用” 的许可证 (source-available licenses)。具体来说,Redis 将不再遵循 BSD 3-Clause...【详细内容】
2024-03-27  Search: Redis  点击:(14)  评论:(0)  加入收藏
Redis“叛逃”开源,得罪了几乎所有人
内存数据库供应商Redis近日在开源界砸下了一块“巨石”。Redis即将转向双许可模式,并实施更为严格的许可条款。官方对此次变更的公告直截了当:从Redis 7.4版本开始,Redis将在Re...【详细内容】
2024-03-25  Search: Redis  点击:(10)  评论:(0)  加入收藏
如何使用 Redis 实现消息队列
Redis不仅是一个强大的内存数据存储系统,它还可以用作一个高效的消息队列。消息队列是应用程序间或应用程序内部进行异步通信的一种方式,它允许数据生产者将消息放入队列中,然...【详细内容】
2024-03-22  Search: Redis  点击:(18)  评论:(0)  加入收藏
Redis不再 “开源”
Redis 官方今日宣布修改开源协议 —— 未来所有版本都将使用 “源代码可用” 的许可证 (source-available licenses)。具体来说,Redis 将不再遵循 BSD 3-Clause 开...【详细内容】
2024-03-21  Search: Redis  点击:(11)  评论:(0)  加入收藏
在Redis中如何实现分布式锁的防死锁机制?
在Redis中实现分布式锁是一个常见的需求,可以通过使用Redlock算法来防止死锁。Redlock算法是一种基于多个独立Redis实例的分布式锁实现方案,它通过协调多个Redis实例之间的锁...【详细内容】
2024-02-20  Search: Redis  点击:(49)  评论:(0)  加入收藏
手动撸一个 Redis 分布式锁
大家好呀,我是楼仔。今天第一天开工,收拾心情,又要开始好好学习,好好工作了。对于使用 Java 的小伙伴,其实我们完全不用手动撸一个分布式锁,直接使用 Redisson 就行。但是因为这些...【详细内容】
2024-02-19  Search: Redis  点击:(40)  评论:(0)  加入收藏
工作中Redis有哪些好用的运维工具
工作中使用 Redis 时,如果大家公司没有专业运维,可能开发人员就会面临这些运维的工作,包括 Redis 的运行状态监控,数据迁移,主从集群、切片集群的部署和运维等等。本文我就从这三...【详细内容】
2024-02-06  Search: Redis  点击:(56)  评论:(0)  加入收藏
▌简易百科推荐
16个Redis常见使用场景总结
来源:blog.csdn.net/qq_39938758/article/details/105577370目录 缓存 数据共享分布式 分布式锁 全局ID 计数器 限流 位统计 购物车 用户消息时间线timeline 消息...【详细内容】
2024-04-11    书圈  Tags:Redis   点击:(4)  评论:(0)  加入收藏
Linux获取Redis 性能指标方法
一、监控指标Ø 性能指标:PerformanceØ 内存指标: MemoryØ 基本活动指标:Basic activityØ 持久性指标: PersistenceØ 错误指标:Error二、监...【详细内容】
2024-04-11  上海天正信息科技有限    Tags:Redis   点击:(4)  评论:(0)  加入收藏
Redis与缓存一致性问题
缓存一致性问题是在使用缓存系统,如Redis时经常遇到的问题。当数据在原始数据源(如数据库)中发生变化时,如何确保缓存中的数据与数据源保持一致,是开发者需要关注的关键问题。一...【详细内容】
2024-04-11  后端Q    Tags:Redis   点击:(3)  评论:(0)  加入收藏
Redis 不再 “开源”,未来采用 SSPLv1 和 RSALv2 许可证
Redis 官方于21日宣布修改开源协议 —— 未来所有版本都将使用 “源代码可用” 的许可证 (source-available licenses)。具体来说,Redis 将不再遵循 BSD 3-Clause...【详细内容】
2024-03-27  dbaplus社群    Tags:Redis   点击:(14)  评论:(0)  加入收藏
Redis“叛逃”开源,得罪了几乎所有人
内存数据库供应商Redis近日在开源界砸下了一块“巨石”。Redis即将转向双许可模式,并实施更为严格的许可条款。官方对此次变更的公告直截了当:从Redis 7.4版本开始,Redis将在Re...【详细内容】
2024-03-25    51CTO  Tags:Redis   点击:(10)  评论:(0)  加入收藏
如何使用 Redis 实现消息队列
Redis不仅是一个强大的内存数据存储系统,它还可以用作一个高效的消息队列。消息队列是应用程序间或应用程序内部进行异步通信的一种方式,它允许数据生产者将消息放入队列中,然...【详细内容】
2024-03-22  后端Q  微信公众号  Tags:Redis   点击:(18)  评论:(0)  加入收藏
Redis不再 “开源”
Redis 官方今日宣布修改开源协议 —— 未来所有版本都将使用 “源代码可用” 的许可证 (source-available licenses)。具体来说,Redis 将不再遵循 BSD 3-Clause 开...【详细内容】
2024-03-21  OSC开源社区    Tags:Redis   点击:(11)  评论:(0)  加入收藏
在Redis中如何实现分布式锁的防死锁机制?
在Redis中实现分布式锁是一个常见的需求,可以通过使用Redlock算法来防止死锁。Redlock算法是一种基于多个独立Redis实例的分布式锁实现方案,它通过协调多个Redis实例之间的锁...【详细内容】
2024-02-20  编程技术汇    Tags:Redis   点击:(49)  评论:(0)  加入收藏
手动撸一个 Redis 分布式锁
大家好呀,我是楼仔。今天第一天开工,收拾心情,又要开始好好学习,好好工作了。对于使用 Java 的小伙伴,其实我们完全不用手动撸一个分布式锁,直接使用 Redisson 就行。但是因为这些...【详细内容】
2024-02-19  楼仔  微信公众号  Tags:Redis   点击:(40)  评论:(0)  加入收藏
工作中Redis有哪些好用的运维工具
工作中使用 Redis 时,如果大家公司没有专业运维,可能开发人员就会面临这些运维的工作,包括 Redis 的运行状态监控,数据迁移,主从集群、切片集群的部署和运维等等。本文我就从这三...【详细内容】
2024-02-06  waynaqua    Tags:Redis   点击:(56)  评论:(0)  加入收藏
站内最新
站内热门
站内头条