Pemilihan rute yang peka terhadap pemimpin

Halaman ini menjelaskan pemilihan rute yang peka terhadap pemimpin di Spanner dan cara menggunakannya. Spanner menggunakan perutean yang peka terhadap pemimpin untuk secara dinamis merutekan transaksi baca-tulis dalam konfigurasi instance multi-region untuk mengurangi latensi dan meningkatkan performa di database Anda. Perutean yang sadar pemimpin diaktifkan secara default.

Pemilihan rute Spanner untuk transaksi baca-tulis

Spanner mereplikasi data untuk memberikan ketersediaan data dan lokalitas geografis tambahan. Dalam konfigurasi instance multi-region Spanner, satu region dalam konfigurasi instance multi-region ditetapkan sebagai region pemimpin dan berisi replika pemimpin dari database. Jika Anda menggunakan konfigurasi instance multi-region dan klien mengeluarkan transaksi baca-tulis ke database Anda dari region non-leader, operasi tulis akan selalu diproses di region pemimpin, lalu dikirim kembali ke region non-leader. Oleh karena itu, transaksi baca-tulis yang dilakukan dari region non-pemimpin memerlukan beberapa perjalanan bolak-balik ke replika pemimpin agar berhasil di-commit.

Perutean yang peka terhadap pemimpin adalah mekanisme yang meningkatkan latensi untuk transaksi baca-tulis dengan mengarahkan transaksi ini secara cerdas. Jika perutean berbasis posisi diaktifkan, meskipun operasi tulis tidak berasal dari wilayah pemimpin, permintaan pembuatan sesi akan dirutekan ke wilayah pemimpin untuk menyelaraskan Spanner Front End (SpanFE) dengan region pemimpin. Mekanisme perutean ini meningkatkan latensi untuk transaksi baca-tulis dengan mengurangi jumlah perjalanan bolak-balik jaringan yang diperlukan antara region non-leader (tempat aplikasi klien berada) dan region pemimpin menjadi dua.

Pemilihan rute Spanner screenshot dengan perutean yang peka terhadap pemimpin diaktifkan. Gambar 1. Contoh pemilihan rute Spanner dengan perutean yang mengenali pemimpin yang diaktifkan.

Jika perutean berbasis pemimpin dinonaktifkan, aplikasi klien akan terlebih dahulu mengarahkan permintaan ke layanan SpanFE dalam region aplikasi klien (region non-posisi pemimpin). Kemudian, dari SpanFE di region aplikasi klien, tiga perjalanan bolak-balik atau lebih dilakukan ke server Spanner (SpanServer) di region pemimpin untuk meng-commit penulisan, sehingga menambah latensi. Round-trip tambahan ini diperlukan untuk mendukung indeks sekunder, pemeriksaan batasan, dan membaca penulisan Anda.

Pemilihan rute Spanner screenshot dengan leader-aware-routing dinonaktifkan. Gambar 2. Contoh pemilihan rute Spanner dengan perutean yang mengenali pemimpin dinonaktifkan.

Kasus penggunaan

Sebagai hasil dari penggunaan perutean yang peka terhadap pemimpin, kasus penggunaan berikut mendapatkan manfaat dari latensi yang lebih rendah:

  • Update massal: Menjalankan impor Dataflow atau menjalankan perubahan latar belakang (misalnya, batch DML) dari region non-leader.
  • Toleransi bencana dan peningkatan ketersediaan: Men-deploy aplikasi klien di region pemimpin dan non-pemimpin untuk menoleransi gangguan regional saat memulai operasi tulis dari region non-pemimpin.
  • Aplikasi global: Men-deploy aplikasi klien secara global dengan lokasi region yang luas yang meng-commit data.

Batasan

Jika aplikasi klien di-deploy di luar region pemimpin dan Anda menulis nilai tanpa membaca data ("blind write"),Anda mungkin mengamati regresi latensi jika perutean yang peka pemimpin diaktifkan. Hal ini karena saat perutean berbasis pemimpin diaktifkan, ada dua perjalanan bolak-balik antar-region (beginTransaction dan permintaan commit) antara aplikasi klien di region non-leader dan SpanFE di region pemimpin. Namun, jika perutean berbasis pemimpin dinonaktifkan, operasi tulis tanpa baca hanya memerlukan satu perjalanan dua arah antar-region untuk permintaan commit (beginTransaction diproses di SpanFE lokal). Misalnya, jika Anda memuat data file secara massal ke dalam tabel yang baru dibuat, transaksi kemungkinan tidak akan membaca data dari tabel. Jika Anda sering melakukan commit operasi tulis tanpa membacanya di aplikasi, sebaiknya pertimbangkan untuk menonaktifkan perutean yang peka pemimpin. Untuk informasi selengkapnya, lihat Menonaktifkan pemilihan rute yang peka pemimpin.

Menggunakan pemilihan rute yang mempertimbangkan pemimpin

Perutean yang peka terhadap pemimpin diaktifkan secara default di library klien Spanner.

Sebaiknya proses permintaan baca-tulis Anda dengan perutean berbasis pemimpin diaktifkan. Anda dapat menonaktifkannya untuk membandingkan perbedaan performa.

Mengaktifkan pemilihan rute yang sadar pemimpin

Anda dapat menggunakan library klien Spanner untuk mengaktifkan perutean yang peka pemimpin secara manual.

C++

Gunakan struktur RouteToLeaderOption untuk mengonfigurasi aplikasi klien Anda dengan mengaktifkan perutean berbasis pemimpin:

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#

Gunakan EnableLeaderRouting untuk mengonfigurasi aplikasi klien Anda dengan mengaktifkan perutean berbasis pemimpin:

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

Go

Gunakan ClientConfig untuk mengonfigurasi aplikasi klien Anda dengan mengaktifkan perutean berbasis pemimpin:

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
}

Java

Gunakan SpannerOptions.Builder untuk mengonfigurasi aplikasi klien Anda dengan mengaktifkan perutean berbasis pemimpin:

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

Node.js

Gunakan SpannerOptions untuk mengonfigurasi aplikasi klien Anda dengan mengaktifkan perutean berbasis pemimpin:

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

PHP

Gunakan routeToLeader untuk mengonfigurasi aplikasi klien Anda dengan mengaktifkan perutean berbasis pemimpin:

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

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

Python

Gunakan route_to_leader_enabled untuk mengonfigurasi aplikasi klien Anda dengan mengaktifkan perutean berbasis pemimpin:

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

Ruby

Gunakan self.new untuk mengonfigurasi aplikasi klien Anda dengan mengaktifkan perutean berbasis pemimpin:

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

Menonaktifkan pemilihan rute yang peka pemimpin

Anda dapat menggunakan library klien Spanner untuk menonaktifkan perutean yang peka pemimpin.

C++

Gunakan struktur RouteToLeaderOption untuk mengonfigurasi aplikasi klien dengan perutean yang peka pemimpin dinonaktifkan:

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#

Gunakan EnableLeaderRouting untuk mengonfigurasi aplikasi klien Anda dengan pemilihan rute yang peka terhadap pemimpin yang dinonaktifkan:

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

Go

Gunakan ClientConfig untuk mengonfigurasi aplikasi klien Anda dengan pemilihan rute yang peka terhadap pemimpin yang dinonaktifkan:

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
}

Java

Gunakan SpannerOptions.Builder untuk membuat koneksi ke database Spanner dengan perutean yang peka pemimpin dinonaktifkan:

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

Node.js

Gunakan SpannerOptions untuk mengonfigurasi aplikasi klien Anda dengan pemilihan rute yang peka terhadap pemimpin yang dinonaktifkan:

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

PHP

Gunakan routeToLeader untuk mengonfigurasi aplikasi klien dengan pemilihan rute yang peka terhadap pemimpin:

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

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

Python

Gunakan route_to_leader_enabled untuk mengonfigurasi aplikasi klien Anda dengan pemilihan rute yang peka terhadap pemimpin yang dinonaktifkan:

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

Ruby

Gunakan self.new untuk mengonfigurasi aplikasi klien Anda dengan pemilihan rute yang peka terhadap pemimpin yang dinonaktifkan:

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

Langkah selanjutnya