Leader-basiertes Routing

Auf dieser Seite wird das Leader-Aware-Routing in Spanner und seine Verwendung beschrieben. Spanner verwendet Leader-fähiges Routing, um Lese-/Schreibtransaktionen in biregionalen und multiregionalen Instanzkonfigurationen dynamisch weiterzuleiten. Dadurch wird die Latenz reduziert und die Leistung Ihrer Datenbank verbessert. Das Leader-Aware-Routing ist standardmäßig aktiviert.

Spanner-Routing für Lese-/Schreibtransaktionen

Spanner repliziert Daten, um zusätzliche Datenverfügbarkeit und geografische Lokalität zu bieten. In biregionalen und multiregionalen Instanzkonfigurationen von Cloud Spanner wird eine Region in der biregionalen und multiregionalen Instanzkonfiguration als Leader-Region festgelegt und enthält die Leader-Replikate der Datenbank. Wenn Sie eine biregionale oder multiregionale Instanzkonfiguration verwenden und Ihr Client eine Lese-/Schreibtransaktion von 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-/Schreibtransaktionen, die von einer Nicht-Leader-Region festgeschrieben werden, mehrere Umläufe zum Leader-Replikat erforderlich, damit sie erfolgreich festgeschrieben werden können.

Leader-Aware Routing ist ein Mechanismus, der die Latenz für Lese-/Schreibtransaktionen durch intelligentes Routing dieser Transaktionen verbessert. Wenn das Leader-Aware-Routing aktiviert ist, werden die Anfragen zur Sitzungserstellung an die Leader-Region weitergeleitet, um das Spanner API-Frontend an die Leader-Region anzupassen, auch wenn der Schreibvorgang nicht aus der Leader-Region stammt. Dieser Routingmechanismus verbessert die Latenz für Lese-/Schreibtransaktionen, da 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 des Spanner-Routings mit aktiviertem Leader-Aware-Routing Abbildung 1. Beispiel für Cloud Spanner-Routing mit aktiviertem Leader-Aware-Routing.

Wenn das Leader-Aware Routing deaktiviert ist, leitet die Clientanwendung die Anfrage zuerst an einen 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 Hin- und Rückflüge zum Spanner-Server (SpanServer) in der führenden Region durchgeführt, um den Schreibvorgang zu bestätigen, 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 des Cloud Spanner-Routings mit deaktiviertem Leader-Aware-Routing. Abbildung 2. Beispiel für Cloud Spanner-Routing mit deaktiviertem Leader-Aware-Routing.

Anwendungsfälle

Durch die Verwendung von Leader-Aware-Routing profitieren die folgenden Anwendungsfälle von einer geringeren Latenz:

  • Bulk-Updates: Ausführen von Dataflow-Importen oder Hintergrundänderungen (z. B. Batch-DMLs) aus einer Nicht-Leader-Region.
  • Fehlertoleranz und erhöhte Verfügbarkeit: Clientanwendungen werden sowohl in Leader- als auch in Nicht-Leader-Regionen bereitgestellt, um regionale Ausfälle zu tolerieren, während Schreibvorgänge von Nicht-Leader-Regionen initiiert werden.
  • Globale Anwendung: Clientanwendungen werden global mit weit verteilten Regionen bereitgestellt, die Daten festschreiben.

Beschränkungen

Wenn Ihre Clientanwendung außerhalb der Leader-Region bereitgestellt wird und Sie Werte schreiben, ohne die Daten zu lesen („Blind Writes“), kann es bei aktiviertem Leader-Aware Routing zu einer Latenzregression kommen. Wenn das Leader-Aware Routing aktiviert ist, gibt es zwei regionsübergreifende Hin- und Rückflüge (beginTransaction und die commit-Anfrage) zwischen der Clientanwendung in der Nicht-Leader-Region und dem Spanner API-Frontend in der Leader-Region. Wenn das Leader-Aware Routing jedoch deaktiviert ist, erfordern Schreibvorgänge ohne Lesevorgänge nur einen Roundtrip zwischen Regionen für die commit-Anfrage (beginTransaction wird im lokalen Spanner API-Frontend verarbeitet). Wenn Sie beispielsweise Daten im Bulk in eine neu erstellte Tabelle laden, ist es unwahrscheinlich, dass die Transaktionen Daten aus der Tabelle lesen. Wenn Sie häufig Schreibvorgänge ausführen, ohne sie in Ihrer Anwendung zu lesen, sollten Sie das Leader-Aware Routing deaktivieren. Weitere Informationen finden Sie unter Leader-Aware-Routing deaktivieren.

Leader-Aware-Routing verwenden

Leader-fähiges Routing ist in den Spanner-Clientbibliotheken standardmäßig aktiviert.

Wir empfehlen, Ihre Lese-/Schreibanfragen mit aktiviertem Leader-Aware-Routing zu verarbeiten. Sie können sie deaktivieren, um Leistungsunterschiede zu vergleichen.

Leader-basiertes Routing mit Geopartitionierung

Wenn Sie die Geopartitionierung verwenden, um Ihre Datenbank auf mehrere Datenplatzierungen aufzuteilen, wertet Spanner beim Weiterleiten von Anfragen alle Instanzkonfigurationen aus, die von den Platzierungen Ihrer Datenbank verwendet werden, einschließlich der Standardplatzierung. Spanner wählt ein Cloud Spanner API-Frontend aus, das sich in der Platzierungsregion befindet, die dem Client am nächsten ist. Diese Auswahl ist unabhängig davon, ob das Placement oder die zugehörigen Daten in einer bestimmten Transaktion verwendet werden. Spanner leitet Lese-/Schreibtransaktionen so weiter:

  • Bei aktiviertem Leader-Aware Routing: Jede Platzierung hat ihre eigene Leader-Region (oder Standard-Leader-Region für biregionale und multiregionale Konfigurationen). Cloud Spanner leitet Lese-/Schreibtransaktionen an das Cloud Spanner API-Frontend in der Leader-Region weiter, die dem Client am nächsten ist.
  • Bei deaktiviertem Leader-Aware Routing: Spanner leitet Lese-/Schreibtransaktionen an das Cloud Spanner API-Frontend in der nächstgelegenen Bereitstellungsregion über alle Platzierungen Ihrer Datenbank hinweg weiter.

Leader-Aware-Routing aktivieren

Sie können die Spanner-Clientbibliotheken verwenden, um das Leader-Aware Routing manuell zu aktivieren.

C++

Verwenden Sie die Struktur RouteToLeaderOption, um Ihre Clientanwendung mit aktiviertem Leader-Aware 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-Aware 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-Aware 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-Aware 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-Aware 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-Aware 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-Aware 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-Aware 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-Aware-Routing deaktivieren

Sie können die Spanner-Clientbibliotheken verwenden, um das Leader-Aware Routing zu deaktivieren.

C++

Verwenden Sie die Struktur RouteToLeaderOption, um Ihre Clientanwendung mit deaktiviertem Leader-Aware 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-Aware 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-Aware 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 Spanner-Datenbank mit deaktiviertem Leader-Aware-Routing zu erstellen:

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-Aware 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-Aware 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-Aware 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-Aware 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