IPv6 客户端示例 - Amazon ElastiCache

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

IPv6 客户端示例

注意

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

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

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

经过验证的客户端

经过验证的客户端:

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

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

IP 发现参数控制 config get 集群输出中使用的 IP 协议。这反过来又将决定支持自动发现 ElastiCache (Memcached)集群的客户端使用的 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