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.
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.
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
- Pelajari Konfigurasi regional, dual-region, dan multi-region.
- Pelajari Replikasi.
- Pelajari cara Mengubah region paling dominan dalam database.