읽기 전용 복제본 사용 모범 사례 - Amazon ElastiCache

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

읽기 전용 복제본 사용 모범 사례

세션 스토어, 리더보드, 추천 엔진과 같은 많은 애플리케이션은 고가용성이 필요하며 쓰기 작업보다 훨씬 더 많은 읽기 작업을 처리합니다. 이러한 애플리케이션은 종종 약간 오래된 데이터(일상적 일관성)를 허용할 수 있습니다. 즉, 서로 다른 사용자가 일시적으로 동일한 데이터의 약간 다른 버전을 보는 경우 허용됩니다. 예시:

  • 캐시된 쿼리 결과는 특히 사실의 출처가 외부인 캐시 어사이드 패턴에서 약간 오래된 데이터를 허용할 수 있는 경우가 많습니다.

  • 게임 리더보드에서 업데이트된 점수가 몇 초 지연되더라도 사용자 경험에 큰 영향을 미치지 않는 경우가 많습니다.

  • 세션 스토어의 경우 복제본 간에 세션 데이터를 전파하는 데 약간의 지연이 발생하면 애플리케이션 기능에 거의 영향을 미치지 않습니다.

  • 권장 엔진은 일반적으로 과거 데이터 분석을 사용하므로 실시간 일관성은 덜 중요합니다.

최종 일관성이란 복제 프로세스가 완료되면 일반적으로 밀리초 이내에 모든 복제본 노드가 동일한 데이터를 반환한다는 의미입니다. 이러한 사용 사례에서 읽기 전용 복제본을 구현하는 것은 ElastiCache 인스턴스에서 읽을 때 지연 시간을 줄이는 효과적인 전략입니다.

Amazon ElastiCache에서 읽기 전용 복제본을 사용하면 다음을 통해 상당한 성능 이점을 얻을 수 있습니다.

향상된 읽기 확장성

  • 여러 복제본 노드에 읽기 작업을 분산합니다.

  • 프라이머리 노드에서 읽기 트래픽을 오프로드합니다.

  • 지리적으로 더 가까운 복제본의 요청을 처리하여 읽기 지연 시간 단축

기본 노드 성능 최적화

  • 프라이머리 노드 리소스를 전용하여 작업을 작성합니다.

  • 프라이머리 노드의 연결 오버헤드를 줄입니다.

  • 최대 트래픽 기간 동안 쓰기 성능을 개선하고 더 나은 응답 시간을 유지합니다.

ElastiCache Serverless의 복제본에서 읽기 사용

ElastiCache 서버리스는 서로 다른 일관성 요구 사항에 맞는 두 가지 엔드포인트를 제공합니다. 두 엔드포인트는 동일한 DNS 이름을 사용하지만 포트는 다릅니다. read-from-replica 포트를 사용하려면 VPC의 보안 그룹 및 네트워크 액세스 제어 목록을 구성하여 클라이언트 애플리케이션의 두 포트에 대한 액세스를 승인해야 합니다.

기본 엔드포인트(포트 6379)

  • 즉각적인 일관성이 필요한 작업에 사용

  • up-to-date 데이터 읽기 보장

  • 중요한 트랜잭션 및 쓰기 작업에 가장 적합

  • 쓰기 작업에 필요

  • 예시: test-12345.serverless.use1.cache.amazonaws.com:6379

지연 시간 최적화 엔드포인트(포트 6380)

  • 최종 일관성을 허용할 수 있는 읽기 작업에 최적화됨

  • 가능하면 ElastiCache 서버리스는 클라이언트의 로컬 가용 영역에 있는 복제본 노드로 읽기 요청을 자동으로 라우팅합니다. 이 최적화는 다른 가용 영역의 노드에서 데이터를 검색할 때 발생하는 추가 네트워크 지연 시간을 방지하여 지연 시간을 줄입니다.

  • ElastiCache 서버리스는 로컬 노드를 사용할 수 없는 경우 다른 영역에서 사용 가능한 노드를 자동으로 선택합니다.

  • 예시: test-12345.serverless.use1.cache.amazonaws.com:6380

  • 복제본 구성에서 읽기를 제공하는 경우 Glide 및 Lettuce와 같은 클라이언트는 읽기를 자동으로 감지하여 지연 시간 최적화 엔드포인트로 라우팅합니다. 클라이언트가 라우팅 구성(예: valkey-java 및 이전 jedis 버전)을 지원하지 않는 경우 복제본에서 읽을 올바른 포트 및 클라이언트 구성을 정의해야 합니다.

ElastiCache Serverless의 읽기 전용 복제본에 연결 - Valkey 및 Glide

다음 코드 조각은 Valkey 글라이드 라이브러리에서 ElastiCache Serverless의 복제본에서 읽기를 구성하는 방법을 보여줍니다. 복제본에서 읽기 위한 포트를 지정할 필요는 없지만 라우팅 구성을 구성해야 합니다ReadFrom.PREFER_REPLICA.

package glide.examples; import glide.api.GlideClusterClient; import glide.api.logging.Logger; import glide.api.models.configuration.GlideClusterClientConfiguration; import glide.api.models.configuration.NodeAddress; import glide.api.models.exceptions.ClosingException; import glide.api.models.exceptions.ConnectionException; import glide.api.models.exceptions.TimeoutException; import glide.api.models.configuration.ReadFrom; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; public class ClusterExample { public static void main(String[] args) { // Set logger configuration Logger.setLoggerConfig(Logger.Level.INFO); GlideClusterClient client = null; try { System.out.println("Connecting to Valkey Glide..."); // Configure the Glide Client GlideClusterClientConfiguration config = GlideClusterClientConfiguration.builder() .address(NodeAddress.builder() .host("your-endpoint") .port(6379) .build()) .useTLS(true) .readFrom(ReadFrom.PREFER_REPLICA) .build(); // Create the GlideClusterClient client = GlideClusterClient.createClient(config).get(); System.out.println("Connected successfully."); // Perform SET operation CompletableFuture<String> setResponse = client.set("key", "value"); System.out.println("Set key 'key' to 'value': " + setResponse.get()); // Perform GET operation CompletableFuture<String> getResponse = client.get("key"); System.out.println("Get response for 'key': " + getResponse.get()); // Perform PING operation CompletableFuture<String> pingResponse = client.ping(); System.out.println("PING response: " + pingResponse.get()); } catch (ClosingException | ConnectionException | TimeoutException | ExecutionException e) { System.err.println("An exception occurred: "); e.printStackTrace(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { // Close the client connection if (client != null) { try { client.close(); System.out.println("Client connection closed."); } catch (ClosingException | ExecutionException e) { System.err.println("Error closing client: " + e.getMessage()); } } } } }