AWSは先日、オープンソースクライアントライブラリ、Valkey General Language Independent Driver for Enterprise(GLIDE)のバージョン1.2にアベイラビリティゾーン(AZ) 認識機能を導入した。今回のキーバリュー型オープンソースデータストアへのアベイラビリティゾーンのアフィニティルーティングの実装でクライアントと同じアベイラビリティゾーンのレプリカにリクエストが送信されるようになった。このため、開発者によるレイテンシーとコストの削減が可能になった。
Valkey GLIDEは、ValkeyとRedis OSS向けに設計されたオープンソースの多言語クライアントライブラリである。昨年の夏にAWSチームによってリリースされており、Rust言語を使用している。Valkey 8では "availability-zone"設定が導入され、クライアントが各Valkeyサーバのアベイラビリティゾーンを指定できるようになった。
/filters:no_upscale()/news/2025/02/valkey-glide-az-affinity-routing/en/resources/1DBBLOG-4254-img1-1738744208214.png)
出典: AWS公式 ブログ
現在GLIDEでは、3つのルーティング設定をサポートしている。 PREFER_REPLICA設定では、クライアントは読み込み元としてすべてのレプリカが利用できる。たいして、PRIMARY設定では、常に読み込み元をプライマリレプリカに制限することでデータの鮮度が確保されている。新しいAZ_AFFINITY設定では、クライアントと同じアベイラビリティゾーン内にあるレプリカからコマンドを読み込む指示がクライアントに送信される。AWSのソフトウェア開発マネージャーであるAsaf Porat Stoler氏と、AWSのソフトウェアエンジニアであるAdar Guma Ovadya氏は以下のように記している。
Valkey 8では、アベイラビリティゾーン設定が導入され、クライアントが各Valkeyサーバのアベイラビリティゾーンを指定できるようになりました。GLIDEではこの新しい設定を利用して、ユーザーにアベイラビリティーゾーンのアフィニティルーティングの機能を提供します。本稿執筆時点で、GLIDEはアベイラビリティーゾーンのアフィニティ設定をサポートする唯一のValkeyクライアントライブラリという、他にない利点を提供しています。
/filters:no_upscale()/news/2025/02/valkey-glide-az-affinity-routing/en/resources/1AZ_AFFINITY_strategy-1738744208214.png)
出典: Valkey ブログ
アベイラビリティーゾーンのアフィニティルーティングアルゴリズムから得られる重要な利点は2つある。データ転送コストを削減する点(クラウド環境ではゾーン間転送に追加料金が発生することが多い)と同一リージョンにあるアベイラビリティゾーン間のレイテンシを最小化し、アプリケーションの応答性を向上させる点だ。Stoler氏とOvadya氏は、こうしたコスト削減について、下記の例を交えて説明している。
AWSのValkeyクラスタに、プライマリシャード1つとレプリカシャード2つを保持したシャードが2つあるとしましょう。インスタンスタイプはm7g.xlargeとします。例を簡単にするために、クラスタのデータを処理は毎秒250MBであり、トラフィックの100%が読み取り処理だとします。トラフィック全体の50%がアベイラビリティゾーン間を転送され、1GBあたりのコストが0.01ドルであるため、ひと月あたりのアベイラビリティゾーン間のデータ転送コストは約3,285ドルとなります。これに加えて、クラスタ転送を行う場合のコストは1時間あたり0.252ドルであり、各ノードごとにコストが発生します。クラスタ転送のコスト合計は、ひと月当たり1,088ドルです。アベイラビリティゾーンのアフィニティルーティングを実装すれば、すべてのトラフィックが同じアベイラビリティゾーン内で完結できるため、トータルコストを4,373ドルから1,088ドルに削減できます。
特定の言語によって設定が異なるため、まずはValkeyノードに対応したアベイラビリティゾーンを設定する必要がある。 以下は、Javaを使用する場合の例である。
client.configSet(Map.of("availability-zone", az), new ByAddressRoute("address.example.com", 6379))
次のステップで、アベイラビリティゾーン固有のターゲットが有効になったGLIDEのインスタンスを生成する。
GlideClusterClientConfiguration config = GlideClusterClientConfiguration.builder()
.address(NodeAddress.builder()
.host("address.example.com")
.port(6379)
.build())
.readFrom(ReadFrom.AZ_AFFINITY)
.clientAZ("us-east-1a")
.build()
GlideClusterClient client = GlideClusterClient.createClient(config).get();