

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

# Auto Discovery 如何发挥作用
<a name="AutoDiscovery.HowAutoDiscoveryWorks"></a>

**Topics**
+ [连接至缓存节点](#AutoDiscovery.HowAutoDiscoveryWorks.Connecting)
+ [正常集群操作](#AutoDiscovery.HowAutoDiscoveryWorks.NormalOps)
+ [其他操作](#AutoDiscovery.HowAutoDiscoveryWorks.OtherOps)

本部分介绍了客户端应用程序如何使用 ElastiCache Cluster Client 来管理缓存节点连接，并与缓存中的数据项目互动。

## 连接至缓存节点
<a name="AutoDiscovery.HowAutoDiscoveryWorks.Connecting"></a>

从应用程序的角度来看，连接至集群配置终端节点与直接连接至个别缓存节点并无差别。下面的序列图显示了连接至缓存节点的流程。

![\[连接至缓存节点\]](http://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/dg/images/autodiscovery_cluster_membership_refresh-diagram.png)



**连接至缓存节点的流程**  

|  |  | 
| --- |--- |
|  ![\[1\]](http://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/dg/images/callouts/1.png) | 应用程序可以解析配置终端节点的 DNS 名称。由于配置终端节点为所有缓存节点保留 CNAME 条目，因此 DNS 名称被定为其中的一个节点；然后，客户端便可连接至这个节点。 | 
|  ![\[2\]](http://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/dg/images/callouts/2.png) | 客户端需要所有其他节点的配置信息。由于每个节点都为集群中的所有节点保留配置信息，因此任何节点都可以根据请求把配置信息传给客户端。 | 
|  ![\[3\]](http://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/dg/images/callouts/3.png) | 客户端则可收到当前的缓存节点主机名和 IP 地址列表。随后，它可以连接至集群中的所有其他节点。 | 



**注意**  
客户端程序每分钟刷新一次缓存节点主机名和 IP 地址列表。如有必要，可以调整这个轮询间隔时间。

## 正常集群操作
<a name="AutoDiscovery.HowAutoDiscoveryWorks.NormalOps"></a>

当应用程序已连接至所有缓存节点时，ElastiCache Cluster Client 可以确定哪些节点应该存储单个数据项，以及哪些节点稍后应该用来查询此类数据项目。下面的序列图显示了正常集群操作的流程。

![\[正常集群操作\]](http://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/dg/images/autodiscovery_normal_cache_usage-diagram.png)



**正常集群操作的流程**  

|  |  | 
| --- |--- |
|  ![\[1\]](http://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/dg/images/callouts/1.png) | 应用程序发出一个 get 请求，旨在获取一个由其密钥识别的特定数据项。 | 
|  ![\[2\]](http://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/dg/images/callouts/2.png) | 客户端针对密钥采用一种哈希算法，以确定哪一个缓存节点包含数据项。 | 
|  ![\[3\]](http://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/dg/images/callouts/3.png) | 数据项是从相关节点处请求的。 | 
|  ![\[4\]](http://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/dg/images/callouts/4.png) | 数据项会返还至应用程序。 | 

## 其他操作
<a name="AutoDiscovery.HowAutoDiscoveryWorks.OtherOps"></a>

在某些情况下，您可能会更改集群的节点。例如，您可以添加附加节点来满足其他需求，或者删除节点以在需求减少期间节省资金。或者，您可能会因某种或另一种节点故障而替换节点。

当集群中发生需要对集群的终端节点进行元数据更新的更改时，将同时对所有节点进行此更改。因此，任何给定节点中的元数据将与集群中的所有其他节点中的元数据保持一致。

在所有这些情况下，元数据在所有节点间始终保持一致，因为将同时为集群中的所有节点更新元数据。您应始终使用配置终端节点来获取集群中各个节点的终端节点。通过使用配置终端节点，可确保您不会从对您“不可见”的节点获取终端节点数据。

### 添加节点
<a name="AutoDiscovery.HowAutoDiscoveryWorks.OtherOps.AddNode"></a>

在启动节点的过程中，节点的终端节点不包含在元数据中。一旦该节点可用，就会将它添加到集群的每个节点的元数据中。在此方案中，元数据在所有节点间保持一致，并且您仅在新节点可用后能够与之交互。在节点可用之前，您不会知道该节点，并且您将与集群中的节点进行交互，就好像新节点不存在一样。

### 删除节点
<a name="AutoDiscovery.HowAutoDiscoveryWorks.OtherOps.DelNode"></a>

在删除某个节点时，先从元数据中删除该节点的终端节点，然后从集群中删除该节点。在此方案中，所有节点中的元数据保持一致，如果要删除的节点不可用，则任何时候元数据都不会包含该节点的终端节点。在删除节点期间，将不会在元数据中进行报告，您的应用程序仅与其余 n-1 个节点进行交互，就好像该节点不存在一样。

### 替换节点
<a name="AutoDiscovery.HowAutoDiscoveryWorks.OtherOps.ReplaceNode"></a>

如果某个节点失败，ElastiCache 将中断该节点并启动替换节点。替换过程需要花费几分钟的时间。在此期间，所有节点中的元数据仍将显示失败节点的终端节点，但任何尝试与该节点进行交互的操作都将失败。因此，您的逻辑应始终包含重试逻辑。