

# 特定于实例的性能和资源监控
<a name="limitless-instance-monitoring"></a>

要了解连接偏斜、工作负载偏斜和数据偏斜，以及何时添加路由器或拆分分片来纵向扩展以便在保持延迟的情况下提高吞吐量，实例级监控是关键所在。

## 概述
<a name="limitless-instance-monitoring-overview"></a>

当您的应用程序针对其发出查询时，该请求需要遍历复杂的分布式系统，然后才能返回结果。一条看似简单的 `SELECT` 语句可能会涉及多个数据库实例，每个实例在处理您的请求时都扮演着不同的角色。了解这段旅程以及为其提供支持的实例，可以改变您设计应用程序、解释监控数据和诊断性能问题的方式。

本指南提供了对实例架构的深入技术剖析：
+ 无限架构刷新器、路由器和分片
+ 何时以及如何扩展每种实例类型来满足您的性能和容量需求
+ 如何监控、排查实例级性能问题并进行优化
+ 高效利用分布式架构的应用程序设计最佳实践

## 实例架构基础知识
<a name="limitless-instance-monitoring-architecture"></a>

 通过跨两种专用实例类型的功能分离来实现横向可扩展性：
+ **路由器实例**提供了编排层，它们接受客户端连接、分析查询、协调分布式操作和汇总结果。路由器是无状态的，这意味着它们不存储数据，可以在不迁移数据的情况下添加或删除。
+ **分片实例**提供数据和计算层，它们存储表数据、对本地数据执行查询和处理事务。分片是有状态的，每个分片都拥有由一致性哈希确定的特定数据子集。

利用这种分离，您可以根据工作负载特征独立地扩展连接处理、查询协调和数据存储。

### 路由器和分片比较
<a name="limitless-instance-monitoring-comparison"></a>


| 特征 | 路由器实例 | 分片实例 | 
| --- | --- | --- | 
| 主角色 | 查询协调和分发 | 数据存储和查询执行 | 
| 州 | 无状态（无数据存储） | 有状态（拥有数据） | 
| 可扩展性 | 即时添加/删除 | 需要数据再平衡 | 
| 资源使用情况 | CPU 用于协调；中等内存 | CPU 用于查询；大量内存用于缓存 | 
| 扩展触发 | 高连接数、分布式事务速率 | 高 CPU、数据量、查询吞吐量 | 

## 监控实例性能
<a name="limitless-instance-monitoring-performance"></a>

了解实例级性能对于高效运营至关重要。特定于实例的监控揭示了影响性能的分布模式：连接偏斜、工作负载偏斜和数据偏斜。

### 检测偏斜
<a name="limitless-instance-monitoring-skew"></a>

在理想的部署中，工作负载和资源均匀地分布在各个实例上。实际上，应用程序经常会遇到偏斜，也就负载分布不均匀，集中在特定实例上。

有三种偏斜类型需要监控：
+ **连接偏斜**：路由器间的客户端连接分布不均匀
+ **工作负载偏斜**：由于存在热分片键，分片间的查询负载不均匀
+ **数据倾斜**：由于分片键频率的原因，分片间的数据量不均匀

### 数据库洞察负载分配
<a name="limitless-instance-monitoring-insights"></a>

评测实例级运行状况的最快方法是查看数据库洞察的“负载分布”视图，该视图可让您立即了解活动会话在实例之间的分布情况。

要访问“负载分布”，请执行以下操作：

1. 导航到 RDS 控制台 → 您的无限集群

1. 选择“性能详情”选项卡

1. 单击“负载分布”部分

**正常模式：**负载在实例间相对均匀地分布
+ 路由器可能会表现出会略高于分片的 AAS（协调开销）
+ 分片 AAS 值彼此相差在 20% 以内表示实现良好平衡

**集中模式：**高度集中在特定实例上
+ 一个路由器承担超过 70% 的路由器负载 → 连接偏斜
+ 一个分片承担超过 50% 的分片负载 → 工作负载或数据偏斜
+ 分片之间的差异很大 → 调查分片键分布

### CloudWatch 指标
<a name="limitless-instance-monitoring-cloudwatch"></a>

为了在数据库洞察之外进行更深入的分析，CloudWatch 提供了特定于实例的指标，可用于揭示资源使用模式。

带维度 `DBShardGroupInstance` 的指标 `ServerlessDatabaseCapacity` 说明了每个实例的 ACU 消耗量，提供了最直接的资源利用率视图。

**何时进行调查：**
+ 路由器 ACU 差异超过 30% → 连接偏斜或跨分片工作负载太集中
+ 分片 ACU 差异超过 40% → 数据或工作负载偏斜
+ 任何实例始终处于最大 ACU → 容量限制

## 路由器监控和故障排除
<a name="limitless-instance-monitoring-router"></a>

路由器可能会由于两个主要原因而遇到性能问题：连接分布不均匀和跨分片工作负载太集中。

### 会话分布不均匀
<a name="limitless-instance-monitoring-router-connections"></a>

**症状：**一个路由器处理了过高比例的连接份额

**根本原因：**DNS 缓存导致多个连接请求解析到同一个路由器端点。

**最常见于：**
+ 使用 pgbench 等工具进行基准测试时
+ 连接池初始化时（快速建立多个连接）
+ 应用程序服务器重新启动时

**补救措施：**
+ 确保使用控制台中指定的无限端点
+ 手动平衡：提取路由器端点并将不同的应用程序连接到不同的路由器
+ 对于 libpq 应用程序，使用功能 `LOADBALANCEHOSTS`
+ 对于 JDBC 应用程序，使用无限连接插件
+ 使用 NLB 管理会话和分发

## 分片监控和故障排除
<a name="limitless-instance-monitoring-shard"></a>

分片遇到性能问题主要有三个原因：资源限制、数据偏斜和工作负载偏斜。

### 分片资源利用率
<a name="limitless-instance-monitoring-shard-utilization"></a>

具有热门分片键的分片会拥有更多的数据和更高的工作负载。这会体现在资源使用率中，即实例将会消耗更多的 ACU。

**补救策略：**

1. **重新评测分片键选择：**查看分片键基数和访问模式。考虑使用复合分片键来实现更好的分布。

1. **拆分分片：**将负载分布到更多分片实例上

**何时拆分分片：**
+ 单个分片始终保持在最大 ACU 的时间超过 80%
+ 查询吞吐量受单个分片容量的限制

### 分片数据量
<a name="limitless-instance-monitoring-shard-data"></a>

使用 SQL 函数来查询数据量：

```
SELECT subcluster_id, subcluster_type, pg_size_pretty(db_size) 
FROM rds_aurora.limitless_stat_database_size('postgres_limitless') 
ORDER BY 1;
```

要查看每个表和每个分片的数据，请执行以下操作：

```
SELECT * FROM rds_aurora.limitless_stat_relation_sizes('public', 'table_name');
```

### 解决使用率不均的问题
<a name="limitless-instance-monitoring-shard-split"></a>

当工作负载或数据倾斜集中在特定的分片上时，拆分分片可以将负载重新分配到更多实例上。

重要注意事项：
+ 无法控制要移动哪些分片键
+ 如果不恢复到拆分之前制作的手动快照，就无法撤消拆分
+ 所有实例（包括新分片）在空闲时消耗的实例最小 ACU

拆分分片可实现进一步扩展，而连续的分片拆分可以实现更高的吞吐量和进一步扩展，同时保持低延迟。

## 限制
<a name="limitless-instance-monitoring-limitations"></a>

请注意以下操作限制：

**路由器限制：**
+ **路由器无法移除**，路由器在添加后将保留在集群中
+ 请仔细规划路由器的添加，以避免不必要的基准成本

**分片限制：**
+ **分片无法合并**，分片拆分是单向操作
+ 唯一的恢复选项是从拆分前制作的快照中恢复

**缓解方案：**
+ 从最小可行实例数开始
+ 根据需要以增量方式增加容量
+ 在拓扑发生重大更改之前制作快照
+ 监控集群增长时的基准成本