리더 인식 라우팅

이 페이지에서는 Spanner의 리더 인식 라우팅과 사용 방법을 설명합니다. Spanner는 리더 인식 라우팅을 사용하여 멀티 리전 인스턴스 구성에서 읽기-쓰기 트랜잭션을 동적으로 라우팅하여 지연 시간을 줄이고 데이터베이스의 성능을 개선합니다. 리더 인식 라우팅은 기본적으로 사용 설정됩니다.

읽기-쓰기 트랜잭션을 위한 Spanner 라우팅

Spanner는 데이터를 복제하여 데이터 가용성 및 지리적 위치를 추가로 제공합니다. Spanner 멀티 리전 인스턴스 구성에서는 멀티 리전 인스턴스 구성의 리전 하나가 리더 리전으로 지정되며 이 리전에 리더 복제본이 포함됩니다. 멀티 리전 인스턴스 구성을 사용하고 클라이언트가 리더가 아닌 리전에서 데이터베이스에 읽기-쓰기 트랜잭션을 실행하면 쓰기가 항상 리더 리전에서 처리된 후 리더가 아닌 리전으로 다시 전송됩니다. 따라서 리더가 아닌 리전에서 커밋된 읽기-쓰기 트랜잭션은 성공적으로 커밋되려면 리더 복제본으로 여러 번 왕복해야 합니다.

리더 인식 라우팅은 이러한 트랜잭션을 지능적으로 라우팅하여 읽기-쓰기 트랜잭션의 지연 시간을 개선하는 메커니즘입니다. 리더 인식 라우팅이 사용 설정된 경우 쓰기가 리더 리전에서 발생하지 않더라도 세션 생성 요청이 리더 리전으로 라우팅되어 Spanner 프런트엔드(SpanFE)를 리더 리전에 일치시킵니다. 이러한 라우팅 메커니즘은 리더가 아닌 리전(클라이언트 애플리케이션이 있는 위치)과 리더 리전 간에 필요한 네트워크 왕복 횟수를 2회로 줄여 읽기-쓰기 트랜잭션의 지연 시간을 개선합니다.

리더 인식 라우팅이 사용 설정된 Spanner 라우팅 스크린샷 그림 1. 리더 인식 라우팅이 사용 설정된 Spanner 라우팅의 예시

리더 인식 라우팅이 사용 중지되면 클라이언트 애플리케이션은 먼저 클라이언트 애플리케이션 리전(리더가 아닌 리전) 내의 SpanFE 서비스로 요청을 라우팅합니다. 그런 다음 클라이언트 애플리케이션 리전의 SpanFE에서 리더 리전의 Spanner 서버(SpanServer)로 3회 이상의 왕복이 수행되어 쓰기를 커밋하여 지연 시간이 늘어납니다. 보조 색인, 제약조건 확인, 작성한 항목 읽기를 지원하려면 이러한 추가 왕복이 필요합니다.

리더 인식 라우팅이 사용 중지된 Spanner 라우팅 스크린샷 그림 2. 리더 인식 라우팅이 사용 중지된 Spanner 라우팅의 예시

사용 사례

리더 인식 라우팅을 사용하면 다음 사용 사례에서 지연 시간이 단축됩니다.

  • 일괄 업데이트: 리더가 아닌 리전에서 Dataflow 가져오기를 실행하거나 백그라운드 변경사항 (예: 일괄 DML) 실행
  • 재해 내결함성 및 가용성 향상: 리더가 아닌 리전에서 쓰기를 시작하는 동안 리전 서비스 중단을 견디도록 리더 리전과 리더가 아닌 리전 모두에 클라이언트 애플리케이션을 배포
  • 전역 애플리케이션: 데이터를 커밋하는 광범위한 리전 위치를 사용하여 클라이언트 애플리케이션을 전역에 배포

제한사항

클라이언트 애플리케이션이 리더 리전 외부에 배포되고 데이터를 읽지 않고 값을 쓰는 경우('블라인드 쓰기') 리더 인식 라우팅이 사용 설정되면 지연 시간 회귀가 발생할 수 있습니다. 이는 리더 인식 라우팅이 사용 설정된 경우 리더가 아닌 리전의 클라이언트 애플리케이션과 리더 리전의 SpanFE 간에 두 번의 리전 간 왕복(beginTransactioncommit 요청)이 있기 때문입니다. 하지만 리더 인식 라우팅이 사용 중지되면 읽기 없는 쓰기에서는 commit 요청에 대해 한 번의 리전 간 왕복만 필요합니다(beginTransaction은 로컬 SpanFE에서 처리됨). 예를 들어 파일 데이터를 새로 만든 테이블에 일괄 로드하면 트랜잭션이 테이블에서 데이터를 읽을 가능성이 낮습니다. 애플리케이션에서 읽기 없이 쓰기 작업을 자주 커밋하는 경우 리더 인식 라우팅을 사용 중지하는 것이 좋습니다. 자세한 내용은 리더 인식 라우팅 사용 중지를 참조하세요.

리더 인식 라우팅 사용

리더 인식 라우팅은 기본적으로 Spanner 클라이언트 라이브러리에서 사용 설정됩니다.

리더 인식 라우팅이 사용 설정된 읽기-쓰기 요청을 처리하는 것이 좋습니다. 이를 사용 중지하여 성능 차이를 비교할 수 있습니다.

리더 인식 라우팅 사용 설정

Spanner 클라이언트 라이브러리를 사용하여 리더 인식 라우팅을 수동으로 사용 설정할 수 있습니다.

C++

RouteToLeaderOption 구조를 사용하여 리더 인식 라우팅이 사용 설정된 클라이언트 애플리케이션을 구성합니다.

void RouteToLeaderOption(std::string const& project_id, std::string const& instance_id,
              std::string const& database_id) {
namespace spanner = ::google::cloud::spanner;

// Create a client with RouteToLeaderOption enabled.
auto client = spanner::Client(
  spanner::MakeConnection(
      spanner::Database(project_id, instance_id, database_id)),
  google::cloud::Options{}.set<spanner::RouteToLeaderOption>(
      spanner::true));

C#

EnableLeaderRouting를 사용하여 리더 인식 라우팅이 사용 설정된 클라이언트 애플리케이션을 구성합니다.

// Create a client with leader-aware routing enabled.
SpannerConnectionStringBuilder builder = new
SpannerConnectionStringBuilder();
Builder.EnableLeaderRouting = true;

Go

ClientConfig를 사용하여 리더 인식 라우팅이 사용 설정된 클라이언트 애플리케이션을 구성합니다.

type ClientConfig struct {
    // DisableRouteToLeader specifies if all the requests of type read-write
    // and PDML need to be routed to the leader region.
    // Default: false
    DisableRouteToLeader false
}

자바

SpannerOptions.Builder를 사용하여 리더 인식 라우팅이 사용 설정된 클라이언트 애플리케이션을 구성합니다.

SpannerOptions options = SpannerOptions.newBuilder().enableLeaderAwareRouting.build();
Spanner spanner = options.getService();
String instance = "my-instance";
String database = "my-database";

Node.js

SpannerOptions를 사용하여 리더 인식 라우팅이 사용 설정된 클라이언트 애플리케이션을 구성합니다.

// Instantiates a client with routeToLeaderEnabled enabled
const spanner = new Spanner({
projectId: projectId,
routeToLeaderEnabled: true;
});

PHP

routeToLeader를 사용하여 리더 인식 라우팅이 사용 설정된 클라이언트 애플리케이션을 구성합니다.

// Instantiates a client with leader-aware routing enabled
use Google\Cloud\Spanner\SpannerClient;

$routeToLeader = true;
$spanner = new SpannerClient($routeToLeader);

Python

route_to_leader_enabled를 사용하여 리더 인식 라우팅이 사용 설정된 클라이언트 애플리케이션을 구성합니다.

spanner_client = spanner.Client(
route_to_leader_enabled=true
)
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)

Ruby

self.new를 사용하여 리더 인식 라우팅이 사용 설정된 클라이언트 애플리케이션을 구성합니다.

def self.new(project_id: nil, credentials: nil, scope: nil, timeout: nil,
     endpoint: nil, project: nil, keyfile: nil, emulator_host: nil,
    lib_name: nil, lib_version: nil, enable_leader_aware_routing: true) ->
    Google::Cloud::Spanner::Project

리더 인식 라우팅 사용 중지

Spanner 클라이언트 라이브러리를 사용하여 리더 인식 라우팅을 사용 중지할 수 있습니다.

C++

RouteToLeaderOption 구조를 사용하여 리더 인식 라우팅이 중지된 클라이언트 애플리케이션을 구성합니다.

void RouteToLeaderOption(std::string const& project_id, std::string const& instance_id,
              std::string const& database_id) {
namespace spanner = ::google::cloud::spanner;

// Create a client with RouteToLeaderOption disabled.
auto client = spanner::Client(
  spanner::MakeConnection(
      spanner::Database(project_id, instance_id, database_id)),
  google::cloud::Options{}.set<spanner::RouteToLeaderOption>(
      spanner::false));

C#

EnableLeaderRouting를 사용하여 리더 인식 라우팅이 사용 중지된 클라이언트 애플리케이션을 구성합니다.

// Create a client with leader-aware routing disabled.
SpannerConnectionStringBuilder builder = new
SpannerConnectionStringBuilder();
Builder.EnableLeaderRouting = false;

Go

ClientConfig를 사용하여 리더 인식 라우팅이 사용 중지된 클라이언트 애플리케이션을 구성합니다.

type ClientConfig struct {
    // DisableRouteToLeader specifies if all the requests of type read-write
    // and PDML need to be routed to the leader region.
    // Default: false
    DisableRouteToLeader true
}

자바

SpannerOptions.Builder를 사용하여 리더 인식 라우팅이 사용 중지된 Spanner 데이터베이스에 대한 연결을 만듭니다.

SpannerOptions options = SpannerOptions.newBuilder().disableLeaderAwareRouting.build();
Spanner spanner = options.getService();
String instance = "my-instance";
String database = "my-database";

Node.js

SpannerOptions를 사용하여 리더 인식 라우팅이 사용 중지된 클라이언트 애플리케이션을 구성합니다.

// Instantiates a client with routeToLeaderEnabled disabled
const spanner = new Spanner({
projectId: projectId,
routeToLeaderEnabled: false;
});

PHP

routeToLeader를 사용하여 리더 인식 라우팅이 사용 중지된 클라이언트 애플리케이션을 구성합니다.

// Instantiates a client with leader-aware routing disabled
use Google\Cloud\Spanner\SpannerClient;

$routeToLeader = false;
$spanner = new SpannerClient($routeToLeader);

Python

route_to_leader_enabled를 사용하여 리더 인식 라우팅이 사용 중지된 클라이언트 애플리케이션을 구성합니다.

spanner_client = spanner.Client(
route_to_leader_enabled=false
)
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)

Ruby

self.new를 사용하여 리더 인식 라우팅이 사용 중지된 클라이언트 애플리케이션을 구성합니다.

def self.new(project_id: nil, credentials: nil, scope: nil, timeout: nil,
     endpoint: nil, project: nil, keyfile: nil, emulator_host: nil,
    lib_name: nil, lib_version: nil, enable_leader_aware_routing: false) ->
    Google::Cloud::Spanner::Project

다음 단계