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


在执行此操作之前,您需要注意一些事项:
每个节点上是否有足够的可用内存?
这可以在非高峰时段进行吗?
它将如何影响您的客户端应用程序?
在此阶段您可以监控哪些指标?(例如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):


推荐阅读