Pemilihan rute yang mengetahui posisi teratas

Halaman ini menjelaskan pemilihan rute berbasis leader di Spanner dan cara menggunakannya. Spanner menggunakan perutean berbasis leader untuk merutekan transaksi baca-tulis secara dinamis dalam konfigurasi instance dual-region dan multi-region guna mengurangi latensi dan meningkatkan performa di database Anda. Pemilihan rute berbasis pemimpin diaktifkan secara default.

Pemilihan rute Spanner untuk transaksi baca-tulis

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

Pemilihan rute berbasis leader adalah mekanisme yang meningkatkan latensi untuk transaksi baca-tulis dengan merutekan transaksi ini secara cerdas. Jika perutean berbasis leader diaktifkan, meskipun penulisan tidak berasal dari region leader, permintaan pembuatan sesi akan dirutekan ke region leader untuk menyelaraskan frontend Spanner API dengan region leader. Mekanisme pemilihan rute 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 leader menjadi dua.

Screenshot perutean Spanner dengan perutean berbasis leader diaktifkan. Gambar 1. Contoh perutean Spanner dengan perutean berbasis leader diaktifkan.

Jika pemilihan rute berbasis leader dinonaktifkan, aplikasi klien akan merutekan permintaan terlebih dahulu ke layanan frontend Spanner API dalam region aplikasi klien (region non-leader). Kemudian, dari frontend Spanner API di region aplikasi klien, tiga atau lebih perjalanan pulang pergi dilakukan ke server Spanner (SpanServer) di region leader untuk meng-commit penulisan, sehingga meningkatkan latensi. Perjalanan pulang pergi tambahan ini diperlukan untuk mendukung indeks sekunder, pemeriksaan batasan, dan membaca penulisan Anda.

Screenshot pemilihan rute Spanner dengan leader-aware-routing dinonaktifkan. Gambar 2. Contoh pemilihan rute Spanner dengan perutean berbasis leader dinonaktifkan.

Kasus penggunaan

Sebagai hasil dari penggunaan perutean berbasis leader, kasus penggunaan berikut mendapatkan manfaat dari latensi yang lebih rendah:

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

Batasan

Jika aplikasi klien Anda di-deploy di luar region leader dan Anda menulis nilai tanpa membaca data ("penulisan buta"), Anda mungkin akan mengamati regresi latensi jika pemilihan rute berbasis leader diaktifkan. Hal ini karena saat perutean berbasis leader diaktifkan, ada dua perjalanan pulang pergi antar-region (beginTransaction dan permintaan commit) antara aplikasi klien di region non-leader dan frontend Spanner API di region leader. Namun, jika pemilihan rute berbasis leader dinonaktifkan, penulisan tanpa pembacaan hanya memerlukan satu perjalanan pulang pergi antar-region untuk permintaan commit (beginTransaction diproses di frontend Spanner API lokal). Misalnya, jika Anda memuat data secara massal ke dalam tabel yang baru dibuat, transaksi tidak mungkin membaca data dari tabel. Jika Anda sering melakukan operasi tulis tanpa membacanya di aplikasi, sebaiknya pertimbangkan untuk menonaktifkan pemilihan rute berbasis leader. Untuk mengetahui informasi selengkapnya, lihat Menonaktifkan pemilihan rute berbasis leader.

Menggunakan perutean berbasis pemimpin

Pemilihan rute berbasis leader diaktifkan secara default di library klien Spanner.

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

Pemilihan rute berbasis leader dengan partisi geografis

Saat Anda menggunakan partisi geografis untuk mempartisi database di beberapa penempatan data, Spanner akan mengevaluasi semua konfigurasi instance yang digunakan oleh penempatan database Anda—termasuk penempatan default—saat merutekan permintaan. Spanner memilih frontend Cloud Spanner API yang ditempatkan bersama dengan region penempatan yang terdekat dengan klien. Pilihan ini tidak bergantung pada apakah penempatan tersebut atau datanya digunakan dalam transaksi tertentu. Spanner merutekan transaksi baca-tulis sebagai berikut:

  • Dengan perutean berbasis leader yang diaktifkan: Setiap penempatan memiliki region leader-nya sendiri (atau region leader default untuk konfigurasi dual-region dan multi-region). Spanner merutekan transaksi baca-tulis ke frontend Cloud Spanner API di region leader yang paling dekat dengan klien.
  • Dengan perutean berbasis leader yang dinonaktifkan: Spanner merutekan transaksi baca-tulis ke frontend Cloud Spanner API di region penyajian terdekat di semua penempatan database Anda.

Mengaktifkan perutean berbasis leader

Anda dapat menggunakan library klien Spanner untuk mengaktifkan perutean berbasis leader secara manual.

C++

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

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 pemilihan rute berbasis leader:

// 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 pemilihan rute berbasis leader:

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 pemilihan rute berbasis leader:

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 pemilihan rute berbasis leader:

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

PHP

Gunakan routeToLeader untuk mengonfigurasi aplikasi klien Anda dengan mengaktifkan pemilihan rute berbasis leader:

// 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 pemilihan rute berbasis leader:

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 pemilihan rute berbasis leader:

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 perutean berbasis pemimpin

Anda dapat menggunakan library klien Spanner untuk menonaktifkan pemilihan rute berbasis leader.

C++

Gunakan struktur RouteToLeaderOption untuk mengonfigurasi aplikasi klien Anda dengan perutean berbasis leader yang 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 berbasis leader 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 berbasis leader 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 berbasis leader 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 berbasis leader yang dinonaktifkan:

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

PHP

Gunakan routeToLeader untuk mengonfigurasi aplikasi klien Anda dengan pemilihan rute berbasis leader yang dinonaktifkan:

// 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 berbasis leader 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 berbasis leader 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 berikutnya