云计算可以帮助以可扩展且经济高效的方式托管应用程序。基础设施即服务 (IaaS) 领域的主要供应商是 Amazon Web Services (AWS),它提供可扩展、高可用性和安全的云托管 Redis。如果您的应用程序使用 Redis 进行缓存或数据存储,以下是一些技巧,可以帮助您节省时间、金钱,并通过 AWS Redis 在 aws 上实现更好的 Redis 性能。
在适用情况下,应使用启用硬件虚拟机 (HVM) 的实例(例如,第二代 M3 实例和 R3 内存优化实例)以减少因 fork 时间引起的延迟问题,并以便在不同的核心上运行多个 Redis 服务器。
非 HVM EC2 实例使用 Xen 虚拟机管理程序,该程序在 fork 大型进程时速度慢得多。Redis 的持久化选项 RDB 和 AOF 都会 fork 主线程并启动后台重写或保存进程。当 fork 涉及大量内存时,会显著增加 Redis 的延迟。
同一台机器上的多个核心也可用于部署多个 Redis 实例。在这种设置中,由于每个 Redis 实例管理较小的数据集,因此可以进一步缓解每个数据库的 fork 时间。
交换是一种操作系统机制,旨在有效利用 RAM。然而,鉴于 Redis AWS 是一个内存数据库,为了提供最佳性能,所有数据必须保存在 RAM 中。
启用交换后,AWS 上的 Redis 可能会尝试访问磁盘上的内存页。这将导致 Redis 进程被磁盘的 I/O 操作阻塞,由于它涉及随机 I/O,因此可能是一个缓慢的过程。通过将 Redis 链接到磁盘性能,您很可能会遇到延迟增加。为了缓解这种情况,您可以在 Linux 中配置以下选项,在/etc/sysctl.conf
vm.swappiness=0 vm.overcommit_memory=1
对于 Redis AWS,这意味着当内存几乎已满时,内核将尝试从缓存中窃取页面,而不是从程序交换到内存。使用这些设置以及 Redis 的maxmemory 和maxmemory-policy 指令,以防止 Redis AWS 拒绝写入或内核的内存不足管理器 (OOM) 终止 Redis。
EC2 实例配备了临时存储,EBS 是 AWS 中持久数据的实际标准存储。请记住,EBS 是网络连接存储。因此,如果您要将数据持久化到卷,EBS 会与 Redis 争夺网络带宽。额外的 I/O 和有限的带宽可能会影响使用 EBS 时的 Redis 性能。尽管如此,这也可以通过多种方式减少,包括
使用大型 EBS 卷以获得类似专用的性能。
使用 EBS 配置上的 RAID。
使用 EBS 优化实例以提高性能,这是由于 EC2 实例和 EBS 之间的专用带宽造成的。
最后但并非最不重要的一点是 – 审查您的应用程序的持久性要求并调整 Redis 的持久性以适应它们。
如果您的数据的最大大小小于每个实例 4GB,则通过保存位,您还可以省钱。在 32 位目标上编译和运行 Redis 时,由于指针较小,因此每个键使用的内存更少。
如果您不确定数据集的大小,请使用 INFO 命令来获取相关数字(例如used_memory)。您还可以使用基准测试工具,例如 redis-benchmark 或 memtier-benchmark,以生成随机数据集以进行估算。
请记住,在规划 Redis AWS 服务器的整体 RAM 时,数据集的大小并不是唯一的考虑因素。例如,如果您启用了持久化或复制,则后台内存线程将定期创建数据的副本,该副本将在该时间点位于内存中。然后,任何数据都保留在内存中,直到操作完成,因此,对正在复制的数据/键的任何更新操作都需要额外的内存,形式为内存页和缓冲区。在“最坏情况”场景中,在此期间更新了所有键,可能需要两倍或更多的内存,而不是没有持久化和/或复制所需的内存。为了防止在这种情况下耗尽内存,至少对实际数据集的大小使用 2 的因子。
最后一个技巧回到了原点,从技巧 #1 停止的地方开始。Redis 是一个(主要是)单线程进程,这意味着每个 Redis 进程最多可以使用一个核心。为了更好地利用具有多个核心的 EC2 实例,您可以为服务器的每个核心启动一个 Redis 进程,并有效地利用额外的核心。这些额外的服务器可以充当独立的 Redis 服务器。例如,一个可以用于管理用户会话数据,而另一个可以用于缓存用户配置文件。利用这些多个核心的另一种方法是在服务器之间对数据进行分片。
分片本身就是一个很大的话题,我们将在接下来的几周内花更多的时间来讨论它。准备好面对与选择应用程序端、客户端辅助、通过代理或通过集群分片相关的戏剧。了解关于分片的恐怖真相,以及如何勇敢地与它们作斗争。了解如何将 Redis 带到下一步。对 AWS 上的 Redis 有疑问吗?对 Redis AWS 的反馈?电子邮件 或 推特 我 – 我有很高的可用性 🙂