

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 最佳实践：在线调整集群大小
<a name="best-practices-online-resharding"></a>

*重新分片*涉及在集群中增加或删除分片或节点以及重新分配密钥空间。因此，多重因素会对重新分片的操作产生影响，如集群的负载、内存使用率和整体数据大小。对于最佳体验，我们建议您遵循整体集群最佳实践进行统一工作负载模式分配。此外，我们建议执行以下步骤。

在启动重新分片前，建议进行以下操作：
+ **测试应用程序** – 尽可能在过渡环境中在重新分片期间测试应用程序行为。
+ **获取扩展问题的提前通知** – 重新分片是一项需使用大量计算资源的操作。因此，我们建议在重新分片期间，多核心实例的情况下 CPU 保持 80% 以下的利用率，单核心实例的情况下 CPU 保持 50% 以下的利用率。在应用程序开始监测扩展问题前监控 MemoryDB 指标并启动重新分片。跟踪的有用指标为 `CPUUtilization`、`NetworkBytesIn`、`NetworkBytesOut`、`CurrConnections`、`NewConnections`、`FreeableMemory`、`SwapUsage` 和 `BytesUsedForMemoryDB`。
+ **横向缩减前请确保有足够的空余内存可用** – 如果要进行横向缩减，请确保要保留的分片上的可用空余内存至少是您计划删除的分片上已用内存的 1.5 倍。
+ **在非高峰时间启动重新分片** – 此做法有助于减少重新分片操作期间对客户端的延迟和吞吐量的影响。同样有助于更快完成重新分片，因为有更多资源可用于槽重新分配。
+ **审核客户端超时行为** – 部分客户端可能会在联机集群调整大小期间出现更高的延迟。为客户端库配置更高的超时会有所帮助，即便服务器处于更高的负载条件下，系统也有时间进行连接。在某些情况下，您可能会打开与服务器的大量连接。在这些情况下，请考虑增加指数回退以便重新连接逻辑。这样做可防止突增的新连接同时连接服务器。

在重新分片期间，建议进行以下操作：
+ **避免耗费大量资源的命令** – 避免运行任何计算型和输入/输出密集型操作，例如 `KEYS` 和 `SMEMBERS` 命令。我们推荐此方法是因为这些操作可增加集群上的负载并能对集群的性能产生影响。改用 `SCAN` 和 `SSCAN` 命令。
+ **遵循 Lua 最佳实践** – 避免长时间运行 Lua 脚本并始终预先声明在 Lua 脚本中使用的密钥。我们建议使用此方法确定 Lua 脚本未使用跨槽命令。请确保 Lua 脚本中使用的密钥属于同一槽。

重新分片完成后，请注意以下事项：
+ 如果目标分片上的内存不足，缩减可能会部分完成。如果发生此结果，必要时请查看可用内存并重新进行操作。
+ 带有大型项目的槽不会迁移。特别是带有超过 256 MB 后序列化的槽不会迁移。
+  在重新分片操作期间，Lua 脚本中不支持 `FLUSHALL` 和 `FLUSHDB` 命令。