IPv6 客户端示例 - Amazon ElastiCache
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

IPv6 客户端示例

注意

此部分适用于自行设计的 Memcached 集群。

ElastiCache 与开源 Memcached 兼容。这意味着支持 IPv6 连接的 Memcached 开源客户端应该能够连接到为 Memcached 集群启用 ElastiCache 的 IPv6。此外,以下客户端经过专门验证,可与所有支持的网络类型配置配合使用:

以下是使用常用的开源客户端库与支持 IPv6 的 ElastiCache 资源进行交互的最佳实践。您可以查看与交互的现有最佳实践, ElastiCache以获取有关为 ElastiCache 资源配置客户端的建议。但是,在与启用 IPv6 的资源进行交互时,有一些注意事项值得注意。

经过验证的客户端

经过验证的客户端:

为双堆栈集群配置首选协议

对于 Memcached 集群,您可以使用 IP 发现参数控制客户端将用于连接到集群中的节点的协议。IP 发现参数可以设置为 IPv4 或 IPv6。

IP 发现参数控制 config get 集群输出中使用的 IP 协议。这反过来又将决定支持自动发现 Memcached 集群的客户端使用 ElastiCache 的 IP 协议。

更改 IP 发现不会导致连接的客户端出现任何停机。但是,更改需要一些时间才能传播。

监视适用于 Java 和 Php 的 getAvailableNodeEndPoints 的输出,并监视 getServerList 的输出。一旦这些函数的输出报告了集群中使用更新协议的所有节点的 IP,更改即已完成传播。

Java 示例:

MemcachedClient client = new MemcachedClient(new InetSocketAddress("xxxx", 11211)); Class targetProtocolType = Inet6Address.class; // Or Inet4Address.class if you're switching to IPv4 Set<String> nodes; do { nodes = client.getAvailableNodeEndPoints().stream().map(NodeEndPoint::getIpAddress).collect(Collectors.toSet()); Thread.sleep(1000); } while (!nodes.stream().allMatch(node -> { try { return finalTargetProtocolType.isInstance(InetAddress.getByName(node)); } catch (UnknownHostException ignored) {} return false; }));

Php 示例:

$client = new Memcached; $client->setOption(Memcached::OPT_CLIENT_MODE, Memcached::DYNAMIC_CLIENT_MODE); $client->addServer("xxxx", 11211); $nodes = []; $target_ips_count = 0; do { # The PHP memcached client only updates the server list if the polling interval has expired and a # command is sent $client->get('test'); $nodes = $client->getServerList(); sleep(1); $target_ips_count = 0; // For IPv4 use FILTER_FLAG_IPV4 $target_ips_count = count(array_filter($nodes, function($node) { return filter_var($node["ipaddress"], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6); })); } while (count($nodes) !== $target_ips_count);

在 IP 发现更新之前创建的任何现有客户端连接仍将使用旧协议进行连接。一旦在集群发现命令的输出中检测到更改,所有经过验证的客户端都将使用新的 IP 协议自动重新连接到集群。但是,这取决于客户端的实现。

启用 TLS 的双堆栈 ElastiCache 集群

为 ElastiCache 集群启用 TLS 后,集群发现功能将config get cluster返回主机名而不是 IP。然后使用主机名而不是 IP 来连接到 ElastiCache 集群并执行 TLS 握手。这意味着客户端不会受到 IP 发现参数的影响。对于启用 TLS 的集群,IP 发现参数对首选 IP 协议没有影响。相反,使用的 IP 协议将取决于客户端在解析 DNS 主机名时首选的 IP 协议。

Java 客户端

从同时支持 IPv4 和 IPv6 的 Java 环境进行连接时,为了实现向后兼容,Java 默认情况下会优先使用 IPv4 而不是 IPv6。但是,IP 协议首选项可通过 JVM 参数进行配置。要首选 IPv4,JVM 会接受 -Djava.net.preferIPv4Stack=true 并首选 IPv6 集 -Djava.net.preferIPv6Stack=true。设置 -Djava.net.preferIPv4Stack=true 意味着 JVM 将不再建立任何 IPv6 连接。

主机级别首选项

通常,如果客户端或客户端运行时系统不提供用于设置 IP 协议首选项的配置选项,则在执行 DNS 解析时,IP 协议将取决于主机的配置。默认情况下,大多数主机更喜欢 IPv6 而不是 IPv4,但可以在主机级别配置此首选项。这将影响来自该主机的所有 DNS 请求,而不仅仅是对 ElastiCache 群集的请求。

Linux 主

对于 Linux,可以通过修改gai.conf文件来配置 IP 协议首选项。可以在下方找到该gai.conf文件/etc/gai.conf。如果未gai.conf指定,则应提供一个示例/usr/share/doc/glibc-common-x.xx/gai.conf,可以在其下复制到,/etc/gai.conf然后应取消注释默认配置。要将配置更新为在连接到集群时首选 IPv4,请将包含 ElastiCache 集群 IP 的 CIDR 范围的优先级更新为高于默认 IPv6 连接的优先级。默认情况下,IPv6 连接的优先级为 40。例如,假设集群位于 CIDR 172.31.0.0:0/16 的子网中,则以下配置将导致客户端优先使用该集群的 IPv4 连接。

label ::1/128 0 label ::/0 1 label 2002::/16 2 label ::/96 3 label ::ffff:0:0/96 4 label fec0::/10 5 label fc00::/7 6 label 2001:0::/32 7 label ::ffff:172.31.0.0/112 8 # # This default differs from the tables given in RFC 3484 by handling # (now obsolete) site-local IPv6 addresses and Unique Local Addresses. # The reason for this difference is that these addresses are never # NATed while IPv4 site-local addresses most probably are. Given # the precedence of IPv6 over IPv4 (see below) on machines having only # site-local IPv4 and IPv6 addresses a lookup for a global address would # see the IPv6 be preferred. The result is a long delay because the # site-local IPv6 addresses cannot be used while the IPv4 address is # (at least for the foreseeable future) NATed. We also treat Teredo # tunnels special. # # precedence <mask> <value> # Add another rule to the RFC 3484 precedence table. See section 2.1 # and 10.3 in RFC 3484. The default is: # precedence ::1/128 50 precedence ::/0 40 precedence 2002::/16 30 precedence ::/96 20 precedence ::ffff:0:0/96 10 precedence ::ffff:172.31.0.0/112 100

有关更多详细信息可gai.confLinux 主页上找到

微软主机

Windows 主机的过程与此类似。对于 Windows 主机,你可以运行netsh interface ipv6 set prefix CIDR_CONTAINING_CLUSTER_IPS PRECEDENCE LABEL。这与修改 Linux 主机上的gai.conf文件效果相同。

这将更新优先级策略,使指定的 CIDR 范围优先于 IPv4 连接而不是 IPv6 连接。例如,假设群集位于子网中,执行 172.31.0.0:0/16 CIDRnetsh interface ipv6 set prefix ::ffff:172.31.0.0:0/112 100 15 将生成以下优先级表,这将导致客户端在连接到集群时首选 IPv4。

C:\Users\Administrator>netsh interface ipv6 show prefixpolicies Querying active state... Precedence Label Prefix ---------- ----- -------------------------------- 100 15 ::ffff:172.31.0.0:0/112 20 4 ::ffff:0:0/96 50 0 ::1/128 40 1 ::/0 30 2 2002::/16 5 5 2001::/32 3 13 fc00::/7 1 11 fec0::/10 1 12 3ffe::/16 1 3 ::/96