云计算可以帮助以可扩展且经济高效的方式托管应用程序。基础设施即服务 (IaaS) 领域的领先供应商是 Amazon Web Services (AWS),它提供可扩展、高可用性和安全的云托管服务,包括 Redis。如果您的应用程序使用 Redis 进行缓存或数据存储,以下是一些技巧,可以帮助您节省时间和金钱,并通过 AWS Redis 在 aws 上获得更好的 Redis 性能。
在适用情况下,应使用支持硬件虚拟机 (HVM) 的实例(例如,第二代 M3 实例和 R3 内存优化实例)来减少由于分叉时间导致的延迟问题,并为了在不同内核上运行多个 Redis 服务器。
非 HVM EC2 实例使用 Xen 虚拟机管理程序,它在分叉大型进程时速度慢得多。Redis 的持久性选项 RDB 和 AOF 都会分叉主线程并启动后台重写或保存进程。当分叉涉及大量内存时,它会显着增加 Redis 的延迟。
同一台机器上的多个内核也可以用于部署多个 Redis 实例。在这种设置中,由于每个 Redis 实例管理的数据集更小,因此可以进一步减少每个数据库的分叉时间。
交换是操作系统的一种机制,它试图有效地使用 RAM。但是,由于 Redis AWS 是一个内存数据库,为了提供最佳性能,所有数据必须保存在 RAM 中。
启用交换后,Redis on aws 可能会尝试访问磁盘上的内存页面。这会导致 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 提升到下一步。关于 Redis on AWS 有什么问题?关于 Redis AWS 的反馈?发送电子邮件 或 在 Twitter 上联系我 - 我是高可用的 🙂