Leader-basiertes Routing

Auf dieser Seite wird das Leader-fähige Routing in Cloud Spanner und seine Verwendung beschrieben. Cloud Spanner verwendet das Leader-fähige Routing, um Lese-Schreib-Transaktionen in biregionalen und multiregionalen Instanzkonfigurationen dynamisch weiterzuleiten, um die Latenz zu verringern und die Leistung in Ihrer Datenbank zu verbessern. Das Leader-fähige Routing ist standardmäßig aktiviert.

Cloud Spanner-Routing für Lese-Schreib-Transaktionen

Cloud Spanner repliziert Daten, um die Datenverfügbarkeit und geografische Nähe zu erhöhen. In biregionalen und multiregionalen Instanzkonfigurationen von Cloud Spanner ist eine Region in der biregionalen und multiregionalen Instanzkonfiguration als führende Region festgelegt. Sie enthält die Leader-Replikate der Datenbank. Wenn Sie eine biregionale oder multiregionale Instanzkonfiguration verwenden und Ihr Client eine Lese-Schreib-Transaktion aus einer Nicht-führenden Region an Ihre Datenbank sendet, wird der Schreibvorgang immer in der führenden Region verarbeitet und dann an die Nicht-führende Region zurückgesendet. Daher sind für Lese-Schreib-Transaktionen, die aus einer Nicht-Leader-Region übertragen werden, mehrere Roundtrips zum Leader-Replikat erforderlich, damit sie erfolgreich übertragen werden können.

Das Leader-fähige Routing ist ein Mechanismus, der die Latenz für Lese-Schreib-Transaktionen durch intelligentes Routing dieser Transaktionen verbessert. Wenn das Leader-fähige Routing aktiviert ist, werden die Anfragen zur Sitzungserstellung an die führende Region weitergeleitet, auch wenn der Schreibvorgang nicht aus der führenden Region stammt. So wird das Cloud Spanner API-Frontend an die führende Region angepasst. Dieser Routingmechanismus verbessert die Latenz für Lese-Schreib-Transaktionen, indem die Anzahl der erforderlichen Netzwerk-Roundtrips zwischen der Nicht-Leader-Region (in der sich die Clientanwendung befindet) und der Leader-Region auf zwei reduziert wird.

Screenshot von Spanner-Routing mit aktiviertem „Leader-aware-routing“ Abbildung 1 Beispiel für das Cloud Spanner-Routing mit aktiviertem Leader-fähigem Routing.

Wenn das Leader-fähige Routing deaktiviert ist, leitet die Clientanwendung die Anfrage zuerst an einen Cloud Spanner API-Frontend-Dienst in der Region der Clientanwendung (Nicht-Leader-Region) weiter. Anschließend werden vom Spanner API-Frontend in der Region der Clientanwendung drei oder mehr Roundtrips zum Spanner-Server (SpanServer) in der führenden Region ausgeführt, um den Schreibvorgang zu übertragen, was die Latenz erhöht. Diese zusätzlichen Roundtrips sind erforderlich, um sekundäre Indexe, Einschränkungsprüfungen und das Lesen Ihrer Schreibvorgänge zu unterstützen.

Screenshot von Spanner-Routing mit deaktiviertem „Leader-aware-Routing“ Abbildung 2. Beispiel für das Cloud Spanner-Routing mit deaktiviertem Leader-fähigem Routing.

Anwendungsfälle

Durch die Verwendung des Leader-fähigen Routings profitieren die folgenden Anwendungsfälle von einer geringeren Latenz:

  • Massenaktualisierungen: Dataflow-Importe ausführen oder Hintergrund änderungen (z. B. Batch-DMLs) aus einer Nicht-Leader-Region ausführen.
  • Notfallwiederherstellung und erhöhte Verfügbarkeit: Clientanwendungen sowohl in Leader- als auch in Nicht-Leader-Regionen bereitstellen, um regionale Ausfälle zu tolerieren und gleichzeitig Schreibvorgänge aus Nicht-Leader-Regionen zu initiieren.
  • Globale Anwendung: Clientanwendungen weltweit mit weit verbreiteten Regionen bereitstellen, die Daten übertragen.

Beschränkungen

Wenn Ihre Clientanwendung außerhalb der führenden Region bereitgestellt wird und Sie Werte schreiben, ohne die Daten zu lesen („Blind Writes“), kann es zu einer Latenzregression kommen, wenn das Leader-fähige Routing aktiviert ist. Das liegt daran, dass bei aktiviertem Leader-fähigem Routing zwei regionsübergreifende Roundtrips (beginTransaction und die commit-Anfrage) zwischen der Clientanwendung in der Nicht-Leader-Region und dem Cloud Spanner API-Frontend in der Leader-Region stattfinden. Wenn das Leader-fähige Routing jedoch deaktiviert ist, sind für Schreibvorgänge ohne Lesevorgänge nur ein regionsübergreifender Hin- und Rückflug für die commit-Anfrage erforderlich (beginTransaction wird im lokalen Cloud Spanner API-Frontend verarbeitet). Wenn Sie beispielsweise Daten in eine neu erstellte Tabelle im Bulk-Verfahren laden, lesen die Transaktionen wahrscheinlich keine Daten aus der Tabelle. Wenn Sie häufig Schreibvorgänge übertragen, ohne sie in Ihrer Anwendung zu lesen, sollten Sie das Leader-fähige Routing deaktivieren. Weitere Informationen finden Sie unter Leader-fähiges Routing deaktivieren.

Leader-fähiges Routing verwenden

Das Leader-fähige Routing ist in den Cloud Spanner-Clientbibliotheken standardmäßig aktiviert.

Wir empfehlen, Ihre Lese-Schreib-Anfragen mit aktiviertem Leader-fähigem Routing zu verarbeiten. Sie können es deaktivieren, um Leistungsunterschiede zu vergleichen.

Leader-fähiges Routing aktivieren

Sie können das Leader-fähige Routing manuell mit den Cloud Spanner-Clientbibliotheken aktivieren.

C++

Verwenden Sie die RouteToLeaderOption Struktur, um Ihre Clientanwendung mit aktiviertem Leader-fähigem Routing zu konfigurieren:

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#

Verwenden Sie EnableLeaderRouting , um Ihre Clientanwendung mit aktiviertem Leader-fähigem Routing zu konfigurieren:

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

Go

Verwenden Sie ClientConfig um Ihre Clientanwendung mit aktiviertem Leader-fähigem Routing zu konfigurieren:

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

Verwenden Sie SpannerOptions.Builder , um Ihre Clientanwendung mit aktiviertem Leader-fähigem Routing zu konfigurieren:

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

Node.js

Verwenden Sie SpannerOptions , um Ihre Clientanwendung mit aktiviertem Leader-fähigem Routing zu konfigurieren:

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

PHP

Verwenden Sie routeToLeader, um Ihre Clientanwendung mit aktiviertem Leader-fähigem Routing zu konfigurieren:

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

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

Python

Verwenden Sie route_to_leader_enabled , um Ihre Clientanwendung mit aktiviertem Leader-fähigem Routing zu konfigurieren:

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

Ruby

Verwenden Sie self.new um Ihre Clientanwendung mit aktiviertem Leader-fähigem Routing zu konfigurieren:

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

Leader-fähiges Routing deaktivieren

Sie können das Leader-fähige Routing mit den Cloud Spanner-Clientbibliotheken deaktivieren.

C++

Verwenden Sie die RouteToLeaderOption Struktur, um Ihre Clientanwendung mit deaktiviertem Leader-fähigem Routing zu konfigurieren:

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#

Verwenden Sie EnableLeaderRouting , um Ihre Clientanwendung mit deaktiviertem Leader-fähigem Routing zu konfigurieren:

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

Go

Verwenden Sie ClientConfig um Ihre Clientanwendung mit deaktiviertem Leader-fähigem Routing zu konfigurieren:

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

Verwenden Sie SpannerOptions.Builder , um eine Verbindung zu einer Cloud Spanner-Datenbank mit deaktiviertem Leader -fähigem Routing herzustellen:

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

Node.js

Verwenden Sie SpannerOptions , um Ihre Clientanwendung mit deaktiviertem Leader-fähigem Routing zu konfigurieren:

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

PHP

Verwenden Sie routeToLeader, um Ihre Clientanwendung mit deaktiviertem Leader-fähigem Routing zu konfigurieren:

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

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

Python

Verwenden Sie route_to_leader_enabled , um Ihre Clientanwendung mit deaktiviertem Leader-fähigem Routing zu konfigurieren:

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

Ruby

Verwenden Sie self.new um Ihre Clientanwendung mit deaktiviertem Leader-fähigem Routing zu konfigurieren:

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

Nächste Schritte