IPv6 用戶端範例 - Amazon ElastiCache

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

IPv6 用戶端範例

注意

本節適用於自行設計的 Memcached 叢集。

ElastiCache 與開源內存兼容。這表示支援 IPv6 連線的 Memcached 開放原始碼用戶端應該能夠連線到啟用 IPv6 ElastiCache (記憶體快取) 叢集。此外,下列用戶端已經過特別驗證,可與所有受支援的網路類型組態搭配使用:

以下是與常用的開源客戶端庫 IPv6 啟用 ElastiCache 資源進行交互的最佳實踐。您可以檢視與互動的現有最佳做法,以 ElastiCache取得設定 ElastiCache 資源用戶端的建議。但是,與啟用 IPv6 的資源互動時,需注意一些事項。

已驗證的用戶端

已驗證的用戶端:

設定雙堆疊叢集的偏好通訊協定

針對 Memcached 叢集,您可以使用 IP 探索參數,控制用戶端用來連線至叢集中節點的通訊協定。IP 探索參數可以設為 IPv4 或 IPv6。

IP 探索參數可控制設定取得叢集輸出中使用的 IP 通訊協定。這反過來將確定支持 ElastiCache (Memcached)集群的自動發現的客戶端使用的 IP 協議。

變更 IP 探索不會導致連線用戶端停機。但是,該變更需要一些傳播時間。

監控 Java 的 getAvailableNodeEndPoints 輸出,針對 Php 則監控 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 通訊協定沒有影響。反之,用戶端在解析 DNS 主機名稱時,偏好使用的 IP 通訊協定會決定所用的 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 叢集的 DNS 請求。

Linux 主機

針對 Linux,可以透過修改 gai.conf 檔案,設定 IP 通訊協定偏好設定。您可以在 /etc/gai.conf 下找到 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.conf 的相關資訊,請前往 Linux 主頁

Windows 主機

Windows 主機的程序十分類似。針對 Windows 主機,您可以執行 netsh interface ipv6 set prefix CIDR_CONTAINING_CLUSTER_IPS PRECEDENCE LABEL。此操作與在 Linux 主機上修改 gai.conf 檔案的效果相同。

這會更新偏好設定政策,使其在指定的 CIDR 範圍內偏好 IPv4 連線而非 IPv6 連線。例如,若叢集位於具執行 netsh interface ipv6 set prefix ::ffff:172.31.0.0:0/112 100 15 的 172.31.0.0:0/16 CIDR 子網路中,則會產生下列優先順序表格,導致用戶端在連線至叢集時偏好 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